加载中…
个人资料
iyangjian2005997
iyangjian2005997
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

linux2.6.17以上内核中的 splice and tee

(2007-09-05 16:04:29)
本人觉得这个技术用来做代理,很合适。因为数据可以直接从一个soket到另一个soket,不需要经用户和内核空间的切换。这是以前linux sendfile不支持的,我想要的。

以下是我在网上找的一些文章:

新内核中还增加了名为splice 的新I/O机制。Linus Torvalds解释说,splice背后的真正概念是暴露给用户空间的“随机内核缓冲区”的概念。“也就是说,splice和tee运行在用户控制的内 核缓冲区上,在这个缓冲区中,splice将来自任意文件描述符的数据传送到缓冲区中(或从缓冲区传送到文件描述符),而tee将一个缓冲区中的数据复制 到另一个缓冲区中。因此,从一个很真实(而抽象)的意义上讲,splice相当于内核缓冲区的read/write,而tee相当于从内核缓冲区到另一个 内核缓冲区的memcpy。”


定义

Also called "delayed binding," it is the postponement of the connection between the client and the server in order to obtain sufficient information to make a routing decision.

以上定义摘自Encyclopedia,译成中文为:

为了获得足够的信息用来制定路由策略而对客户端到服务器的连接进行延迟的一种技术,所以又被称为“延迟绑定”。

个人觉得这个定义不够贴切,倒是有些应用环境的味道。

原理

当 两个socket之间需要互相交换(relay)数据时,不再把数据拷贝到一个临时的缓冲区(大多数情况下是用户空间缓冲区),而是修改tcp数据包的一 些参数,如源、目的ip地址和端口号等,然后将修改后的数据包直接通过ip层网络接口发送出去。可见,与基于recv/send机制的数据交换相比,这个 过程根本就不需要内核空间到用户空间的转换,也至少避免了两次数据拷贝:从接收缓冲区到用户缓冲区和从用户缓冲区到发送缓冲区,效率也不可同日而语[1] [2]。更加详细的内容请参看TCP粘合技术原理,实际的TCP splicing技术实现还要考虑更多的细节

实现

目前能够找到源码的Linux环境下实现就是l7sw中的,通过阅读头文件中的注释不难发现此实现是以章文嵩先生的实现为 基础的,发展了有5年左右,应该没什么大的问题。有些小的问题不得不提,此实现不支持TCP协议的一些附加选项比如SACK和TCP Scaling等,还好这些选项开闭的主动权位于客户端,所以我们可以简单地在运行TCP Splicing的机器上关闭这些选项,这样就没有选项不匹配的问题了。似乎是逃避策略,不过试想一下如果TCP Splicing机器和服务器的选项不同,那么TCP Splicing恐怕是不能实现的,又要退化到应用层的数据交换。还有另外一个考虑,此技术多用于类似HTTP协议的存在大量短连接的情况,而那些选项多 是为大带宽、长延时和高错误率的网络环境而设计,两者的应用环境交集不大,所以即使不支持也没什么大问题。

应用环境

定义中说的已经足够好了,举例来说就是应用层网关、代理服务器和应用层交换机(内容交换机)等。

参考资料

[1] http://www.winlab.rutgers.edu/~pravin/presentations/splice-talk/Splice-Talkl.HTM
[2] http://citeseer.ist.psu.edu/maltz98tcp.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有