UDP包的最大大小是多少?
2014-07-28 12:15
435 查看
每个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
plaincopy
<?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;
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
plaincopy
<?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;
相关文章推荐
- UDP包的最大大小是多少?
- UDP包的最大大小是多少?
- TCP 、UDP、IP包的最大长度是多少?
- 获取linux下,tcp、udp的系统默认缓存大小和最大值
- [基础] UDP数据包大小一般为多少?什么是碎片包?
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- [转]【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
- 用实际程序来测试udp sendto函数的最大发包大小------为什么是65507?
- LINUX2.6内核中用户空间向驱动程序传递的内存大小最大为多少?
- TCP 、UDP、IP包的最大长度是多少?
- TCP 、UDP、IP包的最大长度是多少?
- TCP 、UDP、IP包的最大长度是多少?
- TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
- 【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
- TCP 、UDP、IP包的最大长度是多少
- UDP中一个包的大小最大能多大
- TCP 、UDP包的最大长度是多少?
- 一个进程能用的最大内存(堆区)空间大小为1G
- Oracle数据库表名支持的最大长度是多少
- 有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。 给定数组A及它的大小n,请返回最大差值。 测试样例: [10,5],2 返回:0