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,而大于或小于这个值,都会被拆分或合并。
用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,而大于或小于这个值,都会被拆分或合并。
相关文章推荐
- 【HTTP】Web服务器工作流程小结--从建立连接到日志记录
- 计算机网络部分的面试常考点
- Swift - 网络请求报App Transport Security has blocked a cleartext错
- TCP性能的考虑
- TCP WRAPPERS、denyhosts软件的安装和配置、PAM身份认证模块应用
- SDN,网络
- Android加载网络图片学习过程
- UI高级第五课 网络通信——iOS学习连载33
- android开发--获取网络图片,读取进度条
- Java笔记---网络编程
- windows下 Sparse Bundle Adjustment 编译问题--FUIMCAT的文章--CFANZ社区--IT技术分享网站 http://www.cfanz.cn/?c=article
- 浅谈HTTP中Get与Post的区别
- RTP、RTCP及媒体流同步
- tcp协议中的三次握手和四次挥手
- TCP/IP协议三次握手与四次握手流程解析
- PHP http_build_query()方法
- http://blog.sina.com.cn/s/blog_7caae74b0100zl17.html
- android监听网络状态,实时更新网络状态
- [HTTP那些事]网络请求API
- [HTTP那些事]网络请求API