<tcp/ip详解卷一>阅读笔记(1)— 以太网帧及其分用

这段日子看了《Tcp/ip详解》的卷一, 这本书最大的特点在于通过使用tcpdump程序捕获各种网络包,从而让我们确切的了解网络各个层中的协议以及算法。下图是这本书中讲讨论到的协议以及其所在的层次。

1. tcp/ip协议网络层次结构

 

上图左侧是数据包在各个网络层的状态,右侧是数据包在各个网络层的传递。其中,以太网口通过以太网地址来决定丢弃还是交付通过以太网口的数据包(此时称为以太网帧);以太网驱动程序通过检验和来决定将其丢弃还是交付给上一层;接着,驱动程序通过以太网首部中的“类型”字段对以太网帧进行分用,确定这是一个ip数据报,还是一个ARP/RARP请求/应答;如果是后者,则通过协议进行应答;如果是ip数据报,则脱去帧头帧尾,将其交付到Ip层。IP层首先进行检验和计算以决定交付还是丢弃报文,然后通过ip首部中的“协议”字段确定其是UDP数据报、TCP段还是ICMP、IGMP报文,从而对IP数据报进行分用。如果是ICMP或IGMP,则根据协议对其进行处理,如果是TCP或UDP,则去其头部,将其交付到运输层;TCP/UDP则是通过端口号将数据分用到对该端口进行监听的应用程序。除了上图中提到的协议,《TCP/IP详解(卷1)》这本书里还提到了DNS、IP选路中用到的一些协议。IP协议本身提供不可靠的服务,但是建立在IP层上的TCP协议却提供了可靠的服务,这里面就涉及到了很多控制算法,TCP协议是这本书里讲得最复杂,也是最详细的一个协议,总共用了8(17~24章)个章节来介绍其中用到的各种算法。

2. 以太网帧

 下图是以太网帧的封装格式。其中的“类型”字段正是用于IP数据报、ARP报文和RARP报文的分用。


可以看到,每个以太网帧有最小长度和最大长度,最小长度为64字节,是为了检测冲突;最大长度是1518,最大传输单元MTU为1500字节。

3.IP协议

IP提供不可靠、无连接的数据报传送服务。不可靠是指它不能保证IP数据报能成功地到达目的地,如果发生某种错误时(如路由器暂时用完了缓冲区),IP有一个简单的处理算法:丢弃该数据报,然后发送ICMP消息给信源端。无连接的意思是,IP数据报不维护任务关于后续数据报的状态信息,每个数据报的处理是相互独立的。首先看一下IP数据报的格式:



4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后是16~23bit,最后是24~31bit。这种传输次序称作big endian字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。以其他形式存储二进制整数的机器,如little endian格式,必须在传输数据之前把首部转换成网络字节序。

IPv4协议的版本号是4,首部长度字段指的是首部占32bit字的数目,因此首部的最大长度为(2^4-1)*4字节。

TOS字段包括一个3bit的优先权子字段(现在已经被忽略),4bit的TOS子字段和1bit未被使用但必须置0,4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小费用,4位中只能有1bit置1,如果所有4bit均为0,则意味着是一般服务。

总长度字段是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节。总长度字段是IP首部中必要的内容,因为一些数据链路需要填充一些数据以达到最小长度。

标识字段唯一地标识主机发送的每一份数据报,通常每发送一份报文它的值就会加1.

TTL生存时间字段设置了数据报可以经过的最多路由器数,每经过一个处理它的路由器,它的值就减1.当该字段为0时,数据报就被丢弃,并发发送ICMP报文通知源主机。在traceroute程序中,它就是利用这种特性,从TTL设为1然后发送出去开始,逐步得到数据报从源地址到目的地址通过的路由器。

协议字段即IP数据报进行分用的字段,在第一幅图中可以看到。

首部检验和字段是根据IP首部计算的检验和码,它不对首部后面的数据进行计算,ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的IP检验和,首先把检验和字段置为0,然后对首部中每16bit进行二进制反码求和。二进制反码求和要注意的是,如果最高位有进位,应该在最低位加1.如下:



 

具体可以参看谢希仁的《计算机网络》。

三位标志的第一位是空的,第二位是DF位,如果置为1,则表示该数据报“不分段”,MF位如果为1,表示还有“更多的数据”,只有最后一片的时候不需要置这一位,13位的“片偏移”字段指明了该分段在当前数据报中的什么位置上,它的基本单位是8字节,也就是说,分段的时候必须是8字节的位数。

IP头部的最后一个字段是任选项,是数据报中一个可变长的可选信息,这些可选信息包括:

1. 安全和处理限制(用于军事领域)

2. 记录路径(让每个路由器都记下它的IP地址)

3. 时间戳(记每个路由器都记下它的IP地址和时间)

4. 宽松的源站选路

5. 严格的源站选路。

4.IP路由选择

接下来是IP的路由选择,路由器与主机的本质区别在于,主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据。IP可以从TCP、UDP、ICMP、IGMP接口数据报(即本地待发送的数据),也可以从一个网络接口接收数据报。IP层在内存中有一个路由表,当收到一份数据报并进行发送时,它都要对该表搜索一次。当数据报来自某个网络接口时,IP首先检查目的目的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么(1)主机将丢弃报文;(2)路由器对数据报进行转发。

路由表中的每一项包括:(通过netstat -rn可以查到该路由表)

(1) 目的IP地址,它既可以是一个完整的主机地址,也可以是一个网络地址,主机地址有一个非0的主机号,以指定某一特定的主机,而网络地址中的主机号为0,以指定网络中的主机。

(2)下一跳路由器的ip地址,或者有直接连接的网络IP地址。

(3)标志。其中一个标志指明目的IP地址是网络地址还是主机地址,另一个标志指明下一站路由是路由器还是一个直接相连的接口。总共有五种不同的标志:U(该路由可用)、G(该路由是到一个网关)、H(该路由是到一个主机)、D(该路由是由重写向报文创建的)、M(该路由已被重定向报文修改)。

IP路由选择主要完成以下这些功能:

(1)搜索路由表,寻找能与目的IP地址完全匹配的表目,如果找到,就把报文发往该地址;

(2)搜索路由表,寻找能与目的网络号相匹配的表目,如果找到,则把报文发送给该表目指定的下一站路由器直接连接的网络接口;

(3)搜索路由表,寻找标为“默认”的表目,如果找到,把报文发送给该表目指定的下一站路由器。

如果上面这些步骤都没有成功,那么该数据报就不能被发送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

5. ARP协议

当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48bit以太网地址来确定目的接口的。设备驱动程序从不检查IP数据报中的目的IP地址。ARP(地址解析协议)和RARP(逆地址解析协议)为IP地址到对应的硬件地址之间提供动态映射。RARP是被那些没有磁盘驱动器的系统使用的,似乎不需要关心太多。ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存,这个高速缓存存放了最近IP地址到硬件地址之间的映射记录。高速缓存中的每一项的生存时间为20分钟,开始时间从被创建时开始算起。可以使用(arp -a)来检查ARP高速缓存。

下图是ARP的分组格式

 

 
op字段指出四种操作类型,它们是ARP请求(值为1),ARP应答(值为2)、RARP请求(值3)、RARP应答(值为4)。对于arp请求来说,除目的端硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本机的arp请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2.

对于arp请求,其以太网帧首部中的硬件地址为全1,代表广播,请求主机向它所在的网络广播一份arp请求,意思是说,“如果你是这个ip地址的拥有者,请回答你的硬件地址”。假如查询的主机已经关机或者不存在,通过tcpdump的输出可以看到,主机经过5.5秒又发了一次,然后再过24秒再发送一次,也就是,超时限制为29.5秒。如果用arp -a查看arp缓存,可以看到与该ip地址对应的mac地址栏写的是(incomplete),前面提到对于完整的表项设置超时值为20分钟,而对不完整的表项,则其超时时间为3分钟。

如果arp请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称作arp代理。(这一部分我其实不是很明白,不是链路层的广播路由器不会转播吗?)

arp请求还有另外一个特性叫免费arp,它是指主机发送arp查找自己的ip地址。它有两个方面的作用:

(1)一个主机可以通过它来确定另一个主机是否设置了相同的ip地址。发送免费arp的主机并不希望对此请求有一个回答,可是如果收到一个回答,说明网络存在ip冲突。

(2)如果发送免费arp的主机正好改变了硬件地址,那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的更新。这是基于一个arp协议事实:如果主机收到某个ip地址的arp请求,而且它已经在接收者的高速缓存,那么就要用arp请求中的发送端硬件地址对高速缓存中相应的内容进行更新。主机接收到任何arp请求都要完成这个操作。

下面是一些arp命令:

arp -a 列出主机中arp高速缓存的所有记录。

arp -d 删除arp高速缓存中的某一项内容(超级用户权限)(貌似删了之后,该主机的记录还在,但是它的mac地址项被设成incomplete)。

arp -s 增加高速缓存中的内容,而且新增加的内容是永久性的,除非在命令行的末尾附上关键字temp.

这一次主要总结了tcp/ip协议的整体框架,并总结了由以太网帧(数据链路帧)以及根据其“类型”分用的几种协议:ip、arp、rarp,rarp因为不怎么用,所以没有做介绍。其实那本书也只是用了两页做简单的介绍而已。

猜你喜欢

转载自philoscience.iteye.com/blog/1287309