Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

协议:TCP, UDP和SCTP

TCP/IP协议族如图:

Alt text

TCP/IP协议族除了TCP和IP协议外,还包括许多其他协议。如UDP, ICMP, ARP, SCTP

1. UDP

UDP(User Datagram Protocol,用户数据报协议)。一个无连接协议,尽力而为传输。传输单位UDP数据报。使用的套接字为数据报套接字。

进程在套接字写入一个消息(应用层),该消息随后被封装到一个UDP数据报(传输层),该数据报进而被封装到IP数据报(网络层),发往目的地。UDP不保证按需交付,而且不保证每个数据报只到达一次。

不同于TCP无边界的字节流,UDP的数据报都有一个长度。

无连接的。意味着一个UDP client和server之间不用存在长期关系。一个client可以创建一个UDP socket并用它前后发送多个数据报给多个服务器。同理,一个server也可以用一个socket来从不同的客户端接收数据。

2. TCP

TCP(Transmission Control Protocol, 传输控制协议)。一个面向连接的协议,提供可靠的全双工字节流。使用的套接字为流套接字。

在描述TCP连接的建立和释放前,需要说明。网络编程中连接的建立和释放基本上都是由客户端(应用程序)主动发起。

TCP连接建立—三次握手:

Alt text

TCP连接释放—四次挥手:

Alt text

  1. 客户端主动调用close,向服务器发送一个FIN分节,表示自己的数据发送完毕;
  2. 服务器收到FIN后返回ACK,表示自己收到客户端关闭连接的请求;【此时只有客户端连接关闭】
  3. 服务器完成针对该客户端的服务后调用close关闭其服务进程。服务器向客户端发送一个FIN表示自己的服务应答数据发送完毕;
  4. 客户端返回一个ACK表示确认。【此时双方连接都关闭】

TCP为应用程序提供面向连接的可靠服务,用于OM通道的传输承载。TCP通过如下特征来实现此目标:

  • 差错控制:TCP通过累积的确认信息来报告丢失的分段或接收端分组的失序,通过超时和重传机制来确保应用程序数据的可靠接收。
  • 流量控制:TCP用滑动窗口流量控制机制来防止接收缓冲区的溢出。
  • 拥塞控制:TCP通过慢启动(slow start)、拥塞避免(congestion avoidance)和快速重传/快速恢复(fast retransmit / fast recovery)机制来适应路由器的阻塞,以获得高吞吐量。

3. SCTP(Stream Control Transport Protocol)流控制传输协议

3.1 传统传输协议的弊端:

TCP 由于严格的顺序递交和确认重传带来了额外的传输流量和较大的时延
UDP 又因为过于简单,缺少必要的可靠传输保证,容易导致网络拥塞甚至崩溃

3.2 SCTP 的特征

  1. 内建多地址主机支持:SCTP 中的一对连接称为关联(Association),关联两端的主机节点(Endpoint)可以有多个网络地址,从而使一个 SCTP 关联可以通过多条网络路径进行数据传输。
  2. 保留应用层消息边界:SCTP 保留上层数据信息的边界,上层数据信息称为“消息”,传输的基本单位为有意义的数据段。
  3. 单个关联(Association)多流机制:SCTP 允许用户在每个关联中定义子流,数据在子流内按序传输。

3.3 SCTP 数据包格式

SCTP 提供了灵活的数据块格式,每个 SCTP 数据报都由一个 Common Header(基本首部)和若干 Chunk(数据块)组成。

Alt text

基本首部提供了源端口和目的端口,用于完成典型的传输层协议端口复用功能;
验证标记对一个 SCTP 连接提供安全验证,保存着在 SCTP 通过握手建立连接时第一次交换的初始标签的值。在一次连接中,任何 SCTP 数据包若不包含这样一个标签,到达时会被接收端丢弃。

校验和是对整个数据包的校验。

在首部后是一系列 Chunks (块)。Chunk 是组成 SCTP 报文的基本结构,有多种类型,不同类型的块可用来传输不同的控制信息或数据;同时首部中的 F(flags) 标记字段提供了额外的控制信息。

丰富的 Chunk 类型使 SCTP 可以采用不同类型的 Chunk 实现各种传输控制机制。

3.4 SCTP 的消息(message)和流(stream)

SCTP 协议将上层数据信息称为用户消息(user message),在传输中 SCTP 保留上层数据信息的边界,传输的基本单位为有意义的数据段。因此 SCTP 称为“面向消息”的传输协议。

Alt text

SCTP 提出了数据流的概念,每个数据块中不仅有传输序号 TSN,还携带了流标识 SID(Stream ID)和流序号 SSN(Stream Sequence Number)。

用户可以在一个连接中建立多个流,每个流分配一个 SID,每个流队列中的用户数据由流序号 SSN 表明顺序。

在 SCTP 中引入一个连接多个流的机制解决了使用 TCP 传输时出现的队首阻塞问题。

允许某些应用程序根据需求将逻辑上不相关的数据分离为多个流进行传输往往很有意义,如一个多媒体视频会议系统中的多路语音信号在各自的流中传输,彼此之间不会互相阻塞。

flags 字段共三位,其中的 U 位为是否按序递交用户消息的标志,B、E 位分别代表本 Data Chunk 包含一个用户消息的开始或结束,如果本数据块包含一条完整的用户消息,则 BE 都置为 1,如包含消息中间的内容则都置为 0。

SCTP 提供按序递交和无序递交两种选择,Data Chunk 中的flags 字段中的 U 位就表明了该数据所需要的服务是按序递交或是无序递交。当采用无序递交时,SCTP 就具有了类似 UDP 的一些特征,能够尽快的将数据发往上层,适用于一些实时应用。

实际上,通过引入流和无序递交机制,SCTP 实现了严格有序传输(类似 TCP),部分有序传输(部分流内无序递交)和无序传输(类似 UDP)。

评论