Patterns in network system design (6)

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




23) stateless packet processing

Pattern Name and Classification: stateless packet processing
Intent:  简单,快速处理packet
Also Known As: stateless packet filter 
Motivation (Forces):

   无状态的包处理应该是一个很自然的选择,因为ip协议就是一个无状态的协议。无状态意味着每个包都是独立转发的,相互之间没有关系。无状态和有状态的主要区别在于包是否匹配session或者是flow(session和flow这两个词在大多数应用场景里面所指的东西是一样的,所以后面直接用session来代替了,读者明白这个意思就行)。session是路由,策略,MAC地址的cache,这个和“一次路由,多次交换”的机制是一致的。在无状态的处理过程中,每个包都需要查找路由,匹配策略,查找出口的MAC地址等;而在有状态的处理里面,如果存在session,先查找session;如果查找失败,再查找路由,匹配策略,然后创建session。

   无状态好处是在路由,策略,MAC地址等改变时,可以快速感知,而且可以做到per-packet的ECMP。但是无状态对某些应用是不可能实现的,比如NAT和IPSEC。NAT通常是session based,因为它要求同一个session的packet,转换后也是同一个session;IPSEC的每个包都是编号的,而且SA本身也要求有状态。从匹配效率来说,policy/acl/route 匹配并不一定比session匹配效率低,看具体应用。如果是单纯的包转发,当然是无状态处理好;如果要加上更多的service,比如netflow,nat, ipsec等,就需要有状态的处理。
Known Uses: router, switch, packet filter firewall
Related Patterns: stateful packet processing
References:

1: https://www.mikrotik.com/testdocs/ros/2.9/ip/flow_content.php

2: http://www.multicorepacketprocessing.com/

24) stateful packet processing

Pattern Name and Classification: stateful packet processing
Intent: 基于session或者flow的包处理
Also Known As: stateful packet inspection 
Motivation (Forces):

  stateful packet inpsection (SPI)是防火墙技术的一次飞跃。早期stateless packet filter防火墙,在处理动态协议时碰到了问题。而Checkpoint发明的SPI技术通过动态创建session来解决这个问题。所以stateful packet processing首要任务是创建session或者flow 。什么是session?session是cache;是什么的cache?路由,策略,MAC地址等。能够匹配session,就说明相应的流被允许通过,并且在这之上,有一系列处理。session一般是用五元组(协议,源地址,目的地址,源端口,目的端口)匹配的。在处理动态协议的时候,可能还需要用到expect(请参见linux netfilter),expect是一个不完整的session,在匹配expect之后,可能还需要匹配策略以确定expect是否可以转化成一个session。一句话,session是stateful packet processing的基础。

  stateful的好处是什么?一是有些应用必须是stateful的,比如前面提到的NAT,IPSEC,以及ALG等。stateful的坏处是什么?在系统状态变化时,比如路由,策略,MAC地址变化,维护session的状态比较困难。

Known Uses: stateful packet inspection firewall
Related Patterns: stateless packet processing
References:

1: http://en.wikipedia.org/wiki/Stateful_firewall

2: Netfilter IPsec processing

3: http://netfilter.org/documentation/HOWTO/netfilter-hacking-HOWTO.html

4: http://www.soapatterns.org/stateful_services.php

25) per-packet service

Pattern Name and Classification: per-packet service 
Intent: 单包处理
Also Known As: packet-based service 
Motivation (Forces):

  不管是无状态还是有状态的包处理,有些应用是针对单包的,比如NAT,IPSEC。当然,在处理之前,这个包在IP层已经完成了分片组装。对基于UDP的协议来说,per-packet的处理是很自然的,但是对基于TCP的协议来说,由于协议的边界并不是IP包,所以per-packet的处理就不适用了。当然,对基于TCP的协议应用per-packet处理在很多情况下也能工作,只是不能适用于所有情况,特别是包在TCP层被分片的情况。

Known Uses: NAT, IPSEC etc
Related Patterns: stream service
References:

1: http://en.wikipedia.org/wiki/Deep_packet_inspection

2: Per Packet Load Balancing

26) stream service

Pattern Name and Classification: stream service
Intent: 协议的边界是基于流的,需要针对流进行处理
Also Known As: stream-base service, proxy-based service
Motivation (Forces):

  基于TCP的协议,上层应用看到的是一个字节流,而不是单个的packet。协议的边界是基于流的,而不是基于单个包。所以,必须先完成流组装才能进行更高层的处理。协议是分层的,每一层做好自己的事就可以了。stream可以算一个层次,在这之上,有很多应用协议,比如http,还有很多基于http协议的应用协议,所以可能还需要一个http协议层。这样,每一层只关注自己的工作,向上层提供相应的服务。
Known Uses: DPI, URL filter etc
Related Patterns: per-packet service, tcp-proxy
References:

1: http://en.wikipedia.org/wiki/Flow_(computer_networking)

2: http://en.wikipedia.org/wiki/Data_stream_mining

27) service plane

Pattern Name and Classification: service plane
Intent: 多种service组成一个有机的整体
Also Known As: application layer
Motivation (Forces):

Multi service

(http://www.nsfocus.com/1_solution/1_2_10.html, 这张图来自绿盟的网站,如有版权问题,请联系本文作者)

  如上图,在有这么多service运行的情况下,如何把这些service组成一个有机的整体?  是callback based, event-driven, pool-based,或者其他?这些都是细枝末节,最重要的是把service的层次要定义出来,这样才能和传统的data plane区分开来。service这么多,调用顺序是一个问题;如何在规定的时间内完成处理是另一个问题(realtime系统的要求);service之间如何通讯,service如何管理,service如何配置等等。netfilter做的完全动态,可扩展的框架就很不错,不过性能稍差一点,可以用做参考。
Known Uses: multi service gateway
Related Patterns: per-packet service; stream service
References:

1: http://www.nsfocus.com/1_solution/1_2_10.html

2: http://en.wikipedia.org/wiki/Software_framework

3: http://en.wikipedia.org/wiki/Osgi

4: http://en.wikipedia.org/wiki/Netfilter

28) tcp-proxy

Pattern Name and Classification:  tcp-proxy
Intent: 实现stream service
Also Known As: application proxy
Motivation (Forces):

  把tcp-proxy单列出来,看似有凑数之嫌,其实不然。我们常见的application proxy,比如squid,apache等,是应用层的代理,和这里所说的data plane的tcp-proxy完全不同。以squid为例,它完成代理,需要建两个socket,一个包进出内核,需要两次拷贝,这样的开销是不能容忍的。如果忽略内核空间与用户空间之间的内存拷贝,这个tcp-proxy应该能提供哪些功能?首先要支持多种应用协议,其次需要支持多种service(多个service,一个tcp-proxy),而且需要支持多个tcp-proxy同时运行(有可能是per-session的tcp-proxy)。tcp-proxy是TCP协议的一个完整实现,能够工作的实现已经不容易了,高性能的实现是很困难的事情,是业界的难题之一。
Known Uses: multi service gateway
Related Patterns: stream service; service plane
References:

1: http://en.wikipedia.org/wiki/Proxy_server

2: http://en.wikipedia.org/wiki/Squid_proxy

(没有打分)

雁过留声

“Patterns in network system design (6)”有6个回复

  1. zeroflag 于 2011-01-21 12:27 上午

    TCP Proxy和Syn Proxy之间是什么关系?这个功能是干什么用的?

  2. kernelchina 于 2011-01-21 1:29 上午

    Tcp proxy其实就是一个tcp socket层,不过不是通用操作系统里面的那种,在data plane里面跑,需要的是性能,稳定,以及支持multiple service的能力。syn proxy是在抗syn flood里面用到的一种技术,这tcp proxy完全不同。

  3. zeroflag 于 2011-01-21 1:45 上午

    有些厂家也把syn Proxy叫做TCP Proxy,所以搞误会了。

    也就是说,这里面提到的TCP Proxy其实是TCP Socket在系统里面的一种特殊实现喽?但是没想明白有什么用。是用来做应用层数据还原的吗?也就是在IP碎片重组之后做TCP流重组之类的东东?

  4. kernelchina 于 2011-01-21 7:06 下午

    可以这么说,但是由于在tcp proxy里面有queue,tcp stack所具有的那些特性也必须有,比如window management, congest control等等。

  5. TcpNewbie 于 2011-01-22 12:01 上午

    请教楼主,广域网加速产品有很多用到tcp proxy技术的(当然还有针对不同layer7的应用proxy),不知道跟您提的tcp proxy是否属相同含义?

    关于wan优化用到的tcp proxy技术,不知道其本质上是不是也是把一条连接分成两部分(不见得通过socket实现)?
    ——连接本地端的使用标准tcp(从而对客户透明),连接远程端的使用优化过的tcp(例如针对卫星链路的优化丢包处理的实现)

  6. 十分八卦 于 2011-01-22 2:32 上午

    TCP proxy和syn proxy还是有根本不同的,混为一谈应该不是RD部门兄弟,可能是前方宣传的兄弟不明就里。
    通常来说TCP proxy可以理解为一个完整的two wing tcp stack, 朝向原始的src和dst都有完整的协议栈实现。它的作用,应该定义为在tcp层传递两个link之间的数据。原则上它不会做高于tcp的高层应用处理,这个部分应该是架构在TCP proxy之上的application proxy的职责。
    存在形式上,TCP proxy可以单独工作,也可以配合上层的application proxy。举例说明,单独工作情况下,实现一个aggressive一些的tcp stack对远端发起连接,就是一个典型的广域网优化产品;与上层的HTTP协议栈配合,形成完整HTTP proxy那就是WAF/web cache类型产品的基础;和更多的HTTP/SMTP/POP3/IMAP协议栈配合,就是AV gateway/DLP类产品的基础了。
    自己实现一个TCP proxy通常会遇到的问题是:协议栈兼容性(例如ECN标志兼容)/性能(并发,新建,吞吐)/可迁移性(主要是实现的位置,与OS的紧密程度,socket一般是不可取的)/对上层协议栈的抽象程度等几个问题。