第十八章 TCP连接的建立与终止

 

18.2   连接的建立与终止

18.2.3   建立连接协议

为了建立一条 TCP连接:

1) 请求端(通常称为客户)发送一个 SYN段指明客户打算连接的服务器的端口,以及初 始序号( ISN,在这个例子中 1415531521。这SYN段为报文段 1

2) 服务器发回包含服务器的初始序号的 SYN报文段(报文段 2)作为应答。同时,将确认 序号设置为客户的 ISN1以对客户的 SYN报文段进行确认。一个 SYN将占用一个序号。

3) 客户必须将确认序号设置为服务器的 ISN1以对服务器的 SYN报文段进行确认(报文 3

这三个报文段完成连接的建立。这个过程也称为三次握手 three-way handshake

发送第一个 SYN的一端将执行主动打开( active open )。接收这个 SYN并发回下一个 SYN的另一端执行被动打开( passive open)。 当一端为建立连接而发送它的 SYN时,它为连接选择一个初始序号。 ISN随时间而变化,因此每个连接都将具有不同的 ISNRFC 793 [Postel 1981c]指出ISN可看作是一个 32比特的计 数器,每 4ms1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而 导致某个连接的一方对它作错误的解释。

18.2.4   连接终止协议

建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由 TCP的半关闭( half- close)造成的。既然一个 TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方 向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个 FIN来终止 这个方向连接。当一端收到一个 FIN,它必须通知应用层另一端几经终止了那个方向的数据传 送。发送 FIN通常是应用层进行关闭的结果。

收到一个 FIN只意味着在这一方向上没有数据流动。一个 TCP连接在收到一个 FIN后仍能 发送数据。而这对利用半关闭的应用来说是可能的,尽管在实际应用中只有很少的 TCP应用程序这样做。

首先进行关闭的一方(即发送第一个 FIN)将执行主动关闭,而另一方(收到这个 FIN 执行被动关闭

18.4   最大报文段长度

最大报文段长度( MSS表示 TCP传往另一端的最大块数据的长度。当一个连接建立时, 连接的双方都要通告各自的 MSS。我们已经见过 MSS都是1024。这导致 IP数据报通常是 40 节长:20字节的TCP首部和20字节的IP首部。

在有些书中,将它看作可“协商”选项。它并不是任何条件下都可协商。当建立一个连 接时,每一方都有用于通告它期望接收的 MSS选项(MSS选项只能出现在 SYN报文段中)。如果一方不接收来自另一方的 MSS值,则 MSS就定为默认值 536字节(这个默认值允许 20字节的 IP首部和20字节的TCP首部以适合 576字节IP数据报)

一般说来,如果没有分段发生, MSS还是越大越好(这也并不总是正确,参见图 24-3 24-4中的例子)。报文段越大允许每个报文段传送的数据就越多,相对 IPTCP首部有更高 的网络利用率。当 TCP发送一个 SYN时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将MSS值设置为外出接口上的 MTU长度减 去固定的 IP首部和TCP首部长度。对于一个以太网, MSS值可达1460字节。使用 IEEE 802.3 封装(参见 2.2节),它的MSS可达1452字节。

18.5  TCP的半关闭

TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。正如我们早些时候提到的只有很少的应用程序使用它。

18.6   TCP的状态变迁图

18.6.1  2MSL等待状态

TIME_WAIT状态也称为 2MSL等待状态。每个具体 TCP实现必须选择一个报文段最大生 存时间 MSLMaximum Segment Lifetime 。它是任何报文段被丢弃前在网络内的最长时间。 我们知道这个时间是有限的,因为 TCP报文段以 IP数据报在网络内传输,而 IP数据报则有限制 其生存时间的 TTL字段。

对一个具体实现所给定的 MSL值,处理的原则是:当 TCP执行一个主动关闭,并发回最后一个 ACK,该连接必须在 TIME_WAIT状态停留的时间为 2倍的MSL。这样可让 TCP再次发 送最后的 ACK以防这个 ACK丢失(另一端超时并重发最后的 FIN)。这种 2MSL 等待的另一个结果是这个 TCP连接在 2MSL等待期间,定义这个连接的插口(客户的 IP地址和端口号,服务器的 IP地址和端口号)不能再被使用。这个连接只能在 2MSL结束后才能再被使用。

18.7   复位报文段

我们已经介绍了  TCP首部中的  RST比特是用于“复位”的。一般说来,无论何时一个报文 段发往基准的连接( referenced connection)出现错误, TCP都会发出一个复位报文段(这里 提到的“基准的连接”是指由目的   IP地址和目的端口号以及源  IP地址和源端口号指明的连接。

18.8   同时打开

两个应用程序同时彼此执行主动打开的情况是可能的,尽管发生的可能性极小。每一方 必须发送一个 SYN,且这些 SYN必须传递给对方。这需要每一方使用一个对方熟知的端口作 为本地端口。这又称为同时打开( simultaneous open)。

TCP是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连 接(其他的协议族,最突出的是 OSI运输层,在这种情况下将建立两条连接而不是一条连接)。

18.9   同时关闭

我们在以前讨论过一方(通常但不总是客户方)发送第一个 FIN执行主动关闭。双方都执行主动关闭也是可能的, TCP协议也允许这样的同时关闭( simultaneous close)。

你可能感兴趣的:(第十八章 TCP连接的建立与终止)