二三层报头及IP分片详解

一、报文数据格式

二三层报头及IP分片详解_第1张图片

 二、二层数据格式

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

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

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

三、IP报文字段

IP头格式
version Header Lenth type of service                    Total length
Identification  Flags Fragment offset
time to live protocol header    checksum
                                               Source address
                                            Destination address
Options(可变) Padding(可变)

IP头字段解释

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

 IP Flag字段格式

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

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

偏移字节数是该值*8 ,

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

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

常见值:

  • 0: 保留Reserved
  • 1: ICMP, Internet Control Message [RFC792]
  • 6: TCP Transmission Control Protocol [RFC793]
  • 17: UDP User Datagram Protocol [RFC768]
Header Checksum 16比特 首部检验和,只检验数据包的首部,不检验数据部分。
Source Address 32比特 源IP地址。
Destination Address 32比特 目的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的倍数

二三层报头及IP分片详解_第2张图片

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

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

二三层报头及IP分片详解_第3张图片 MTU与MSS的关系

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

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

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

你可能感兴趣的:(网络协议,IP分片)