二三层报头及IP分片详解

一、报文数据格式

 二、二层数据格式

二层以太帧格式
DMAC(6字节)SMAC(6字节)type(2字节)DATA(46-1500字节)CRC(4字节)
字段长度含义
DMAC6字节目的MAC地址,IPV4为6字节,该字段确定帧的接收者。
SMAC6字节源MAC地址,IPV4为6字节,该字段标识发送帧的工作站。
Type2字节协议类型。下表列出了链路直接封装的协议。
0x0800  IPv4协议
Data变长

数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段。如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。数据字段的最大长度为1500字节。

CRC4字节用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。

三、IP报文字段

IP头格式
versionHeader Lenthtype of service                   Total length
Identification FlagsFragment offset
time to liveprotocolheader    checksum
                                               Source address
                                            Destination address
Options(可变)Padding(可变)

IP头字段解释

字段长度含义
Version4比特
  • 4:表示为IPV4;
  • 6:表示为IPV6。
Header Lenth4比特首部长度,如果不带Option字段,则为20,最长为60,该值限制了记录路由选项。以4字节为一个单位。
Type of Service8比特服务类型。只有在有QoS差分服务要求时这个字段才起作用。
(不重要 一般都是0)
Total Length16比特总长度,整个IP数据报的长度,包括首部和数据之和,单位为字节,最长65535,总长度必须不超过最大传输单元MTU。
Identification16比特标识,主机每发一个报文,加1,分片重组时会用到该字段。(Identification相同的代表是同一个包的分片)
Flags3比特标志位:

 IP Flag字段格式

  • Bit 0: 保留位,必须为0。
  • Bit 1: DF(Don't Fragment),能否分片位,0表示可以分片,1表示不能分片。
  • Bit 2: MF(More Fragment),表示是否该报文为最后一片,0表示最后一片,1代表后面还有。
Fragment Offset13比特

片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位,也就是分片长度必须是8的倍数

偏移字节数是该值*8 ,

Time to Live8比特生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。一般是128
Protocol8比特

协议:下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。

常见值:

  • 0: 保留Reserved
  • 1: ICMP, Internet Control Message [RFC792]
  • 6: TCP Transmission Control Protocol [RFC793]
  • 17: UDP User Datagram Protocol [RFC768]
Header Checksum16比特首部检验和,只检验数据包的首部,不检验数据部分。
Source Address32比特源IP地址。
Destination Address32比特目的IP地址。
Options可变选项字段,用来支持排错,测量以及安全等措施,内容丰富。选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。
Padding可变填充字段,全填0。

 二、IP分片产生原因

数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1514字节,其中以太网数据帧(二层)的帧头为14字节。

如果IP层有数据包要传,而且数据包的长度(包括IP头)超过了MTU,那么IP层就要对数据包进行分片操作,使每一片的长度都小于或等于MTU。

三、IP分片原理

IP分片发生在IP层(三层),不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据包再次进行分片。而分片数据的重组只会发生在目的端的IP层。 

UDP和ICMP不会像TCP那样自己分段,如果组成的 IP数据报长度超过了MTU大小,那么IP数据报显然就要进行分片。(TCP会自己分段所以一般不会产生IP分片,如果TCP不分段而交由IP层分片,则原理一样)

UDP和ICMP认为网络层可以传输无限长(实际上有65535的限制)的数据,当这两种协议发送数据时,它们不考虑数据长度,仅在其头部添加UDP或ICMP首部,然后直接交给网络层。接着网络层IP协议会对数据进行分片,它会直接将整个的上层数据切成N个分片,这样做的结果是,只有最后一个分片具有UDP或者ICMP首部,而其它分片则没有。

一般MTU为1500,IP首部为20字节,UDP或ICMP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据静荷载部分大于1472字节,就会出现分片现象。 

下图为MTU设置为100时,IP分片情况:

可以看到IPv4报文长度为114=mtu(100)+14字节的二层以太网长度

mtu(100)-IP头部(20)= IP最大负载长度(80),所以可以看到offset偏移量为80的倍数

四、tcp分段与IP分片(MSS和MTU) 

MSS=MTU-IP头部长度-TCP头部长度,所以一般MTU为1500时,可以看到MSS为1460

MTU与MSS的关系

为什么说tcp一般不会产生分片呢?

Tcp建立连接的时候,必须进行三次握手,在前两个握手包中,双方互相声明了自己的MSS。经过握手后,彼此知道自己的MSS,这个协商就是用来自动调整从而适配MTU的。如一个IP包最多可以携带1500-20=1480字节的数据,再减去TCP头部20字节。当要传输的数据块大于1460字节时,TCP层就会把它分段,封装成多个网络包。这样,数据经过本地 TCP 层分段后,交给本地 IP 层,在本地 IP 层就不需要分片了。

但如果网络上有交换机之类的MTU比发送方和接收方都小,则还是有可能分片的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值