计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

传输层协议通常有很多责任。一个是创建进程到进程通信;这些协议使用端口号来完成这项责任。

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

一、UDP

        用户数据报协议User Datagram ProtocolUDP)是无连接不可靠传输层协议。它不提供主机到主机通信,它除了提供进程到进程之间的通信之外,就没有给 IP 服务增加任何东西。此外,它进行非常有限的差错检验。

1.用户数据报

        UDP 分组称为用户数据报user datagram),有 8 字节的固定头部,这个头部由 4 个字段组成,每个字段 2 字节( 16 位)。下图说明了用户数据报的格式。头两个字段定义了源和目的端口号。第三个字段定义了用户数据报的总长,即头部加数据的长度。 16 位可以定义的总长度范围是 0 65 535。然而,总长度需要更小一些,这是因为 UDP数据报存储在总长度为 65 535 IP 数据报中。最后一个字段可以携带可选校验和

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

UDP头部实例:CB84000D001C001C

  • 源端口号是头 4 位十六进制数字( CB8416,这意味着源端口号是 52100
  • 目的端口号是第二组 4 位十六进制数字( 000D16,这意味着目的端口号是 13
  • 第三组 4 位十六进制数字( 001C16定义了整个 UDP 分组的长度,长度为 28 字节。
  • 数据的长度是整个分组长度减去头部长度,即 28-8 = 20 字节。
  • 由于目的端口号是 13(熟知端口号),分组是从客户发送到服务器。
  • 客户进程是 Daytime

2.UDP提供的服务

  • 进程到进程的通信:使用套接字
  • 无连接服务
  • 流量控制:没有流量控制
  • 差错控制:没有差错控制
  • 校验和:UDP 校验和包含三部分:伪头部、 UDP 头部和从应用层来的数据,校验和的问题后续在讨论。
  • 拥塞控制:不提供拥塞控制
  • 封装和解封装:需要封装与解封
  • 多路复用与多路分解:一个主机上可能有多个使用UDP协议的进程,所以有多路复用与多路分解。

二、tcp

        传输控制协议Transmission Control ProtocolTCP)是一个面向连接可靠的协议。 TCP 显式定义了连接建立、数据传输以及连接拆除阶段来提供面向连接服务。 TCP 使用 GBN SR 协议的组合来提供可靠性。为了实现这个目的, TCP 使用校验和(为差错发现)、丢失或被破坏分组重传、累积和选择确认以及计时器。

1.tcp协议提供的服务

  • 进程到进程的通信
  • 流传递服务:IP 层作为 TCP 服务的提供者,需要以分组的方式而不是字节流的方式发送数据。在传输层, TCP 将多个字节组合在一起成为一个分组,这个分组称为segment)。 TCP 给每个段添加头部(为了达到控制目的),并将该段传递给 IP 层。段被封装到 IP 数据报中,然后再进行传输。
  • 全双工通信
  • 多路复用和多路分解
  • 面向连接的服务
  • 可靠的服务

2.tcp协议的特点

        序号系统虽然 TCP 软件能够记录发送或接收的段,但是在段的头部没有段序号字段。TCP 在段的头部采用称为序号sequence number)和确认号acknowledgment number)的两个字段。这两个字段指的是字节序号,而不是段序号。TCP 为在一个连接中传输的所有数据字节(八位字节)编号。在每个方向上序号都是独立的。当 TCP 接收来自进程的一些数据字节时, TCP 将它们存储在发送缓冲区中并给它们编号。TCP 0 232-1 之间生成一个随机数作为第一个字节的序号,例如,如果随机数是1057,并且发送的全部字节个数是 6000,那么这些字节序号是 1057~7056字节被编号后, TCP 对发送的每一个段分配一个序号。在每一个方向上的序号定义如下:

  1. 第一段的序号是初始序号( initial sequence numberISN),这是一个随机数。
  2. 其他段的序号是之前段的序号加之前段携带的字节数(实际上的或想象的)。之后,我们将给出一些控制段,它们被认为携带了一个想象字节。

        确认号: TCP 中的通信是全双工的;当建立一个连接时,双方同时都能发送和接收数据。每一方为字节编号,每一方经常使用不同的起始字节号。每一方向的序号表明了该段所携带的第一个字节的序号。每一方也使用确认号来确认它已收到的字节。但是,确认号定义了该方预期接收的下一个字节的序号。另外,确认号是累积的,这意味着接收方记下它已安全而且完整地接
收到最后一个字节的序号,然后将它加
1,并将这个结果作为确认号进行通告。

3.段

TCP的分组,称为段。

格式
计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

  • 源端口地址。这是一个 16 位的字段,它定义了在主机中发送该段的应用程序的端口号。这与 UDP 头部的源端口地址的作用一样。
  • 目的端口地址。 这是一个 16 位的字段,它定义了在主机中接收该段的应用程序的端口号。这与 UDP 头部的目的端口地址的作用一样。
  • 序号。这个 32 位的字段定义了一个数,它分配给段中数据的第一个字节。如前所述, TCP 是一种字节流传输协议。为了确保连通性,对要发送的每一个字节都进行编号。序号告诉目的端,在这个序列中哪一个字节是该段的第一个字节。在连接建立时,每一方都使用随机数生成器产生一个初始序号initial sequence numberISN,通常每一个方向的 ISN 都不同。
  • 确认号。这个 32 位的字段定义了段的接收方期望从对方接收的字节号。如果段的接收方成功地接收了对方发来的字节号 x,它就将确认号定义为 x + 1,确认和数据可捎带一起发送。
  • 头部长度。这个 4 位的字段指明了 TCP 头部*有多少个 4 字节长的字。头部的长度可以在 20 字节到 60 字节之间。因此,这个字段的值在 55 × 4 = 20)到 1515 × 4 = 60)之间。
  • 控制字段

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

  • 窗口大小:这个字段定义对方必须维持的窗口的大小(以字节为单位)。注意,这个字段的长度是 16 位,这意味着窗口的最大长度是 65 535 字节。这个值通常称为接收窗口rwnd),它由接收方确定。此时,发送方必须服从接收端的支配。
  • 校验和:这个 16 位的字段包含了校验和。 TCP 校验和的计算过程与前面描述的 UDP 所采用的计算过程相同。但是,在 UDP 数据报中校验和是可选的。然而,对 TCP 来说,将校验和包含进去是强制的。起相同作用的伪头部被加到段上 计算机网络教程-传输层(十四)UDP协议、TCP协议【上】
  • 紧急指示符
  • 选项

4.tcp连接

连接建立:三次握手

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

        该过程从服务器开始。服务器程序告诉它的 TCP,它已准备好接收一个连接。这就称为被动打开passive open)。虽然 TCP 已经准备好接收从世界上任何一个机器发来的连接,但它自己并不能完成这个连接。客户程序发出请求进行主动打开active open)。想要与服务器进行连接的客户告诉它的 TCP它需要连接到特定的服务器。

  1. 客户发送的第一个段是 SYN 段。这个段仅有 SYN 标志被置位,它用于序号同步。它占用一个序号。当数据传输开始时,在我们的例子中,客户随机选择一个数字作为初始序号( ISN。注意,这个段不包含确认号。它也没有定义窗口大小;窗口大小的定义只有当段包含确认号时才有意义。 SYN段不携带数据,但他占一个***
  2. 服务器发送第二个段,两个标志位 SYN ACK 置位的段,即 SYN +ACK 段。这个段有两个目的。首先,它是另一方向通信的 SYN 段。服务器使用这个段来初始化序号,这个序号用来给从服务器发向客户的字节编号。服务器也通过给 ACK 置位并展示下一个序号来确认接收到来自客户的 SYN 段,这里的下一个序号是服务器预期从客户接收的序号。我们将在介绍流量控制那一节看到,因为它包含确认,它也需要定义接收窗口,即 rwnd(客户使用)。因为这个段起到 SYN段的作用,它需要被确认。因此,它占用一个序号。 SYN + ACK 段不携带数据,但它占用一个序号。
  3. 客户发送第三个段。这个段仅仅是一个 ACK 段。它使用 ACK 标志和确认序号字段来确认收到了第二个段。注意,如果不携带数据, ACK 段没有占用任何序号,但是一些实现允许这第三个段在连接阶段从客户端携带第一块数据。在这种情况下,段消耗的序号与数据字节数相同。ACK 段,如果不携带数据,则它不占用序号。

数据传输

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

        在连接建立后,客户端用两个段发送 2000 个字节的数据。然后,服务器用一个段发送 2 000 个字节的数据。客户端发送另一个段。前面三个段携带数据与确认,但是最后一个段仅携带确认,这是因为已没有数据发送了。注意序号与确认号数值,客户端发送的数据段有 PSH(推送)标志,所以服务器 TCP 知道在接收到数据时立刻传递给服务器进程。

连接终止
交换数据双方的任一方(客户或服务器)都可关闭连接,尽管通常情况下是由客户端发起。当前大多数对连接终止的实现有两个方法:三次握手带有半关闭选项的四次握手
  • 三次握手
  1. 在正常情况下,在客户进程接收到一个关闭命令后,客户的 TCP 发送第一个段: FIN 段,即其中的 FIN 标志置位。注意, FIN 段可包含客户机要发送的最后数据块,或如下图所示的只是控制段。如果它只是控制段,它仅占有一个序号因为它需要被确认。如果 FIN 段不携带数据,则该段占用一个序号。
  2. 服务器 TCP 接收到 FIN 段后,通知它的进程,并发送第二个段: FIN + ACK 段,证实它接收到来自客户端的 FIN 段,同时通告另一端连接关闭。这个段还可以包含来自服务器的最后数据块。如果它不携带数据,则这个段仅占用一个序号。如果 FIN + ACK 段没有携带数据,则该段仅占用一个序号。
  3. 客户端的 TCP 发送最后一段,即 ACK 段,来证实它接收到来自服务器的 FIN 段。这个段包含确认号,它是来自服务器的 FIN 段的序号加 1。这个段不携带数据也不占用序号。
计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

  • 半关闭

TCP 中,一端可以停止发送数据后,还可以接续接收数据。这就是所谓的半关闭half-close)。虽然任一端都可发出半关闭,但通常都是由客户端发起的。当服务器在开始处理之前需要接收到所有数据,这时就会出现半关闭。

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

        从客户到服务器的数据传输停止。客户端通过发送 FIN 段实现半关闭连接。服务器通过发送ACK 段确认半关闭。然而,服务器还可以发送数据。当服务器已经发送完被处理的数据时,它发 送一个 FIN 段。该 FIN 段由客户端的 ACK 来确认。连接半关闭后,数据可以从服务器传送给客户端,而确认可以从客户端传送给服务器。客户不能再向服务器发送任何数据。

5.TCP协议的有限状态机

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

状态表如下

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

        圆角矩形代表状态。从一个状态到另一个状态的转换使用直线表示。每条线有两个字符串,它们用斜线分隔。第一个字符串是输入,即 TCP 所接收的内容。第二个字符串是输出,即 TCP 所发送的内容。图中虚线代表服务器通常经历的转换;黑色实线给出客户通常经历的转换。然而,在某种情况下,服务器沿着实线进行状态转换,客户沿着虚线进行状态转换。灰色线给出特殊情况。注意,被标记为 ESTABLISHED 的圆角矩形实际上是两种状态,一个是客户状态,另一个是服务器状态。
一个半关闭连接的场景图

        客户进程向它的 TCP 发出主动打开命令来请求连接到特定套接字地址。 TCP 发送一个 SYN 段并转移到 SYN-SENT 状态。在收到 SYN + ACK 段后,TCP 发送了一个 ACK 段并且进入 ESTABLISHED状态。数据被传输,可能是双向的,并且被确认。当客户进程没有数据要发送了,它发出称为主动关闭的命令。 TCP 发送 FIN 段并进入 FIN-WAIT-1 状态。当它接收到 ACK 段,它进入 FIN-WAIT-2 状态。当客户接收到 FIN 段时,它发送一个 ACK 段并进入 TIME-WAIT 状态。客户保持这种状态 2MSL。当相应计时器超时,客户进入 CLOSED 状态。
        服务器进程发出被动打开命令。服务器 TCP 进入 LISTEN 状态并且保持这种状态直到它接收到一个 SYN 段。 TCP 之后发送一个 SYN + ACK 段并且进入 SYN-RCVD 状态,等待客户发送 ACK段。在接收到 ACK 段后, TCP 进入 ESTABLISHED 状态,这就开始了数据传输。 TCP 保持这种状态直到它接收到一个来自客户的 FIN 段,这表示没有其他数据要被交换且连接可以被关闭。一旦服务器接收到 FIN 段,那么它就向客户发送带有虚拟 EOF 标记的排队中所有的数据,这意味连接必须被关闭。它发送一个 ACK 段且进入 CLOSE-WAIT 状态,但是推迟确认来自客户的 FIN 段,直到它接收到来自进程的被动关闭命令。在接收到被动关闭命令后,服务器向客户发送 FIN 段并进入 LAST-ACK 状态,等待最终 ACK。当 ACK 段被从客户接收,服务器进入 CLOSE 状态。

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】

计算机网络教程-传输层(十四)UDP协议、TCP协议【上】