TCP/IP详解卷1 读书笔记:第二章 链路层

来源:互联网 发布:遭遇网络来分期诈骗 编辑:程序博客网 时间:2024/06/05 01:20


链路层作用

链路层主要有三个作用:(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值来发送。


0 0