一、报文数据格式
文章图片
二、二层数据格式
DMAC(6字节) | SMAC(6字节) | type(4字节) | DATA(46-1500字节) | CRC(4字节) |
字段 | 长度 | 含义 |
---|---|---|
DMAC | 6字节 | 目的MAC地址,IPV4为6字节,该字段确定帧的接收者。 |
SMAC | 6字节 | 源MAC地址,IPV4为6字节,该字段标识发送帧的工作站。 |
Type | 2字节 | 协议类型。下表列出了链路直接封装的协议。 0x0800IP协议 |
Data | 变长 | 数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段。如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。 |
CRC | 4字节 | 用于帧内后续字节差错的循环冗余检验(也称为FCS或帧检验序列)。 |
version | Header Lenth | type of service | Total length | |
Identification | Flags | Fragment offset | ||
time to live | protocol | headerchecksum | ||
Source address | ||||
Destination address | ||||
Options(可变) | Padding(可变) |
字段 | 长度 | 含义 |
---|---|---|
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字段格式 文章图片
|
Fragment Offset | 13比特 | 片偏移:分片重组时会用到该字段。表示较长的分组在分片后,某片在原分组中的相对位置。以8个字节为偏移单位,也就是分片长度必须是8的倍数 偏移字节数是该值*8 , |
Time to Live | 8比特 | 生存时间:可经过的最多路由数,即数据包在网络中可通过的路由器数的最大值。一般是128 |
Protocol | 8比特 | 协议:下一层协议。指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理。 常见值:
|
Header Checksum | 16比特 | 首部检验和,只检验数据包的首部,不检验数据部分。 |
Source Address | 32比特 | 源IP地址。 |
Destination Address | 32比特 | 目的IP地址。 |
Options | 可变 | 选项字段,用来支持排错,测量以及安全等措施,内容丰富。选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。 |
Padding | 可变 | 填充字段,全填0。 |
如果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比发送方和接收方都小,则还是有可能分片的
【网络协议|二三层报头及IP分片详解】
推荐阅读
- http|常见的HTTP状态码都有哪些()
- 路由认证|路由认证实验(22/3/6)(修订4)
- Python|python实现UDP
- 计算机四大基础课|计算机网络——自顶向下
- 计算机网络|TCP的报文详细解读
- 笔记|计算机网络自顶向下 —— 阅读笔记
- Linux从系统到网络|socket(套接字)实现udp通信
- p2p|JAVA学习(语言基础第一天)
- 计算机网络|搭建局域网&&文件传输