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分片的更多相关文章

  1. UDP与IP分片

    一.引言  UDP是简单的面向数据报的运输层协议.UDP不提供可靠性:它负责把应用程序传给IP层的数据发送出去,不保证能导到目的地. 二.UDP首部  端口号表示发送进程和接受进程.由于IP层已经 ...

  2. 【转】ios 抓取 tcp/udp 包

    原文: http://useyourloaf.com/blog/2012/02/07/remote-packet-capture-for-ios-devices.html Remote Packet ...

  3. IP分片 与 TCP分段的区别 !!!!careful========以及udp中一个包大小究竟为多大合适 ==========三次握手四次挥手细节

    首先声明:TCP分片应该称为TCP分段 TCP/IP详解--TCP的分段和IP的分片 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服 ...

  4. 以太网数据包、IP包、TCP/UDP 包的结构(转)

    源:以太网数据包.IP包.TCP/UDP 包的结构 版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6). IP包头长度(Head ...

  5. TCP/IP具体解释--UDP数据报中的IP分片

    1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...

  6. [na]IP分片抓包实验

    这两点比较重要 1.IP+ICMP+DATA = 1500字节 2.ping size指定的是data的大小. 3,可以ping大包+不分片检测mtu(分片发生在出口,如果包尺寸大于接口ip mtu, ...

  7. TCP 、UDP、IP包的最大长度

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  8. 伪造 UDP 包源 IP 地址

    Raw sockets 方式 raw socket 可通过参数  IPV6_HDRINCL 或 IP_HDRINCL 自定义IP头——伪造UDP报文源IP就全靠它了. 限制:从xp sp2之后的所有非 ...

  9. LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

    在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...

随机推荐

  1. JAVA链接数据库

    链接:http://www.cnblogs.com/centor/p/6142775.html 开发工具: MyEclipse MySQL JDBC驱动:mysql-connector-java-5. ...

  2. [CF911F]Tree Destruction

    题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 首先我们知道,到一个点距离最远的点是直径的端点.考虑贪心,如果我 ...

  3. POJ-2418 Hardwood Species(二叉搜索树)

    思路就是先将每个单词存进二叉树中,没出现一次,修改该单词所在结点的cnt++: 最后通过递归中序遍历输出结果. 思路很清晰,主要注意一下指针的使用,想一想为什么要这么用? 简单的解释就是,insert ...

  4. 源码编译nginx

    [root@localhost local]# yum -y install pcre pcre-devel#解压nginx源码包[root@localhost local]# tar -zxvf / ...

  5. Spring Boot CRUD+分页(基于JPA规范)

    步骤一:JPA概念 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活的可能是Hibernate,TopLink等等实现了JPA ...

  6. Anaconda 环境中使用pip安装时候出现的一些问题

    author:pprp date:18/8/12 --- 1. AttributeError: Module Pip has no attribute 'main' solution:降低pip的版本 ...

  7. 转载:Service Mesh:重塑微服务市场--敖小剑

    转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注  Service Mesh ...

  8. Eclipse安卓项目导入android.support.design报错的解决办法

    导入android.support.design出错:1.项目除了需要依赖appcompat_v7包外还要design包2.design包就是在安卓sdk下Extras中的android.suppor ...

  9. JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果

    Ace模板地址:http://code.google.com/p/ace-engine/wiki/AceTemplate(有时会打不开) Ace英文官网:http://wrapbootstrap.co ...

  10. 基于JQuery 的消息提示框效果代码

    提示框效果 一下是封装到 Jquery.L.Message.js 中的JS文件内容 var returnurl = ''; var messagebox_timer; $.fn.messagebox ...