TCP、UDP、SCTP概述

总图

图中同时展示了 IPv4 和 IPv6。从右向左查看该图,最右边的的 5 个网络应用在使用 IPv6,最左边的 6 个网络应用在使用 IPv4。

最左边名为 tcpdump 的网络应用或使用 BSD分组过滤器 (BPF) ,或使用数据链路提供者接口 (DLPI) 直接与数据链路层进行通信。处于其右所有 9 个应用下面的虚线标记 API,它通常是套接字或 XTI。访问 BPF 和 DLPI 的接口不使用套接字或 XTI。

注意:Linux使用一种称为 SOCK_PACKET 的特殊套接字提供对数据链路层的访问。

TCP、UDP、SCTP概述

下面讲解图中的每一个协议框:

  • IPv4

    网际协议版本 4 。IPv4 自 20 世纪 80 年代早期以来一直是网际协议族的主力协议。它使用 32 位地址。IPv4 给 TCP、UDP、SCTP、ICMP、IGMP 提供分组递送服务。

  • IPv6

    网际协议版本 6 。IPv6 是在 20 世纪 90 年代中期作为 IPv4 的一个替代品设计的。其主要变化是使用 128 位更大地址以应对 20 世纪 90 年代因特网的爆发式增长。IPv6 给 TCP、UDP、SCTP、ICMP、IGMP 提供分组递送服务。

  • TCP

    传输控制协议。TCP 是一个面向连接的协议,为用户进程提供可靠的全双工字节流。 TCP套接字是一种流套接字 (stream socket) 。TCP 关心确认、超时和重传之类的细节。大多数因特网应用程序使用 TCP。注意,TCP 既可以使用 IPv4 ,也可以使用 IPv6。

  • UDP

    用户数据报协议。 UDP 是一个无连接的协议。 UDP套接字是一种数据报套接字 (datagram socket)。UDP 数据报不能保证最终到达它们的目的地。与 TCP 一样,UDP 既可以使用 IPv4 ,也可以使用 IPv6。

  • SCTP

    流控制传输协议。 SCTP 是一个提供可靠全双工关联的面向连接的协议,我们使用 “关联” 一词来指称 SCTP 中的连接,因为 SCTP 是多宿的,从而每个关联的两端均涉及一组 IP 地址和一个端口号,SCTP 提供消息服务,也就是维护来自应用层的记录边界。与 TCP 和 UDP 一样,SCTP 既可以使用 IPv4 ,也可以使用 IPv6,而且能够在同一个关联中同时使用它们。

  • ICMP

    网际控制消息协议。 ICMP 处理在路由器和主机之间流通的错误和控制消息。这些消息通常由 TCP/IP 网络支持软件产生和处理。有时也称作 ICMPv4,与 ICMPv6 区分开来。

  • IGMP

    网际组管理协议。IGMP 用于多播,它在 IPv4 中是可选的。

  • ARP

    地址解析协议。ARP 将一个 IPv4 地址映射为一个硬件地址 (如 MAC地址)。ARP 通常用于诸如以太网、令牌环网和 FDDI 等广播网络,在点到点网络上不需要。

  • RARP

    反向地址解析协议。 RARP 把一个硬件地址映射为一个 IPv4 地址。它有时用于无盘节点的引导。

  • ICMPv6

    网际控制消息协议版本 6。ICMPv6 综合了 ICMPv4 、IGMP 、ARP 的功能。

  • BPF

    BSD 分组过滤器。该接口提供对于数据链路层的访问能力,通常可以在源自 Berkeley 的内核中找到。

  • DLPI

    数据链路提供者接口。该接口也提供对于数据链路层的访问能力,通常随 SVR4( 一个 unix 内核标准) 内核提供。

UDP

UDP 是一个简单的传输层协议。

应用进程往一个 UDP 套接字写入一个消息,该消息随后被封装到一个 UDP 数据报中,该 UDP 数据报进而被封装到一个 IP 数据报,然后发送到目的地。

UDP 不保证 UDP 数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后不变,也不保证每个数据报只到达一次。因此我们使用 UDP 进行网络编程所遇到的问题是它缺乏可靠性。如果一个数据报到达了目的地,但是校验和检测发现有错误,或者该数据报在网络传输过程中被丢弃了,它就无法被投递到 UDP 套接字,也不会被源端自动重传。如果想要保证一个数据报到达目的地,可以往应用程序中添加一大堆的特性:来自对端的确认、本端的超时和重传等。

每个 UDP 数据报都有一个长度。如果一个数据报正确到达目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。

TCP

TCP 提供客户和服务器之间的连接。TCP 客户先与某个给定服务器建立一个连接,然后通过该连接与那个服务器进行通信,最后中止这个连接。

TCP 提供可靠性。当 TCP 向另一端发送数据时,它要求对端返回一个确认。如果没有收到这个确认,TCP 就自动重传数据并等待更长时间。在数次重传失败后,TCP 才放弃,如此在尝试发送数据上所花费的总时间一般为 4 ~ 10 分钟。

TCP 含有用于动态估算客户和服务器之间的往返时间 (RTT) 的算法,以便它知道等待一个确认需要的时间。举例来说, RTT 在一个局域网上大约是几毫秒,跨越一个广域网则可能是数秒钟。另外,因为 RTT 受网络流通各种变化因素的影响, TCP 还持续估算一个给定连接的 RTT。

TCP 通过给其中每个字节关联一个***对所发送的数据进行排序。举例说明,假设一个应用写 2048 字节到一个 TCP 套接字,导致 TCP 发送两个分解:第一个分节所含数据***为 0 ~ 1024 ,第二个分节所含数据***为 1025 ~ 2048 (分节是 TCP 传递给 IP 的数据单元)。如果这些分节非顺序到达,接收端 TCP 将先根据它们的***重新排序,再把结果数据传递给接收应用。如果接收端 TCP 接收到来自对端的重复数据,它可以根据***判定数据是重复的,从而丢弃该数据。

TCP 提供流量控制。TCP 总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为 通告窗口 。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减小;但是当接收端应用从缓冲区中读取数据时,窗口大小就增大。通告窗口大小减为 0 是可能的:当 TCP 对应某个套接字的接收缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,才能从对端发送数据。

TCP 连接是全双工的。这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此,TCP 必须为每一个数据流方向跟踪诸如***等状态信息。建立一个全双工连接后,可以将其转换为一个单工连接。

SCTP

SCTP 提供的服务与 TCP 和 UDP 提供的类似。SCTP 在客户和服务器之间提供关联,并像 TCP 那样给应用提供可靠性、排序、流量控制、全双工数据传送。

SCTP 中使用 “关联” 一词取代 “连接” ,是为了避免这样的含义: 一个连接只涉及两个 IP 地址之间的通信。一个关联指代两个系统之间的一次通信。

与 TCP 不同的是,SCTP 是面向消息的,它提供各个记录的按序递送服务。与 UDP 一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。

SCTP 能够在所连接的端点之间提供多个流,每个流各自可靠地按序递送消息。一个流上的某个消息丢失不会阻塞同一关联其他流上的消息投递。这种做法与 TCP 正好相反,就 TCP 而言,在单一字节流中任何位置的字节丢失都将阻塞该连接其后所有数据的递送,直到该丢失被修复为止。

SCTP 还提供多宿特性,使得单个 SCTP 端点能够支持多个 IP 地址。该特性可以增强应对网络故障的健壮性。一个端点可能由多个冗余的网络连接,每个网络又可能有各自接入因特网基础设施的连接。当该端点与另外一个端点建立一个关联后,如果它的某个网络后某个跨越因特网的通路发生故障,SCTP 就可以通过切换到使用已与该关联相关的另一个地址来规避所发生的故障。