TCP连接的建立和终止(记录)
本文纯是为了记录我看的书《UNIX网络编程套接字API》中的写的TCP协议部分知识,记不住啊啊。。。
TCP建立连接
建立TCP连接时会发生的事,(1)服务器必须准备好接受外来的连接。这通常调用socket、bind和listen这3个函数完成,称为“被动打开”。
(2)客户通过调用connect发起主动打开。这将导致客户TCP发送一个SYN(同步)分节(PS:好像是一种特殊的报文),它告诉服务器客户将在(构建立的)连接中发送的数据的初始序列号。通常SYN分节不携带数据,其中在IP数据包只含一个IP首部。一个TCP首部及又可能的TCP选项。
(3)服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,其含有服务器将同一个连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)。
(4)客户必须确认服务器的SYN,到此完成传说中的三次握手。
以下是流程图:
图中可知,客户给出的初始序列号为J,服务器初始序列号为K,它们都会将接到的SYN序列号加1之后发送。
TCP选项
TCP选项分别有MSS选项,用来通知对端它的最大分节大小;窗口规模选项,通知对端窗口大小;时间戳选项。
TCP连接终止
TCP建立连接时需要3个分节,但在终止连接时则需要4个,因为要实现“4次握手”。
(1)某个应用程序首先调用close
,称此端进行主动关闭(active close)。
该端发送一个FIN分节,表示数据发送完毕。
(2)接受到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接受作为文件结束符(EOF)传递给接收端应用程序(放在已排队等候该应用进程的任何其他数据之后),因为接受FIN意味着接收端进程相应连接上不再需要数据。
(3)一段时间后,接收到这个文件结束符的进程将调用close关闭套接字。这导致它的TCP也发生一个FIN。
(4)接受这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。
流程图如下: