Thursday, April 30, 2009

网络传输层的几个重要协议

最近对 RPC 有点兴趣,于是上 wikipedia 查了点资料,感觉挺有收获的。呵呵,以前网络原理没有好好学,现在补习一下。

传输层重要的几个协议是:
  • TCP: Transmission Control Protocol
  • UDP: User Datagram Protocol
  • SCTP: Stream Control Transmission Protocol
  • DCCP: Datagram Congestion Control Protocol
上网络课程的时候,我记得主要就讲了一下 TCP,而 UDP 只是稍稍做了介绍,SCTP 和 DCCP 则好像没有提到过。稍微比较一下几个协议的特点吧。

TCP 算是最常用的传输协议了,HTTP 和 FTP 都是基于它的。这个协议的特点是集成了拥塞控制,提供了丢包检测及重传、重复报文检测,保证发出去的数据有序到达接收方。可以说,这个协议对于使用者而言是最为“傻瓜”的,连接只有“成功”和“断开”两种状态。不过 TCP 由于在建立连接的时候要互相发送3个报文进行握手,之后才开始传输用户数据,所以会带来一定的额外开销。对于 HTTP 以及 FTP 协议而言,由于用户数据量比较大,所以对于这部分开销并不关心,此外 TCP 提供的拥塞控制也很有帮助。但是对于 RPC 这样的小数据量传输,TCP的开销就显得比较大了。另外对于一些实时性要求比较高的应用,比如网络游戏、网络电视、网络电话等,TCP 提供的丢包重传并不是十分有意义,因为丢了的包并不重要,而新的包才是更需要发送到接收方的。

UDP 则是一个很简单的传输协议,它几乎什么控制都不提供。它不保证发出的包能到达接收方,不保证报文到达接收方的顺序有序,而且同一个报文接收方可能会接收到多次,这套协议还不关心拥塞控制。TCP 协议提供的高级控制功能,UDP 都没有考虑。UDP 协议期望用户自己在应用中提供控制,或者用户不关心这些控制措施。虽然 UDP 看起来比较简陋,但是对于 RPC 和实时性要求高的应用而言,是最为高效的传输协议。此外,UDP 还能够直接支持多播和组播(这部分知识我现在还不是太清楚)。

UDP 的一个问题在于没有拥塞控制,这在安全上有一定的缺陷,于是 DCCP 被提出来解决这个问题。DCCP 在 RFC 4340 中提出,目前处于 proposed standard 状态。这个协议免去了在应用层实现拥塞控制的工作,并且已经在 Linux 2.6.14 内核中得到了支持。按照 wikipedia 给出的信息,这个协议类似于 TCP,但是却和 UDP 一样不对数据报文的重传、有序到达、唯一到达进行保证。个人感觉这套协议可能还是会有一定的建立连接时的开销,类似 TCP 建立连接时的握手过程。如果真是这样的话,这套协议还是不太适合 RPC,但是对于网络电视、网络电话这样的应用应该是很好的,因为这些应用的建立和用户数据传输的过程相比可以忽略。

SCTP 同样也是集成了 UDP 和 TCP 的特点,而且貌似更早于 DCCP ?它是在2000年就被提出来的。它的实现方式是将用户数据看做是消息,把它们拆分成小块进行发送。它可以看作是 Transaction-Oriented,接收方拿到的数据包和发送方发送的数据包是一样的(TCP会将发送的数据自动拆分到小包中),这一点类似于 UDP 的“确定边界”特性。

啊,困死了,回去睡觉吧。最后把 wikipedia 上的一个图表摘过来吧:

Feature Name UDP TCP SCTP DCCP
Connection oriented No Yes Yes Yes
Reliable transport No Yes Yes No
Unreliable transport Yes No Yes Yes
Preserve message boundary Yes No Yes Yes
Ordered delivery No Yes Yes No
Unordered delivery Yes No Yes Yes
Data checksum Yes Yes Yes Unsure
Checksum size (bits) 16 16 32 Unsure
Path MTU No Yes Yes Yes
Congestion control No Yes Yes Yes
Multiple streams No No Yes No
Multi-homing support No No Yes Unsure
Bundling / Nagle No Yes Yes No

from Wikipedia, original page to be found at here

0 comments: