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,而大于或小于这个值,都会被拆分或合并。
  • 相关阅读:
    .Net平台AOP技术概览
    ARP&ICMP
    .NET面向上下文、AOP架构模式(概述)
    Attribute在拦截机制上的应用
    .NET面向上下文、AOP架构模式(实现)
    使用RequireJS优化Web应用前端
    使用asp.net MVC4创建兼容各种设备显示的web应用程序
    entity framework for asp.net mvc
    jquery多功能软键盘插件
    优美登录页面源码(一)
  • 原文地址:https://www.cnblogs.com/raichen/p/4858449.html
Copyright © 2011-2022 走看看