① 求教UDP协议发送数据包的大小问题
UDP 包的大小就应该是 1492 - IP头(20) - UDP头(8) = 1464(BYTES)
TCP 包的大小就应该是 1492 - IP头(20) - TCP头(20) = 1452(BYTES)
目前大多数的路由设备的MTU都为1500
我对上面的理解是:如果我们定义的TCP和UDP包小于1452,1464,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误。如果使用UDP协议,如果IP层组包发生错误,那么包就会被丢弃,UDP不保证可靠传输。但是TCP发生组包错误时,该包会被重传,保证可靠传输。所以,我们在用Socket编程时,包的大小设定不一定非要小于1400,UDP协议要求包小于64K,TCP没有限定。
总结:
我们设定包的大小对于UDP和TCP协议是不同的,关键是看系统性能和网络性能,网络是状态很好的局域网,那么UDP包分大点,提高系统的性能。不好,就分小于1464,这样可以减低丢包率。对于TCP来说,这个就要靠经验了,因为,TCP丢包可以自动重传,分大了,系统性能提高了,分包和错误重组可能会耗费时间,使传送时间延长,分小了,系统性能又降低了
② 如何设置dgram UDP 的数据包字节数
比如在PHP中可以这样:
fread($socket, 4000) 一次可以完整读取。
nodejs
var udp = dgram.createSocket(“udp4”);
…
udp.on(‘message’, function(data, info) { 接收就分成了2个包:
<Buffer 00 00 00 ff ef 00 00 0
36 62 70 70 00 31 00 5f 5f 73
…>
length: 1400
<Buffer 65 6e 63 ff 00 b5 00 0
68 00 30 00 6d 70 5f 77 69 6e
…>
length: 532
③ 用SOCKET,UDP编程时,要发送的数据放在数组里面进行发送即数组长度可变,请问如何设置接收端数组长度
最好的socket编程方式是在头部前4个字节放整个数据长度,再4个字节消息类型,4个字节列号,==再内容。即是消息头部长度固定,内容部分可变。如果每次发送数据大小超过单次发送量,数据会被分包发送。在接收端还要做组包处理。组包也是根据数据长度去组包。这些是2年电信大数据开发得出的实际经验。
④ 采用UDP方式接收和发送的包的最大长度是多少
传输层:对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515;
对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传
输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需
要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值
确定为这次连接的最大MSS值。
IP层:对于IP协议来说,IP包的大小由MTU决定(IP数据包长度就是MTU-28(包头长度)。 MTU值越大,封包就越大,理论上可增加传送速率,但
MTU值又不能设得太大,因为封包太大,传送时出现错误的机会大增。一般默认的设置,PPPoE连接的最高MTU值是1492, 而以太网
(Ethernet)的最高MTU值则是1500,而在Internet上,默认的MTU大小是576字节
实际UDP的包长度不要超过MTU值,一般不建议超过1K。
参考:https://..com/question/2265686089445142988.html
⑤ UDP协议怎么确定接收消息长短
理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。
去除20字节的IP首部和8个字节的UDP首部, UDP数据报中用户数据的最长长度为65507字节。
所以可以预先开辟一块64k的常驻内存空间,recvfrom每次用该buffer去接收数据,
它的返回值就是接收消息的长度。
请采纳,谢谢。
⑥ UDP编程的时候,一次发送多少bytes好
这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对
像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:
首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.
UDP属于运输层,下面我们由下至上一步一步来看:
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.
这个1500字节被称为链路层的MTU(最大传输单元).
但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区.
并不包括链路层的首部和尾部的18个字节.
所以,事实上,这个1500字节就是网络层IP数据报的长度限制.
因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.
而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.
又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.
这个1472字节就是我们可以使用的字节数。:)
⑦ udp协议如何限制接收数据的大小
对于以太网环境下UDP传输中的数据包长度问题,首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。其中以太网(Ethernet)的数据帧在链路层,IP包在网络层,TCP或UDP包在传输层,TCP或UDP中的数据(Data)在应用层,它们的关系是
数据帧{IP包{TCP或UDP包{Data}}}
在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。我们从下到上分析一下:在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,46+18=64是以太网帧的最短帧长,1500+18=1518是最大帧长。也就是说数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500;
(可是为什么我用wireshark抓下的包看到的帧头部是14字节,木有校验位4位?!,最短帧长是62?!)
在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;所以,在应用层,你的Data最大长度为1472。
(当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃)。从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。
但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。
如何修改本机的MTU修改方法如下:Windows平台下1、运行regedit2、打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces3、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡:A、确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19;B、用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项;C、如果IPAddress的键值与A中的IP相同,即192.168.0.19,则该子项就是要找的网卡。4、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“DWORD 值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口,填入MTU的值(一般为十进制的1480)。填写前请先把基数设为十进制。 设置好后,需要重启机器才能生效。Windows 7(XP、Vista未实测)1、使用管理员权限运行cmd2、使用netsh interface ipv4 show subinterfaces命令看看MTU以及本地连接名称。3、使用netsh interface ipv4 set subinterface "连接名" mtu=300 store=persistent(注:这里的连接名是你使用上面命令看到的MTU值对应的这个连接名,他在右边显示。)附:1、此方法不用重启;2、如是ipv6就将上面的ipv4改成ipv6Linux下可使用如下命令修改 需要root权限ifconfig 网卡 MTU值如 ifconfig eth0 mtu 1460MaxMTU是最大的TCP/IP传输单元,在TCP/IP协议中,将要传输的数据分成较小的组进行传输,每个组的大小为576字节。Windows默认的字节为1500,这是以太网的分组标准。ADSL使用的 PPPoE略小于这个数值,一般为1492。而某些网站采用的MaxMTU大于1492,所以,可能导致某些网页不能访问。修改Windows默认的MaxMTU可以解决这个问题。不论是 PC机上安装的PPPoE软件或者是内置在Modem的 PPPoE软件,在使用中都有可能遇到这个问题。 如果使用路由器出现此种情况, 请在 防火墙配置 => 基本设定 里, 将MTU改为手工, 设置为 1492 即可. 那如何确定路由器从ISP获得的 MTU 为 1500,