iOS TUN之避免UDP包ip分片
来源:互联网 发布:it was until that 编辑:程序博客网 时间:2024/06/10 19:07
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分片
- TCP/UDP/IP分片
- TCP/UDP/IP分片
- UDP包分片倒序
- IP 包分片
- TCP,UDP和IP分片
- TCP,UDP和IP分片
- IP、TCP、UDP数据包头部抓包及IP分片传输详解
- TCP/IP:UDP(2) IP分片
- Lwip IP包分片重组
- 解惑篇:TCP/UDP/IP分片
- TCP 分段与 UDP/IP 分片 [转载]
- TCP/IP详解--UDP数据报中的IP分片
- 唯快不破:TCP/IP详解--UDP数据报中的IP分片
- IP包分片与重组视屏
- TCP/IP详解之IP分片
- TCP不会造成IP分片,而UDP和ICMP则会造成IP分片
- TCP不会造成IP分片,而UDP和ICMP则会造成IP分片
- 欢迎使用CSDN-markdown编辑器
- html基础01
- vim 全选复制,常见解法更正
- 统计每个月兔子的总数
- Java基础语法(一)
- iOS TUN之避免UDP包ip分片
- intent
- C#之迭代器
- Android进化徽章-Picasso
- 最长回文串
- 无主之地1
- 二维字符串数组全局变量保存问题
- 线程安全与可重入函数
- shm_open打开共享内存文件