UDP包的最大大小是多少?

每个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包头格式:



用php测试结果如下, 当大小为65508时报错.

....
socket_sendto return : 65506

will send data len : 65507 ...
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]  view plain copy
  1. <?php  
  2. $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);  
  3.   
  4. $svr_ip = "10.130.2.105";  
  5. $svr_port = 9999;   
  6.   
  7. // 构造一个70KB长度的字符串  
  8. $msg1 = "0123456789";  
  9. $msg2 = '';  
  10. for ($i=0; $i<1024*7; $i++)  
  11. {  
  12.     $msg2 .= $msg1;  
  13. }  
  14.   
  15. // 从63KB开始尝试发, 看是否发送失败  
  16. $send_len = 63*1024;  
  17. while (1)  
  18. {  
  19.     $msg = substr($msg2, 0, $send_len);  
  20.     $len = strlen($msg);  
  21.   
  22.     print_r("will send data len : $len ...\n");  
  23.   
  24.     $ret = socket_sendto($sock$msg$len, 0, $svr_ip$svr_port);  
  25.     if ($ret == false)  
  26.     {  
  27.         print_r("$len failed.");  
  28.         exit;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值