IP协议解析及MTU最大传输单元的应用
1. IP协议解析
IP协议是属于网络层协议,IP协议只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。
2. 具体字段的意义及其功能
- 4位协议版本:当前版本默认为4,表示lPv4
- 4位头部长度:以4字节为单位,IP报头固定最小20字节,最大60字节
- 8位服务类型:3位弃用,1位固定0,4位tos字段:最高可靠性,最小成本,最大吞吐量,最小延时
- 16位报文长度:IP报文必须小于64k(tcp报文中数据必须小于64k-40,udp中数据最大小于64k-28)
- 16位分片标识:标识当前分片属于哪一个完整的原始udp报文
- 3位标志位:1位保留,1位禁止分片位,1位分片结尾标志
- 13位分片偏移∶标识当前分片在原始报文中的偏移量位置,其中这里以8字节作为单位
- 13位所能表示的最大数字:0~8191(一个报文若是偏移量在原始报文中是10000字节则无法表示,以8字节位单位进行表示:偏移量若是10000,则分片偏移这里的数据:10000/8)
- 8位TTL:报文的最大生存周期,表示的是一条数据所能经过的路由器跳数(每经过一次路由器转发就会-1,为0时数据被丢弃;早期默认是64;主要是为了防止路由环路,数据在网络中不断循环环路传输)
- 8位上层协议类型:标识当前报文中的数据在传输层所使用的协议;到达对端后,便于上层解析协议的选择
- 16位校验和:校验数据一致性
3. MTU最大传输单元
定义
- 是链路层所限制的一个最大数据帧大小,如果IP报文长度大于MTU则数据需要在网络层进行数据分片,即就是将一个大的报文(大小大于MTU,但是小于64k-40/28)分割成为多个小的报文,逐个封装IP报头进行传输
MTU对TCP/UDP协议的影响
- MTU对于tcp协议的影响: tcp三次握手时候协商的MSS就是根据MTU计算得到的。因为tcp会协商MSS,因此在传输数据的时候总是从发送缓冲区中取出不大于MSS大小的数据进行封装传输,因此通常tcp报文在传输层会自动进行数据分段,因此不会在网络层进行数据分片。
- 对于udp协议,没有MSS的协商,只要数据不大于64k-28就能传输,但是若是数据在网络层封装时大于MTU大小,则会在网络层进行数据分片传输,各个小的数据分片逐个传输到达对端,对端主机在网络层会将所有的小的分片,组装为原始的完整udp报文,但是分片越多,传输越危险(一个分片出错,整个报文都会被丢弃),因此程序员在编写udp通信程序时,就要注意,如果发送的数据过大,则在应用层要进行分包操作,并且分包大小最好能够根据MTU计算得到MSS,作为最大分包大小。
举例说明
假设网卡MTU设置为1500:
- udp在SendTo发送数据时给与数据大于64k-28,则直接报错
- udp在SendTo发送数据时给与数据大于1500字节,小于64k-28,则会在网络层进行数据分片
此时如果要发送的数据大小为5000字节,则会进行分片,MTU大小为1500,其中通常IP报头最小为20字节,UDP报头为8字节,所以第一次分片可传输数据最大为1472字节,从第二次开始没有UDP协议的报头所以之后的分片可传输的数据最大为1480字节。