Foo over UDP
译文作者:zhangzl2013
译文链接: 原文作者:Jonathan Corbet 原文链接: 本文有可能会被转载,从而导致评论留言的碎片化。想参与评论和探讨的同学,请找到原文或译文的原始地址,与原文或译文作者互动讨论。隧道技术在现代网络应用中变得越来越重要了。通过把不同的网络连接在一起,隧道技术可以创建虚拟私有网络,访问被防火墙拦住的端口等等。隧道技术可以在网络堆栈的不同层实现;SSH隧道在TCP层,而GRE和IPIP这种隧道协议则直接在IP层上。非但如此,还有越来越多的关注集中在UDP协议上。Tom Herbert发布的“foo over UDP”(FOU)补丁集,以一种通用的方式实现了UDP层的隧道技术,而且已经进入了3.18的net-next tree了。
为啥选则了UDP呢?目前几乎所有的网络接口都对UDP有硬件支持,并实现了检验校验和等细节操作。UDP刚好提供了足够的信息(确切的说,就是端口)来轻松的路由数据报文封包。UDP也可以用于接收端缩放技术(Receive Side Scaling,RSS)和等价多路径协议(ECMP),来提升性能。UDP隧道的优越之处使很多开发者认为未来几年它将大规模普及。
数据报文封包和UDP隧道相对来说还是比较容易理解的概念。试想一个进入隧道的TCP数据包:
这个数据报有正常的IP和TCP头,后面是用户要发送的数据。封包的过程如下:
这样,这个数据包就是一个UDP数据包,里面装的是TCP数据包。系统可以将他想普通的UDP数据包一样发送;在接收端,额外的UDP头部被去掉后,原始的TCP数据包继续进入网络堆栈进行处理。
配置一个FOU隧道需要两步。发送端和接收端分别设置,这样能允许人们随意配置它们。在接收端,只要设置一个端口用于接收封装好的数据报文就行了。有个新的“fou”子命令可用于此:
ip fou add port 5555 ipproto 4
此命令设置了5555端口,指明此端口接收到的数据报的协议号是4,也就是IP封包。此端口接收到的数据包会被拆解掉外面的封装;然后再放入到网络堆栈中,从而发往它的实际目的地址。
在发送端就稍复杂了点,因为必须制定目的地址,还要能够与已有的封装协议共存。典型的命令如下:
ip link add name tun1 type ipip \ remote 192.168.1.1 local 192.168.1.2 ttl 225 \ encap fou encap-sport auto encap-dport 5555
此命令设置一个新的虚拟接口(tun1),用于IPIP封装。数据包的源端口有网络栈决定,而目的端口设置为5555。当然要使用这个网络接口还要选择封装协议。目前支持的协议有IPIP,SIT(IPv4-IPv6隧道协议)和GRE(用于虚拟专用网)。
这个补丁集的一些数字表明SIT和IPIP的性能有了很大提升;而GRE的性能则跟没有用FOU的情况差不多。所以,利用已有的对UDP收发的优化,这个特性显然能够提升速度。它不需要专门的硬件支持;当前能处理UDP协议的硬件就足够了。所以说这是个能工作于当前任何系统的非常简单的解决方案——而且3.18发布时就可以使用了。
扩展阅读