TCP状态机

【三次握手】

服务器监听端口,被动打开;

开始建立连接是,客户端向服务器发送SYN报文,服务器转为SYN_RCVD状态;

服务器回传报文表示收到,客户端确认,转为ESTABLISHED状

客户端确认回传服务端转为ESTABLISHED,连接建立

当客户端和服务端都是ESTABLISHED时,连接建立

TCP状态机_第1张图片

三次握手原因:网络是不可靠的,客户端的连接请求可能会因为网络原因滞留,当客户端没有收到确认的时候会重新发送,所以需要收到客户端确认的信息才建立连接!!!!

【四次挥手】

客户端准备关闭连接,发起FIN报文,进入FIN_WAIT1状态;

服务端基于是否还有数据传输,发出ask或者FIN报文;

客户端收到ack后进入FIN_WAIT2,

如果收到ACK+FIN,则进入TIME_WAIT状态;

在TIME_WAIT状态如果两个MSL内没有FIN信号,自动转化成CLOSED

TCP状态机_第2张图片

【常见问题】

1. 为什么TIME_WAIT状态要进过2个MSL(Maximum Segment Lifetime.)才能进入CLOSED状态?

    假设网路是不可靠的,最后A发出的ACK信号丢失,那么B就没有收到ACK,此时B还需要重新发一个FIN给A,这个过程最多需要2MSL,所以如果过了2MSL,没有再次收到B的FIN,那么,说明之间A发出的ACK被B收到了,所以可以可靠地关闭连接。)


2. 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

你可能感兴趣的:(TCP状态机)