您的位置:首页 > 理论基础 > 计算机网络

TCP连接的建立和终止

2014-04-25 20:09 399 查看
TCP连接的建立:

服务器必须准备好接受外来的连接。这通过调用socket、bind和listen函数来完成,称为被动打开(passive open)。
客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节,它告诉服务器客户将在(待建立的)连接中发送的数据的初试序列号。一般情况下SYN分节不携带数据,它只含有一个IP头部、一个TCP头部及可能有的TCP选项。
服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一个连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK(表示确认)。
客户必须确认服务器的SYN。



TCP的三次握手
TCP连接的终止:

某个应用进程首先调用close,我们称这一端执行主动关闭(active close)。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。
接收到FIN的另一端执行被动关闭(passive close)。这个FIN由TCP确认。他的接受也作为文件结束符传递给接收端应用进程(放在已排队等候该应用进程接受的任何其他数据之后),因为FIN的接受意味着应用进程在相应的连接上再也接收不到额外数据。
一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。
接收到这个FIN的原发送端TCP(即执行主动关闭的那一端)对它进行确认。



TCP连接关闭时的分组交换
TCP状态转换图:



TCP连接中的分组交换
CLOSED状态:TCP未建立的一般状态
SYN_SENT状态:当应用进程在CLOSED状态下执行一个主动打开时(connect),TCP将发送一个SYN(J)并从CLOSED状态转换成该状态。
LISTEN状态:应用进程被动打开的状态(socket,bind,listen)。
SYN_RCVD状态:应用进程执行被动打开后,接收到一个SYN,TCP将发送一个ACK(J+1)和一个SYN(K)并从LISTEN状态转换成该状态。
ESTAB-LISHED状态:进程执行一个主动打开后,接收到一个捎带ACK的SYN,它将发送一个ACK并转换成该状态。这个最终状态是绝大多数数据传送发生的状态。

FIN_WAIT_1状态:如果应用进程在接收到文件结束符前调用close(主动关闭),发送一个FIN(M)则转换成该状态。
CLOSE_WAIT状态:如果在ESTAB-LISHED状态下,应用进程接收到FIN,并发送一个ACK(M+1),则转换成该状态。
FIN_WAIT_2状态:处在FIN_WAIT_1状态的进程收到也ACK(M+1),转换成该状态。
LAST_ACK状态:被动关闭一方也发送一个FIN(N),并从CLOSE_WAIT状态转换成该状态。
TIME_WAIT:主动关闭一方收到一个FIN(N)后,发送一个ACK(N+1),并转换成该状态。至此,整个TCP连接就完全关闭了,即重新进入CLOSED状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: