UDP报文结构

0...1516...31
Source PortDestination Posr
LengthCheckSum
Data octets(payload...)

如表格所示,UDP包头共有8个字节,除却源端口以及目标端口,这里的长度Length占两个字节,即理论上UDP单个报文的最大长度为2^16-1 = 65535,实际上如果你在Python中构造65535的数据包会提示Message too long

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
payload= random_string(65535)
sock.sendto(payload.encode(), (IP, PORT))

因为IPv4包头同样也有占两个字节的Total Length,包括header+data,即IP包大小范围在20<size<65535,那UDP整体数据荷载为65535(entire IPv4 packet size)-20(IP Header)-8(UDP Header)=65507

Tips:

  • 互联网中的所有设备必须能支持最大不超过576字节的数据包. 512(payload)+20(Fixed Header)+40(Option Header)+4=576
  • 那IPv4发包是不是越大越好呢?
  • JumboFrame
    • 需要交换机等网络设备支持
    • 设置本机MTU=9000