码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-10-07 12:12:29      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

用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,而大于或小于这个值,都会被拆分或合并。

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

标签:

原文地址:http://www.cnblogs.com/raichen/p/4858449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!