zoukankan      html  css  js  c++  java
  • TCP和UDP发送数据包的大小问题

    用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,而大于或小于这个值,都会被拆分或合并。
  • 相关阅读:
    How a webpage is loaded and displayed
    Tree知识总结
    Install Cassandra Locally
    axios接口封装
    Jsonp解决跨域问题
    react使用swiper,解决添加点击事件首位图片点击失效,解决轮播按钮被覆盖问题
    vue 生产环境和测试环境的配置
    vue使用远程在线更新代码
    vue.js axios实现跨域http请求接口
    leetcode每日一题(2020-05-27):974. 和可被 K 整除的子数组
  • 原文地址:https://www.cnblogs.com/raichen/p/4858449.html
Copyright © 2011-2022 走看看