iOS TUN之避免UDP包ip分片
iOS的NetworkExtension给应用暴露了一个虚拟网卡TUN设备,可以设置其MTU值。如果上层应用发送的IP包大于这个MTU就会被分片。(详见:http://blog.csdn.net/n5/article/details/60872890 )
* TUN转发UDP包时遇到分片的问题
使用iOS网络扩展开发时,往往需要在TUN中处理数据包,进行处理后重新发送出去。由于通过TUN拿到的是ip包,如果要进行udp处理,需要去掉ip头,再去掉udp头,得到udp的载荷数据,再进行处理,然后再使用一个socket发送出去。如果分片了,就必须等所有分片收到后组装回原始udp包,才能获取udp的载荷数据进行处理,然后再发送出去,这样比较麻烦。所以如果能有效设置TUN的MTU,尽量避免UDP分片,在某些情况下能比较容易处理。
设置较大MTU避免分片
设置较大的MTU,比如10240,就可以让不超过MTU的ip包不分片,这样TUN里面获取ip包后可以获得完整的UDP载荷数据了。但是MTU不能设置太大,经过试验,如果设置一个很大的值比如50000,MTU会被重置为1500,估计是iOS系统内置的行为。经测试,10240可以设置成功。转发处理后的udp包时,注意send buf限制
设置MTU为10240后发现,UDP包还没有到达10k就已经发送错误了,报错:
Error Domain=NSPOSIXErrorDomain Code=40 "Message too long" UserInfo={NSLocalizedFailureReason=Error in send() function., NSLocalizedDescription=Message too long
这是因为使用sendto时,send buf有限制,经测试,在iOS上这个值为9216,加上28的ip和udp头,可以发送的ip包最大为9244。sned buf可以通过getsockopt获取:
int sndbuf=0;
socklen_t optlen = sizeof(sndbuf);
getsockopt(remote_ctx->fd,SOL_SOCKET, SO_SNDBUF, &sndbuf, &optlen );
可以通过setsockopt设置为较大的值。
iOS TUN之避免UDP包ip分片的更多相关文章
- UDP与IP分片
一.引言  UDP是简单的面向数据报的运输层协议.UDP不提供可靠性:它负责把应用程序传给IP层的数据发送出去,不保证能导到目的地. 二.UDP首部  端口号表示发送进程和接受进程.由于IP层已经 ...
- 【转】ios 抓取 tcp/udp 包
原文: http://useyourloaf.com/blog/2012/02/07/remote-packet-capture-for-ios-devices.html Remote Packet ...
- IP分片 与 TCP分段的区别 !!!!careful========以及udp中一个包大小究竟为多大合适 ==========三次握手四次挥手细节
首先声明:TCP分片应该称为TCP分段 TCP/IP详解--TCP的分段和IP的分片 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服 ...
- 以太网数据包、IP包、TCP/UDP 包的结构(转)
源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...
- TCP/IP具体解释--UDP数据报中的IP分片
1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...
- [na]IP分片抓包实验
这两点比较重要 1.IP+ICMP+DATA = 1500字节 2.ping size指定的是data的大小. 3,可以ping大包+不分片检测mtu(分片发生在出口,如果包尺寸大于接口ip mtu, ...
- TCP 、UDP、IP包的最大长度
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
- 伪造 UDP 包源 IP 地址
Raw sockets 方式 raw socket 可通过参数 IPV6_HDRINCL 或 IP_HDRINCL 自定义IP头——伪造UDP报文源IP就全靠它了. 限制:从xp sp2之后的所有非 ...
- LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址
在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...
随机推荐
- Jquery12 Ajax
学习要点: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 Ajax ...
- SaltStack安装zabbix-agent-第九篇
环境 node1 192.168.56.11 角色 salt-master node2 192.168.56.12 角色 salt-minon 实现内容 使用salt远程安装zabbix ...
- spring-security权限控制详解
在本例中,主要讲解spring-boot与spring-security的集成,实现方式为: 将用户.权限.资源(url)采用数据库存储 自定义过滤器,代替原有的 FilterSecurityInte ...
- LVS-net
一.LVS基本情况 lvs:Linux Virtual Server,是一种负载均衡集群,其主要是由工作在内核的ipvs与用户空间的命令行工具ipvsadm组成.支持TCP,UDP,AH,EST,AH ...
- TeeChart.Direct2D.dll的使用
这个dll本身依赖于第三方的控件,SlimDX ,可以从 http://slimdx.org/ 下载. .net4.0的版本区分x86和x64 帧数的概念 我们通常说帧数,简单地说,就是在1秒钟时间 ...
- finally是否执行?finally何时执行?
一.finally是否执行: 1.只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行当finally 相对应的 try 语句块之前,已经抛出错误,或者已经 ...
- css hover dropdown
html-------------------------- <div class="dropdown"> <span>鼠标移动到我这!</span& ...
- Log4j 2.0 使用说明(1) 之HelloWorld
以下是Log4j2.0的类图,以便大家对2.0有一个整体的理解. 就如我们学习任何一个技术一样,这里我们首先写一个Hello World: 1,新建工程TestLog4j 2,下载Log4j 2.0有 ...
- 为什么使用Lambda表达式(翻译版)
简介 如上图所示,绿色框中就是Lambda表达式,是可以执行的代码块.Lambda表达式是很多编程语言的特征,比如Lisp, Python, Scala等. 但是对于java,在8以后才支持这种写法. ...
- 对于"第一次创业者"应该给什么样的建议
转:其实我创业也不是很成功(目前属于第二次).目前为止,基本保证家里足够温饱和足够温馨,偶尔奢侈,但是我坚持走技术路线,不做土豪(因为做不了). 我创业的口号是:成全别人,累死自己!! 有人问 ...