TCP连接的建立

TCP连接的建立和关闭_应用进程

TCP使用三次握手( three-way handshake )协议来建立连接。三次握手协议可以完成两个重要功能:它确保连接双方做好传输准备,并使双方统一了初始顺序号。

这三次握手为:
1.请求端(通常称为客户)发送一个 SYN 报文段( SYN 为 1 )指明客户打算连接的服务器的端口,以及初始顺序号( ISN )。
2.服务器发回包含服务器的初始顺序号的 SYN 报文段( SYN 为 1 )作为应答。同时,将确认号设置为客户的 ISN 加 1 以对客户的 SYN 报文段进行确认( ACK 也为 1 )。
3.客户必须将确认号设置为服务器的 ISN 加 1 以对服务器的 SYN 报文段进行确认( ACK 为 1 ),该报文通知目的主机双方已完成连接建立。

 

TCP连接的关闭

TCP连接的建立和关闭_顺序号_02
TCP使用四次握手( four-way handshake )协议来关闭连接。这是因为 TCP 的半关闭( half-close )造成的。

由于一个 TCP 连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。关闭的原则就是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向连接。当一端收到一个 FIN ,它必须通知应用层另一端已经终止了那个方向的数据传送。

从一方的 TCP 来说,连接的关闭有三种情况:

1.本方启动关闭
  收到本方应用进程的关闭命令后, TCP 在发送完尚未处理的报文段后,发 FIN = 1 的报文段给对方,且 TCP 不再受理本方应用进程的数据发送。在 FIN 以前发送的数据字节,包括 FIN ,都需要对方确认,否则要重传。注意 FIN 也占一个顺序号。一旦收到对方对 FIN 的确认以及对方的 FIN 报文段,本方 TCP 就对该 FIN 进行确认,在等待一段时间,然后关闭连接。等待是为了防止本方的确认报文丢失,避免对方的重传报文干扰新的连接。

2.对方启动关闭
  当 TCP 收到对方发来的 FIN 报文时,发 ACK 确认此 FIN 报文,并通知应用进程连接正在关闭。应用进程将以关闭命令响 应。 TCP 在发送完尚未处理的报文段后,发一个 FIN 报文给对方 TCP ,然后等待对方对 FIN 的确认,收到确认后关闭连接。若对方的确认未及时到达,在等待一段时间后也关闭连接。

3.双方同时启动关闭
  连接双方的应用进程同时发关闭命令,则双方 TCP 在发送完尚未处理的报文段后,发送 FIN 报文。各方 TCP 在 FIN 前所发报文都得到确认后,发 ACK 确认它收到的 FIN 。各方在收到对方对 FIN 的确认后,同样等待一段时间再关闭连接。这称之为同时关闭( simultaneous close )。

TCP连接的状态变迁

TCP连接的建立和关闭_三次握手_03

状 态           描 述

CLOSED          关闭状态,没有连接活动或正在进行

LISTEN          监听状态,服务器正在等待连接进入

SYN RCVD        收到一个连接请求,尚未确认

SYN SENT        已经发出连接请求,等待确认

ESTABLISHED     连接建立,正常数据传输状态

FIN WAIT 1      (主动关闭)已经发送关闭请求,等待确认

FIN WAIT 2      (主动关闭)收到对方关闭确认,等待对方关闭请求

TIMED WAIT      完成双向关闭,等待所有分组死掉

CLOSING         双方同时尝试关闭,等待对方确认

CLOSE WAIT      (被动关闭)收到对方关闭请求,已经确认

LAST ACK        (被动关闭)等待最后一个关闭确认,并等待所有分组死掉