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
unix udp sendto 最大可发送的数据长度的更多相关文章
- udp回显客户端发送的数据
这里让客户端给服务端发送的数据被服务端自动发回来 客户端: import socket client_socket = socket.socket(socket.AF_INET, socket.SOC ...
- python join()方法的使用,可以应用到tcp压测发送指定数据长度的应用
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串.其中,序列中的元素应是字符串类型. 学习join()方法主要是为了配合随机数的使用,生产某个指定位数的随机数,在t ...
- A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包
A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上. 通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB.所有使用中断收 ...
- STM32 UART DMA实现未知数据长度接收
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...
- 网络编程--使用UDP发送接收数据
package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...
- UDP发送的数据 以数据包形式发送
UDP发送的数据 以数据包形式发送
- UDP信息接收与发送
转载:http://www.cnblogs.com/sunev/archive/2012/08/08/2627247.html 一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visua ...
- linux系统中使用socket直接发送ARP数据
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...
- C#UDP(接收和发送源码)源码完整
C#UDP(接收和发送源码)源码完整 最近做了一个UDP的服务接收和发送的东西.希望能对初学的朋友一点帮助. 源码如下: 一.逻辑--UdpServer.cs using System;using S ...
随机推荐
- Python3 解决windows里PIP下载安装速度慢
直接保存为xxx.py运行即可 自动在用户文件夹创建pip文件夹,并创建配置文件:pip.ini 从此告别pip install XXXX 下载模块速度超级慢的问题! # -*- coding: ut ...
- APS应用案例|纽威阀门实现高效排产
企业背景: 苏州纽威阀门股份有限公司(下文简称:纽威阀门)成立于1997年,总部设在江苏苏州.自成立以来一直致力于工业阀门的研发与制造,以为客户提供全套工业阀门解决方案为目标.纽威阀门通过企业的努力发 ...
- 搭建前端监控系统(六)JS截屏和录屏篇
怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...
- centos7修改网卡命名规则
实验目的: 修改默认的网卡命名规则,习惯于ethx的形式 实验环境: centos7 熟悉控制网卡名字的规则生产的参数biosdevname/net.ifnames /etc/default/gr ...
- python-gitlab 之更改 merge_method
参考: https://docs.gitlab.com/ee/api/projects.html https://python-gitlab.readthedocs.io/en/stable/gl_o ...
- linux设备驱动程序-i2c(2)-adapter和设备树的解析
linux设备驱动程序-i2c(2)-adapter和设备树的解析 (注: 基于beagle bone green开发板,linux4.14内核版本) 在本系列linux内核i2c框架的前两篇,分别讲 ...
- VS创建C工程
打开VS编辑器: 填写项目名称,控制项目位置,创建: 在源文件中添加新项: 填写文件名称,修改后缀: 编写一个简单的hello word编译看看windows环境支持如何:
- Ecshop 2.x-3.x RCE漏洞复现
说是复现,其实来源于一道CTF题目(Ecshop3.x RCE) 链接:http://www.whalwl.cn:8030 1. 漏洞概述 ECShop的user.php文件中的display函数的模 ...
- PAT 乙级 1013.数素数 C++/Java
题目来源 令 Pi 表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出 ...
- php7中的dirname,intdiv,define
<?php //dirname可指定目录级数 //intdiv整数整除 //define可以定义数组 echo dirname('/var/www/html/app/etc/config'); ...