每个udp包的最大大小是多少?
65507 约等于 64K
为什么最大是65507?
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535
udp包头占8字节, ip包头占20字节, 65535-28 = 65507
如果要发送的udp报文大于65507怎么办?
需要在应用层由开发者自己分片发送. 分片的粒度最大65507字节. 系统的sendto函数是不支持大于65507字节的单包发送的.
UDP包头格式:
socket_sendto return : 65507
will send data len : 65508 ... //=================< 这里报错
65507 约等于 64K
为什么最大是65507?
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535
udp包头占8字节, ip包头占20字节, 65535-28 = 65507
如果要发送的udp报文大于65507怎么办?
需要在应用层由开发者自己分片发送. 分片的粒度最大65507字节. 系统的sendto函数是不支持大于65507字节的单包发送的.
UDP包头格式:
用php测试结果如下, 当大小为65508时报错.
....
socket_sendto return : 65506
socket_sendto return : 65507
will send data len : 65508 ... //=================< 这里报错
PHP Warning: socket_sendto(): unable to write to socket [90]: Message too long in /data/home/nemo/code/test/server_test/udp_client.php on line 25
测试代码:
- <?php
- $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
- $svr_ip = "10.130.2.105";
- $svr_port = 9999;
- // 构造一个70KB长度的字符串
- $msg1 = "0123456789";
- $msg2 = '';
- for ($i=0; $i<1024*7; $i++)
- {
- $msg2 .= $msg1;
- }
- // 从63KB开始尝试发, 看是否发送失败
- $send_len = 63*1024;
- while (1)
- {
- $msg = substr($msg2, 0, $send_len);
- $len = strlen($msg);
- print_r("will send data len : $len ...\n");
- $ret = socket_sendto($sock, $msg, $len, 0, $svr_ip, $svr_port);
- if ($ret == false)
- {
- print_r("$len failed.");
- exit;