当前位置: 技术问答>linux和unix
有关socket通信包大小的问题
来源: 互联网 发布时间:2016-03-03
本文导语: 最近刚接触linux的编程,在pc机上编了两个socket通信的程序做测试,一个采用TCP的方式,另一个采用UDP的方式。不断增大传输数据包的大小,到180k大小时,UDP通信收不到包,阻塞在recvfrom(),而TCP方式仍然能正常工作。...
最近刚接触linux的编程,在pc机上编了两个socket通信的程序做测试,一个采用TCP的方式,另一个采用UDP的方式。不断增大传输数据包的大小,到180k大小时,UDP通信收不到包,阻塞在recvfrom(),而TCP方式仍然能正常工作。包的大小我是10倍递进的,所以临界点应该不是180k,程序代码没什么特别,与书上的示例代码基本相同,只是客户端程序在开始的时候有一段缓冲区的填充过程。
对以上现象希望高手给解释一下,是不是UDP或TCP对包的大小有限制,还是有别的原因?
对以上现象希望高手给解释一下,是不是UDP或TCP对包的大小有限制,还是有别的原因?
|
UDP数据报的最大数据长度为(2^16 - 8)字节.所以180k已经超过了大小限制
是不是由于这个丢弃了数据包?
是不是由于这个丢弃了数据包?
|
我觉得不应该是包太大的缘故,对于你用SOCK_DGRAM创建的socket来发送UDP包,如果发送的数据过大,linux kernel 下面的TCP/IP stack 会重新分成小包发送的,对于应用程序来说,不需要关心数据大小才对。
对于你的应用,UDP是首选。
对于你的应用,UDP是首选。
|
那楼主你就请出tcpdump看看包发出去没有啊,发的什么啊?
|
最近刚接触linux的编程,在pc机上编了两个socket通信的程序做测试,一个采用TCP的方式,另一个采用UDP的方式。不断增大传输数据包的大小,到180k大小时,UDP通信收不到包,阻塞在recvfrom(),而TCP方式仍然能正常工作。包的大小我是10倍递进的,所以临界点应该不是 180k,程序代码没什么特别,与书上的示例代码基本相同,只是客户端程序在开始的时候有一段缓冲区的填充过程。
===================================
消息的尺寸有限制:理论上UDP数据报的最大尺寸略小于64KB,但实际上许多UNIX主机只提供32KB的最大尺寸,有的甚至只有8KB,最终套接口接收程序还会把这个最大尺寸限制为接收缓冲区的大小,许多程序UDP消息尺寸只有512B或更小.
===================================
消息的尺寸有限制:理论上UDP数据报的最大尺寸略小于64KB,但实际上许多UNIX主机只提供32KB的最大尺寸,有的甚至只有8KB,最终套接口接收程序还会把这个最大尺寸限制为接收缓冲区的大小,许多程序UDP消息尺寸只有512B或更小.