TCP建立连接
- 请求端(客户端)发送一个SYN指明客户端打算连接的服务器端口号,以及初始序列号。
- 服务端发回包含服务器的初始序号的SYN报文段作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN占用一个序号。
客户端必须将确认序号设置为服务端的ISN加1以对服务器的SYN报文段进行确认。
TCP连接终止
建立一个连接需要三次握手,而终止一个连接要经过4次握手。这是由TCP的半关闭造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独的进行关闭。
- 客户端发送一个FIN,用来关闭从客户端到服务端的数据传送。
服务端收到这个FIN,发回一个ACK,确认序号为收到的序号加一。和SYN一样,一个FIN将占用一个序号。
服务端完成数据传送,发送给客户端一个FIN。
客户端收到FIN之后,发送给服务端一个ACK。
TCP的半关闭
TCP提供了连接的一端在结束他的发送后还能接受来自另一端数据的能力。这就是所谓的半关闭。
为了使用这个特性,编程接口必须为应用程序提供一种方式来说明“我已经完成了数据传送,因此发送一个文件结束(FIN)给另一端,但我还想接收另一端发来的数据,直到它给我发来文件结束(FIN)”。
MSL(Maximum Segment LIfetime)
每个具体TCP实现必须选择一个报文段最大生存时间MSL。他是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。对于IP数据报TTL的限制是基于跳数,而不是定时器。对于一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可以让TCP再次发送最后的Ack以防止这个ACK丢失(另一端超时并重发最后的FIN)