您的位置:首页 > 理论基础 > 计算机网络

TCP和UDP发送数据包的大小问题

2015-10-07 11:38 609 查看
用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度。用sendto函数发送数据时,如果指的的数据长度大于该值,则函数会返回错误。

用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在
用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,可能会被分段发送,如果比较短,可能会等待和下一次数据一起发送。
我在测试的时候,发现长度一般会被切成16384(16K)或49152(48K),不知道这两个值有什么意义。
比如在send()中设定发送数据的长度为100000,在接收端用recv()函数接收时,接收到的数据长度如下表:

start recvLen: 16384 nu: 0 type: 0
normal recvLen: 16384 nu: 0 type: 0
normal recvLen: 67232 nu: 0 type: 0
-------------------
normal recvLen: 49152 nu: 1 type: 1
normal recvLen: 49152 nu: 0 type: 0
normal recvLen: 1696 nu: -1208847736 type: -1207635502
-------------------
normal recvLen: 49152 nu: 2 type: 1
normal recvLen: 49152 nu: 0 type: 0
normal recvLen: 1696 nu: -1208847736 type: -1207635502
-------------------

从表中可以看出每次发送的100000byte的数据被拆成了3段,这3段长度加起来正好是100000。
经过测试得出如果将send()函数参数中的数据长度设为16384(16K),每次用recv()接收到的长度也为16384,而大于或小于这个值,都会被拆分或合并。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: