这是我在csdn blog 上写的第一篇文章,所以就从自己最喜欢的 tcp/ip 开始吧!
如何理解tcp/ip呢?
从我个人的理解看,应该是这样:
1:地址:软件地址,如ip地址;硬件地址,如MAC。
地址在tcp/ip中的作用就像:小王要到小李家吃饭,小王要知道小李的家庭住址才能吃到饭啊是不是?在tcp/ip的最底端是“物理的”地址,硬件地址提供了最起码的通信基础;光有硬件地址是不够的,功能受限制。所以就有了与硬件地址对应(并非一一对应)的软件地址:ip地址。有了硬件和软件两个地址,通信功能就比较大了。在tcp/ip最下两层:链路层和ip层函数主要就是围绕如何处理地址间的关系展开的。
2:路由:路由其实更应该叫寻址。
路由分链路层级(硬件地址),和ip层级(软件地址)。举个例子:当一个内网局域网的主机A要发送报文到外网C时,首先要寻找外网C的ip级路由,查询本机路由表(ip级),得知需要把报文发往内网的路由器B的ip后,根据ip查找路由器B的硬件地址,这时就用到了链路级路由,如果查询本机A(链路级)路由表未查到B的硬件地址的话,就会向本局域网发送一个ARP广播报文,路由器B收到ARP广播了,就会回复一个带有自己ip,mac地址数据的ARP回复报文,A收到回复报文后就会把B的ip,mac 都存入本机的路由表中。然后根据这个路由发送数据到B,由B转发到外网。
3:内存:内核级,应用级。tcp/ip是要为应用层的通信服务的。
一:在一般情况下,一个应用程序在客户进程构造好自己的数据,然后通过一个内存处理函数,把数据拷贝到内核内存,这样数据报文就交给内核进程tcp/ip处理了,tcp/ip“从上至下”从传输层,ip层,链路层,逐层处理直至硬件发送出去。
二:上面是一般的情况,如果不想走一般路线的话,可以在tcp/ip链路层加一个hook,从应用层把数据拷贝到内核,但是直接走链路层函数处理发送报文。sniffer就利用了这个原理。