计算机网络教程-传输层协议-TCP(2) - STEMHA's Blog

计算机网络教程-传输层协议-TCP(2)

TCP 连接

在 TCP 中,面向连接的传输需要三个过程:连接建立、数据传输和连接终止。
在TCP 中的分组称为段(segment)

TCP段

格式

段包含20~60字节的头部,接着是来自应用程序的数据。如果没有选项,那么头部是20 字节;如果有选项,最多是60 字节。
TCP段格式

  • 源端口地址。这是一个16 位的字段,它定义了在主机中发送该段的应用程序的端口号。这与UDP 头部的源端口地址的作用一样。
  • 目的端口地址。这是一个16 位的字段,它定义了在主机中接收该段的应用程序的端口号。这与UDP 头部的目的端口地址的作用一样。
  • 序号。这个32 位的字段定义了一个数,它分配给段中数据的第一个字节。
    • TCP 是一种字节流传输协议。为了确保连通性,对要发送的每一个字节都进行编号。序号告诉目的端,在这个序列中哪一个字节是该段的第一个字节。
    • 在连接建立时,每一方都使用随机数生成器产生一个初始序号(initial sequence number,ISN),通常每一个方向的ISN 都不同。
  • 确认号。这个32 位的字段定义了段的接收方期望从对方接收的字节号。如果段的接收方成功地接收了对方发来的字节号x,它就将确认号定义为x + 1.
    • 确认和数据可捎带一起发送。
  • 头部长度。这个4 位的字段指明了TCP 头部中共有多少个4字节长的字。
    • 头部的长度可以在20 字节到60 字节之间。因此,这个字段的值在5(5 × 4 = 20)到15(15 × 4 = 60)之间。
  • 窗口大小。这个字段定义对方必须维持的窗口的大小(以字节为单位)
    • 注意,这个字段的长度是16 位,这意味着窗口的最大长度是65 535 字节。这个值通常称为接收窗口(rwnd)
    • 它由接收方确定。此时,发送方必须服从接收端的支配。
  • 紧急指示符。这个16 位的字段只有当紧急标志置位时才有效,这个段包含了紧急数据。
    • 它定义了一个数,将此数加到序号上就得出此段数据部分中最后一个紧急字节。
  • 选项。在TCP 头部中可以有多达40 个字节的可选信息。

控制字段

这个字段定义了6 种不同的控制位或标记,如图所示。

  • 在同一时间可以设置一位或多位。
  • 这些位用在TCP 的流量控制、连接建立和终止、连接失败和数据传送方式等方面。
    TCP段控制字段

校验和。

这个16 位的字段包含了校验和。TCP 校验和的计算过程与前面描述的UDP 所采用的计算过程相同。
但是,在UDP 数据报中校验和是可选的。

  • 然而,对TCP 来说,将校验和包含进去是强制的。
  • 起相同作用的伪头部被加到段上。对TCP 伪头部,协议字段的值是6。如图所示。
  • 在 TCP 中使用校验和是强制的。
    加到TCP 数据报上的伪头部

连接建立(三次握手)

TCP 以全双工方式传输数据。当两个机器中的两个TCP 建立连接后,它们就能够同时向对方发送段。这就表示,在传输数据之前,每一方都必须对通信进行初始化,并得到对方的认可。
三次握手(three-way handshaking)
客户的应用程序想要与另一个称为服务器的应用程序使用TCP 作为传输层协议建立连接。

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

少数几个必须要知道的字段,如果序号确认号控制标记(仅仅是其中被置位的)和窗口大小等有值。三个步骤如下:

  1. 客户发送的第一个段,即SYN 段。这个段仅有SYN 标志被置位,它用于序号同步。它占用一个序号。当数据传输开始时,在我们的例子中,客户随机选择一个数字作为初始序号(ISN)。注意,这个段不包含确认号。它也没有定义窗口大小;窗口大小的定义只有当段包含确认号时才有意义。段也能包含一些稍后讨论的选项。
    • 注意,SYN 段是一个控制段并且不携带数据。然而,它消耗一个序号,因为它需要被确认。我们可以说SYN 段携带了一个假想字节。

SYN 段不携带数据,但它占用一个序号。看下面的图就明白了。

  1. 服务器发送第二个段,即SYN +ACK 段。这个段有两个目的。
    • 首先,它是另一方向通信的SYN 段。服务器使用这个段来初始化序号,这个序号用来给从服务器发向客户的字节编号。
    • 其次,服务器也通过给ACK 置位并展示下一个序号来确认接收到来自客户的SYN 段,这里的下一个序号是服务器预期从客户接收的序号。
    • 我们将在介绍流量控制那一节看到,因为它包含确认,它也需要定义接收窗口,即rwnd(客户使用)。因为这个段起到SYN段的作用,它需要被确认。因此,它占用一个序号。

SYN + ACK 段不携带数据,但它占用一个序号。

  1. 客户发送第三个段,即ACK 段。它使用ACK 标志和确认序号字段来确认收到了第二个段。
    • 注意,如果不携带数据,ACK 段没有占用任何序号,但是一些实现允许这第三个段在连接阶段从客户端携带第一块数据。在这种情况下,段消耗的序号与数据字节数相同。

ACK 段,如果不携带数据,则它不占用序号。

TCP使用三次握手建立连接

数据传输

连接建立后,可进行双向数据传输,客户端与服务器双方都可发送数据和确认。
数据捎带确认:在同一段内携带确认时,在同一方向上也可以传递数据。

图示

在这个例子中,在连接建立后,客户端用两个段发送2000 个字节的数据。然后,服务器用一个段发送2000 个字节的数据。客户端发送另一个段。

  • 前面三个段携带数据与确认,但是最后一个段仅携带确认,这是因为已没有数据发送了。
  • 注意序号与确认号数值,客户端发送的数据段有PSH(推送)标志,所以服务器TCP 知道在接收到数据时立刻传递给服务器进程。
  • 另一方面,来自服务器的段没有设置推送标志。大多数TCP 的实现都有可选标志,可设置或不设置。

TCP数据传输

推送数据

发送方的TCP 使用缓冲区存储来自发送方应用程序的数据流。发送方的TCP 可以选择段的大小。
接收方的TCP 在数据到达时也将数据进行缓存,并当应用程序准备就绪时或当接收端TCP 认为方便时将这些数据传递给应用程序。这种灵活性增加了TCP 的效率。

但是,在有些情况下,应用程序并不需要这种灵活性。例如,应用程序与另一方应用程序进行交互式通信。

  • 一方的应用程序打算将其信息发给对方应用程序,并希望接收到立即响应。数据的延迟传输和延迟传递对这个应用程序来说是不可接受的。

TCP 可以处理这种情况。

  • 在发送端的应用程序可请求推送操作。这就表示发送端的TCP 不必等待窗口被填满。
  • 它创建一个段就立即将其发送。发送端的TCP 还必须设置推送位(PSH)以告诉接收端的TCP,这个段所包含的数据必须尽快地传递给接收应用程序,而不要等待更多数据的到来。
  • 这意味着将面向字节的TCP 改为面向块的TCP,但是TCP 可以选择使用或不使用这个特性。

连接终止(四次挥手)

TCP四次挥手关闭连接

半关闭

半关闭(half-close):指在 TCP 中,一端可以停止发送数据后,还可以接续接收数据。(关闭发送但是不关闭接收
虽然任一端都可发出半关闭,但通常都是由客户端发起的。当服务器在开始处理之前需要接收到所有数据,这时就会出现半关闭。
例如,排序是一个很好的例子。客户端发送数据给服务器进行排序,在开始排序之前,服务器需要接收到全部数据。

  • 这就是说,客户端发送全部数据之后,它在客户到服务器方向可关闭连接。(客户端关闭发送)
  • 但为了返回存储数据,服务器到客户方向必须保持打开。(客户端不关闭接收)
  • 服务器在接收数据后还需要时间进行排序;它的向外方向必须保持打开。

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

连接重置

在一端的TCP 可能拒绝连接请求,可能终止已存在的连接,也可能结束空闲连接。所有这些都通过RST(重置)标志完成。

参考资料

详细分析TCP数据的传输过程
【网络通信】TCP的通信过程
图解TCP传输过程(三次握手、数据传输、四次挥手)
TCP 的那些事儿(上)
TCP 的那些事儿(下)
一个TCP连接上能发起多少个HTTP请求吗?
计算机网络教程-自顶向下方法

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×