TCP建立连接,三路握手:
- 服务器必须准备好接受外来的连接。这通过调用socket、bind和listen函数来完成,称为被动打开;
- 客户通过调用connect进行主动打开。这引起客户TCP发送一个SYN分节,它告诉服务器客户将在连接数据中发送的数据的初始序列号;
- 服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一个连接中发送的数据的初始序列号。服务器以单个分节发送SYN和客户SYN的ACK;
- 客户必须确认服务器的SYN。
连接过程示意图:
![](https://img-my.csdn.net/uploads/201205/31/1338443043_3174.jpg)
TCP终止连接,四路分手:
- 某个应用进程首先调用close,我们称这一端执行主动关闭。这一端的TCP发送一个FIN分节,表示数据发送完毕。
- 接收到FIN的另一端执行被动关闭。这个FIN由TCP确认。它的接收也作为文件结束符传递给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着应用进程正在相应的连接上再也接收不到额外数据。
- 一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发生送一个FIN。
- 接收到这个FIN的原发送方TCP对它进行确认。
终止过程示意图:
![](https://img-my.csdn.net/uploads/201205/31/1338443064_7133.jpg)
存在TIME_WAIT状态的理由:
- 实现终止TCP全双工连接的可靠性;
- 允许老的重复分节在网络中消逝;
第一个的理由:假设最终的ACK丢失,服务器将重发最终的FIN,因此客户必须维护状态信息以允许它重发最终的ACK。如果不维护状态信息,它将响应以RST,而服务器则把该分节解释成一个错误。如果TCP打算执行所有必要的工作以彻底终止某个连接上两个方向的数据流,那么它必须正确处理连接终止序列四个分节中任何一个分节的丢失情况。
第二个的理由:假设206.62.226.33端口1500和198.69.10.2端口21之间有一个TCP连接。我们关闭这个连接之后,在以后某个时候用重新建立起相同的IP地址和端口之间的TCP连接。后一个连接成为前一个连接的化身,因为他们的IP地址和端口号都相同。TCP必须防止来自一个某个连接的老重复分组在连接终止后再现,从而被误解成属于同一个连接的化身。要实现这个功能,TCP不能给处于TIME_WAIT状态的连接启动新的化身。TIME_WAIT的持续状态是2MLS这个足够让某个方向上的分组最多存活MSL秒即被丢弃,另一个方向上的应答最多存活MSL秒也被丢弃。