链路层作用
链路层主要有三个作用:(1)为I P模块发送和接收I P数据报;(2)为A R P模块发送 A R P请求和接收 A R P应答;(3)为R A R P发送R A R P请求和接收R A R P应答。
总结为一句话:为上层协议提供服务。
注:虽然ARP/RARP在功能上划分为链路层,但在实现上,其与IP层同一级别。
链路层数据抓包
Wireshark抓的以太网帧中,帧头14个字节,其中源目地址(MAC地址)各6字节,还有一个2字节的类型字段(用来标识上层协议IP/ARP/RARP),没有帧尾,这是因为以太网帧没有采用尾部封装。
注意:
以太网帧头中,源目MAC地址一定是网络路径中相邻的两个硬件地址,而不是网络数据包最初的源目IP地址对应的MAC。
另外,这里的目的MAC还可能是广播地址,即6个字节中所有位都为1.
IP数据包的处理过程
该图解释了IP数据包的处理过程。
处理过程(图中标号1,2,3,4):
1. 环回地址
如果数据包中目的地址是环回地址(127.x.x.x),流程为 IP输出函数 –> 放入IP输入队列中
注: 127.x.x.x 都是环回测试地址。 Ping该网段的时候,用wireshark抓不到,因为处理流程未经过网卡驱动,而是由TCPIP协议栈直接处理了。
另外,192.168.1.101(本机IP),ping本机IP的时候,用wireshark也抓不到。
2. 非环回地址
判断目的地址是否是多播或广播地址,如果是,就把数据拷一份送入IP输入队列中(本机也是多播或广播的接收地址之一,因此拷一份给自己),然后把数据发到网络中;
如果不是,接着判断目的地址与本地IP是否相同,如果相同,将数据放入IP输入队列中;如果不同,将数据发送到网络中;
注意:“目的IP地址是否与广播地址或多播地址相同?”,是的分支(向左),然后又分出了两个箭头,一个继续向左(即自身地址也属于是广播或多播地址的范围,拷贝一个份数据给自己),还有一个向下的分支即发送到以太网上;这里这个向下的分支写的过于笼统,其发送流程仍然是查询ARP表,组装数据包并发送出去。(注:广播和组播地址对应的MAC地址,可以计算出来(组播地址一定是根据组播号来计算出MAC地址的,参考第十二章广播与多播),因此不查找ARP表也是可以的)只是这时的ARP表如下:
注意到上面的广播和组播地址对应的MAC都是固定的,且全为f。因此,这时不需要再用ARP协议查询目的地址(广播或多播地址)对应的MAC,而是直接组包发送了。
3. 从网络中接收到的数据包
从网络中接收到的IP数据包,也放入到IP输入队列中。
4. 将数据包递交给上层应用
注意:
(1). 红框中的两个“IP输入队列”指的是同一个队列,这里为了画图需要,画做了两个。
(2). IP输入队列中的数据,可以认为都是接收到的数据。对于上述1,2中,数据是在发送时,判断出该数据应该投递是目的地址(或目的地址之一)的本机;3中,从网络上接收而来,本机是目的地址。因此,应当认为IP输入队列中的数据,都是接收到的数据,即将被提交给上层协议。
MTU及路径MTU
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500(46~1500)和1492字节。链路层的这个特性称作MTU,最大传输单元。不同类型的网络大多数都有一个上限。(注:MTU是链路层的特性,由链路层物理性质决定,和上层无关。)如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。两台通信主机路径中的最小MTU。它被称作路径MTU。
两台主机之间的路径MTU不一定是个常数,它取决于当时所选择的路由。而选路不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此路径MTU在两个方向上不一定是一致的。
路径MTU的发现机制
当路由器收到一份需要分片的数据报,而在IP首部又设置了不可分片(DF)的标志位时,则会产生ICMP不可达差错。(注:产生ICMP不可达差错可能有3种情况,TTL为0,端口不可达,以及IP需要分片但又设置了不允许标志。)这种情况下的ICMP不可达差错报文可以提供下一站的MTU。如果路由器没有提供这种新的ICMP差错报文格式,那么下一站的MTU就设为0。尽管大多数的系统不支持路径MTU发现功能,但可以很容易地修改traceroute程序,用它来确定路径MTU。要做的是发送分组,并设置“不可分片”标志比特。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时就减小分组的长度。如果路由器发送的ICMP差错报文是新格式,包含出口的MTU,那么就用该MTU值来发送,否则就用下一个最小的MTU值来发送。正如RFC1191[Mogul and Deering 1990]声明的那样,MTU值的个数是有限的,因此在我们的程序中有一些由近似值构成的表,取下一个最小MTU值来发送。