在 TCP 中,面向连接的传输需要三个过程:连接建立、数据传输和连接终止。
在TCP 中的分组称为段(segment)
段包含20~60字节的头部,接着是来自应用程序的数据。如果没有选项,那么头部是20 字节;如果有选项,最多是60 字节。
源端口地址
。这是一个16 位的字段,它定义了在主机中发送该段的应用程序的端口号。这与UDP 头部的源端口地址的作用一样。目的端口地址
。这是一个16 位的字段,它定义了在主机中接收该段的应用程序的端口号。这与UDP 头部的目的端口地址的作用一样。序号
。这个32 位的字段定义了一个数,它分配给段中数据的第一个字节。初始序号(initial sequence number,ISN)
,通常每一个方向的ISN 都不同。确认号
。这个32 位的字段定义了段的接收方期望从对方接收的字节号。如果段的接收方成功地接收了对方发来的字节号x,它就将确认号定义为x + 1.头部长度
。这个4 位的字段指明了TCP 头部中共有多少个4字节长的字。窗口大小
。这个字段定义对方必须维持的窗口的大小(以字节为单位)。接收窗口(rwnd)
。紧急指示符
。这个16 位的字段只有当紧急标志置位时才有效,这个段包含了紧急数据。选项
。在TCP 头部中可以有多达40 个字节的可选信息。这个字段定义了6 种不同的控制位或标记,如图所示。
这个16 位的字段包含了校验和。TCP 校验和的计算过程与前面描述的UDP 所采用的计算过程相同。
但是,在UDP 数据报中校验和是可选的。
TCP 以全双工方式传输数据。当两个机器中的两个TCP 建立连接后,它们就能够同时向对方发送段。这就表示,在传输数据之前,每一方都必须对通信进行初始化,并得到对方的认可。三次握手(three-way handshaking)
:
客户的应用程序想要与另一个称为服务器的应用程序使用TCP 作为传输层协议建立连接。
该过程从服务器开始。服务器程序告诉它的TCP,它已准备好接收一个连接。这就称为被动打开(passive open)
。
虽然TCP 已经准备好接收从世界上任何一个机器发来的连接,但它自己并不能完成这个连接。
客户程序发出请求进行主动打开(active open)
。想要与服务器进行连接的客户告诉它的TCP,它需要连接到特定的服务器。
少数几个必须要知道的字段,如果序号
、确认号
、控制标记
(仅仅是其中被置位的)和窗口大小
等有值。三个步骤如下:
客户发送的第一个段
,即SYN 段
。这个段仅有SYN 标志被置位,它用于序号同步。它占用一个序号。当数据传输开始时,在我们的例子中,客户随机选择一个数字作为初始序号(ISN)
。注意,这个段不包含确认号。它也没有定义窗口大小;窗口大小的定义只有当段包含确认号时才有意义。段也能包含一些稍后讨论的选项。SYN 段不携带数据,但它占用一个序号。看下面的图就明白了。
服务器发送第二个段
,即SYN +ACK 段
。这个段有两个目的。接收窗口,即rwnd(客户使用)
。因为这个段起到SYN段的作用,它需要被确认。因此,它占用一个序号。SYN + ACK 段不携带数据,但它占用一个序号。
客户发送第三个段
,即ACK 段
。它使用ACK 标志和确认序号字段来确认收到了第二个段。ACK 段,如果不携带数据,则它不占用序号。
连接建立后,可进行双向数据传输,客户端与服务器双方都可发送数据和确认。数据捎带确认
:在同一段内携带确认时,在同一方向上也可以传递数据。
在这个例子中,在连接建立后,客户端用两个段发送2000 个字节的数据。然后,服务器用一个段发送2000 个字节的数据。客户端发送另一个段。
PSH(推送)标志
,所以服务器TCP 知道在接收到数据时立刻传递给服务器进程。发送方的TCP 使用缓冲区存储来自发送方应用程序的数据流。发送方的TCP 可以选择段的大小。
接收方的TCP 在数据到达时也将数据进行缓存,并当应用程序准备就绪时或当接收端TCP 认为方便时将这些数据传递给应用程序。这种灵活性增加了TCP 的效率。
但是,在有些情况下,应用程序并不需要这种灵活性。例如,应用程序与另一方应用程序进行交互式通信。
TCP 可以处理这种情况。
推送位(PSH)
以告诉接收端的TCP,这个段所包含的数据必须尽快地传递给接收应用程序,而不要等待更多数据的到来。半关闭(half-close)
:指在 TCP 中,一端可以停止发送数据后,还可以接续接收数据。(关闭发送但是不关闭接收)
虽然任一端都可发出半关闭,但通常都是由客户端发起的。当服务器在开始处理之前需要接收到所有数据,这时就会出现半关闭。
例如,排序是一个很好的例子。客户端发送数据给服务器进行排序,在开始排序之前,服务器需要接收到全部数据。
从客户到服务器的数据传输停止。客户端通过发送FIN 段实现半关闭连接。服务器通过发送ACK 段确认半关闭。
然而,服务器还可以发送数据。当服务器已经发送完被处理的数据时,它发送一个FIN 段。该FIN 段由客户端的ACK 来确认。
连接半关闭后,数据可以从服务器传送给客户端,而确认可以从客户端传送给服务器。客户不能再向服务器发送任何数据。
在一端的TCP 可能拒绝连接请求,可能终止已存在的连接,也可能结束空闲连接。所有这些都通过RST(重置)标志完成。
详细分析TCP数据的传输过程
【网络通信】TCP的通信过程
图解TCP传输过程(三次握手、数据传输、四次挥手)
TCP 的那些事儿(上)
TCP 的那些事儿(下)
一个TCP连接上能发起多少个HTTP请求吗?
计算机网络教程-自顶向下方法
Update your browser to view this website correctly. Update my browser now