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. 再也不学AJAX了!(三)跨域获取资源 ① - 同源策略

    我们之前提到过,AJAX技术使开发者能够专注于互联网中数据的传输,而不再拘泥于数据传输的载体.通过AJAX技术,我们获取数据的方式变得更加灵活,可控和优雅. 但是AJAX技术并不是一把万能钥匙,互联网 ...

  2. Linux系统CentOS使用yum方式安装指定版本的PHP 添加yum源 从PHP5.3升级到5.4/5.5/5.6

    默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 首先删除旧版本的PHP, 通过yum list installed | grep php可以查看所有已安装的php软件 使 ...

  3. FASTQ format

    FASTQ format 每个FASTQ文件中每个序列通常有四行信息: 1: 以 '@' 字符开头,后面紧接着的是序列标识符和可选字段的描述(类似FASTA title line). 2: 序列 3: ...

  4. 记jsp判断

    empty:表示空字符串,null,空数组,空集合. ! empty:表示非空字符串,非null,非空数组,非空集合.

  5. RunLoop Note

    I. Begin from Apple Document Apple describes the priciples of runloop in Threading Programming Guide ...

  6. Asp.Net Core 2.0 WebUploader FastDfs 文件上传 分段上传

    功能点: 1. 使用.net core 2.0 实现文件上传 2. 使用webuploader实现单文件,多文件上传 3. 使用webuploader实现大文件的分段上传. 4. 使用webuploa ...

  7. Decode Ways,编码方式数量求解。动态规划问题。

    问题描述: A message containing letters from A-Z is being encoded to numbers using the following mapping: ...

  8. JavaScript高级程序设计-读书笔记(3)

    第8章 BOM 1.window对象 (1)全局作用域 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象既是通过JavaScript访问浏览器窗口的一个接口,又是E ...

  9. codeforces246E Blood Cousins Return

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  10. RabbitMQ 之 订阅模式 Publish/Subscribe

    模型图 我们之前学习的都是一个消息只能被一个消费者消费,那么如果我想发一个消息 能被多个消费者消费,这时候怎么办? 这时候我们就得用到了消息中的发布订阅模型 在前面的教程中,我们创建了一个工作队列,都 ...