同时打开:
两个应用程序同时彼此执行主动打开的情况是可能的,但是发生的可能性极小。每一方必须发送一个SYN,且这些SYN必须传递给对方。这需要每一方使用一个对方熟知的端口作为本地端口。这又称为同时打开( simultaneous open)。两端必须几乎在同时启动,以便收到彼此的SYN。只要两端有较长的往返时间就能保证这一点。
TCP是特意设计为了可以处理同时打开,对于同时打开它仅建立一条连接而不是两条连接(其他的协议族,最突出的是OSI运输层,在这种情况下将建立两条连接而不是一条连接)出现同时打开的情况时,两端几乎在同时发送SYN,并进入 SYN_SENT状态。当每一端收到SYN时,状态变为SYN_RCVD,同时它们都再发SYN并对收到的SYN进行确认。当双方都收到SYN及相应的ACK时,状态都变迁为ESTABLISHED。
个同时打开的连接需要交换4个报文段,比正常的三次握手多一个。此外,要注意的是我们没有将任何一端称为客户或服务器,因为每一端既是客户又是服务器。
同时关闭
我们在以前讨论过一方(通常但不总是客户方)发送第一个 FIN执行主动关闭。双方都执行主动关闭也是可能的,TCP协议也允许这样的同时关闭( simultaneous close)。
当应用层发出关闭命令时,两端均从ESTABLISHED变为FIN _ WAIT_1。
这将导致双方各发送一个 FIN,两个FI N经过网络传送后分别到达另一端。收到FIN后,状态由F I N_WAIT_1变迁到 C L O S I N G,并发送最后的ACK。当收到最后的 ACK时,状态变化为TIME _ WAIT。
同时关闭与正常关闭使用的段交换数目相同。