三路握手
建立一个TCP连接时会发生下述情形。
1)服务器必须准备好接受外来的连接。这通常通过调用socket,bind和listen这3个函数来完成,我们称之为被动打开(passive open)。
2)客户通过调用connect发起主动打开(active open)。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在IP数据报只含有一个IP首部,一个TCP首部及可能有的TCP选项。
3)服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
4)客户必须确认服务器的SYN。
这种交换至少需要3个分组,因此称之为TCP的三路握手。
如图给出的客户的初始序列号为J,服务器的初始序列号为K。ACK中的确认号是发送这个ACK的一端所期待的下一个序列号。因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中的确认号就是该SYN的初始序列号加1。类似地,每一个FIN(表示结束)的ACK中的确认号为该FIN的序列号加1。
TCP常用选项
1)MSS选项。发送SYN的TCP一端使用本选项通告对端它的最大分节大小即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量。
2)窗口规模选项。
3)时间戳选项。这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。
TCP连接终止
TCP建立一个连接需要3个分节,终止一个连接需要4个分节。
1)某个应用进程首先调用close,我们称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2)接受到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接受。
3)一端时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
4)接收这个最终FIN的原发送端TCPO(即执行主动关闭的那一端)确认这个FIN。
既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。我们使用限定词“通常”是因为:某些情形下步骤1的FIN随数据一起发送, 另外,步骤2和步骤3发送的分节都出自执行被动关闭的那一端,有可能被合并成一个分节。