链路层主要目的
TCP/IP支持多种链路层协议,不同的网络硬件设备使用不同链路层协议,如:以太网协议、令牌环、FDDI和PPP等。链路层主要有三个目的:
- 为IP模块发送和接受IP数据报
- 为ARP模块发送ARP请求和接受ARP应答
- 为RARP模块发送RARP请求和接受RARP应答
以太网
以太网是目前TCP/IP在局域网中最主要的技术,采用CSMA/CD(带冲突检测的载波侦听多路接入)接入方法,地址为48bit(既MAC地址)。然而以太网是几家公司联合发布的一个技术标准,后来IEEE发布802标准(802.3针对CSMA/CD网络)。但实际上目前局域网中绝大多数都是以太网包,802.3的包有使用但极少。以太网帧结构和802.3帧结构是完全不同的,以下我主要记录以太网包相关的内容。
###以太网帧结构
以太网规定以太网帧中的数据
长度在46~1500
字节之间。最小不少于46字节,不足46字节的必须加入填充(PAD)字节;最大不得超过1500字节(1500既MTU)。所以一个正常的以太网帧长度应该在64~1518字节之间,由帧头部+数据+帧尾校验
组成1
| 目的地址(6) | 源地址(6) | 类型(2) | 数据(46~1500) | CRC(4) |
###以太网帧中的类型字段
在以太网帧结构中有2字节的类型
字段,其主要目的是为了标识上层协议类型。常见的有以下三种类型,更详细的类型参见这里
IP协议——0x0800
IP数据报在以太网帧中的类型字段以0x0800
表示,数据部分大小依旧是46~1500
字节1
| 目的地址(6) | 源地址(6) | 0x0800 | 数据(46~1500) | CRC(4) |
ARP协议——0x0806
ARP的请求或应答包在以太网帧中的类型字段以0x0806
表示,但数据部分ARP包只有28字节,不满足以太网规定的最小46字节,所以ARP包的数据部分会有18字节的PAD填充字节1
| 目的地址(6) | 源地址(6) | 0x0806 | ARP请求/应答数据(28) + PAD填充字节(18) | CRC(4) |
RARP协议——0x0835
RARP和ARP差不多,数据部分也只有28字节,需要填充18字节
环回接口(loopback)
通常我们会把127.0.0.1
分配给环回接口并命名为localhost
,传给环回接口的IP包不能出现在任何网络上。环回接口是个比较特殊的接口,此接口会有些有趣或特殊的应用,比如LVS的DR模式中会将VIP配置在RealServer的lo:0环回设备上。
以下三种情况环回接口处理数据包时,数据包直接经过环回接口驱动程序传入上层,数据包并没有经过网卡输出到以太网后再返回。所以当我们ping 127.0.0.1或本机IP地址时,数据包是直接通过环回驱动程序再回到上层。
- 目的IP为环回接口地址。IP输出函数——>环回驱动程序——>IP输入函数
- 目的IP为广播或多播地址。
- 目的IP为本机接口IP地址。
除以上三种情况外的目的IP数据包会通过ARP协议找到目的IP的MAC地址后进行发送到以太网
最大传输单元MTU、路径MTU
数据帧中可容最大数据长度称为MTU,在不同帧结构中MTU是不同的,以太网的MTU是1500字节
。我们可以通过netstat -in
命令查看MTU信息
当网络上两台主机通信时,会经过路由选路确定一条路径,在这条路径上可能会有不同的网络或设备的MTU。所谓的路径MTU则是在这条路径中最小的MTU。两台主机间的路径MTU并不一定是固定的,因为路径MTU取决于所选路径。
由于链路层有MTU限制,所以当IP层要传的数据包大于MTU时,网络层则需要进行IP分片,而且由于路径上的MTU可能会不同,所以数据包可能会被进行多次分片。有关IP分片的详细内容会在网络层做详细介绍。
大于MTU的包会有两种处理方式:
- 直接丢弃。丢弃后会发送ICMP报文告诉源端包太大并通告自身的MTU
- 重新分块后再发送