一、报文数据格式
?二、二层数据格式
二层以太帧格式
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比特
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的倍数
四、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比发送方和接收方都小,则还是有可能分片的