zoukankan      html  css  js  c++  java
  • unix udp sendto 最大可发送的数据长度

    sendto 的最大可发送数据长度受限于两个值。

    第一 【2^16 -1 - 8 -20】 

    第二 【SO_SNDBUF】

    解释受限于【2^16-1-8-20】

    数据封装过程

    第一步: 用户层 : user数据

    第二步: udp层数据: udp首部(8) + user数据

    第三步: 

                  ip层数据报文: ip首部(20) + udp首部(8) + user 数据

                  因为,ip首部中用于表示ip数据报文段的长度为16bit,所有ip最大可封装的数据长度为【2^16-1-20】

                  所以user数据的最大长度为【2^16-1-20-8】.

                  注意引起ip分片是因为ip数据报文段>MTU(受限于链路层最大传输长度)。

                  而不是上层数据[udp首部+user数据]>[2^16-1-20],如果上层数据大于[2^16-1-20],将向上层返回错误。

                  ip层的处理情况可以这样理解: 

                  1 将上层数据封装成一个ip数据报文,如果数据报文的数据部分大于【2^16-1-20】,返回错误

                  2 如果ip数据报文段大于MTU,则将该ip数据报文段进行分片处理,分成多个ip数据报文段

    所以, 当sendto数据超过【2^16-1-20-8】时,系统会返回 Message too long 错误。

    受限于【SO_SNDBUF】情况

    可参看http://blog.chinaunix.net/uid-20662820-id-3600294.html

    SO_SNDBUF 可由getsockopt 查看,可由setsockopt 设置

    SO_SNDBUF 的取值规则可参看 http://blog.csdn.net/ziliangxiao/article/category/2210813

    SO_SNDBUF 规定了ip层用于发送udp数据最大可分配空间的长度为Max_mem_alloc,一般Max_mem_alloc>=SO_SNDBUF

    规则参看http://blog.chinaunix.net/uid-20662820-id-3600294.html

    简而言之,ip层分配用于发送的报文段时,会查看已分配size_alloc的大小是否大于SO_SNDBUF

                     如果size_alloc大于等于SO_SNDBUF,则分配失败,即该udp数据报文发送失败No buffer space available

                     如果size_alloc小于SO_SNDBUF, 则分配成功成功

                     所以,有可能最后一次分配完时,已分配的size_alloc 会大于SO_SNDBUF

    关键在于理解,每次分配是否成功取决于是否还有剩下的,而不在与剩下的够不够分配,

                  
    ————————————————
    版权声明:本文为CSDN博主「一人在人间」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ziliangxiao/article/details/24294991

  • 相关阅读:
    500. 键盘行
    657. 判断路线成圈
    771. 宝石与石头
    461. 汉明距离
    Java 基本数据类型
    Windows下的DOM操作
    jQuery学习笔记
    Java(16-19)
    Java(1-15)
    总结
  • 原文地址:https://www.cnblogs.com/Ph-one/p/12033214.html
Copyright © 2011-2022 走看看