UDP报文大小
0-16 | 17-32 |
---|---|
源端口 | 目的端口 |
长度 | 校验值 |
- 在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾),即MTU(Maximum Transmission Unit)为1500;
- 在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
- 在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;(UDP用户数据报的长度,其最小值是8)
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。
UDP校验和
对整个首部中的每个16 bit进行二进制反码求和(=求和反码)。无差错时其结果为全1(发送报文时的计算校验记为0).否则出现差错丢弃。
UDP伪首部
0-16 | 17-32 |
---|---|
目的IP地址 | - |
源IP地址 | - |
-8位协议 | 长度 |
-以上为伪首部- | - |
源端口 | 目的端口 |
长度 | 校验值 |
UDP数据报需包含一个12字节长的伪首部。将虚头部加入校验的目的,是为了再次核对数据报是否到达正确的目的地,并防止IP欺骗攻击。
注意此时报文中的Len = 数据长度 + 8,不包含伪头部的大小,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。