TCP建立连接与释放连接

三次握手

图片描述

第一次握手:客户端作为连接建立发起端,选择客户端初始序列号x,向服务器发送(SYN=1,seq=x)的SYN段。客户状态由LISTEN进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到客户发送的SYN段后,选择服务器初始序列号y,向客户发送(SYN=1,ACK=1,seq=y,ack_seq=y+1)的SYNACK段。同时,服务器状态由LISTEN进入SYN_RCVD状态
第三次握手:客户端收到服务器发的SYNACK段后,向服务器发送(ACK=1,seq=x+1,ack=seq=y+1)的ACK段,同时,客户端进入ESTABLISHED状态,客户端确认连接已建立;当服务器收到ACK段后,也进入ESTABLISHED状态,也确认连接已建立。至此,双方确认连接建立成功。

四次挥手

图片描述

①当客户端向服务器发送完最后一个数据后,可以发送一个FIN段(FIN=1,seq=u),请求断开客户到服务器的连接,其状态由ESTABLISHED进入FIN_WAIT_1,在这一状态下,只能接收服务器发送过来的数据,而不再发送数据。需要注意的是,FIN段不封装应用层数据,但是也要消耗掉1个序列号。
②服务器收到客户的FIN段后,向客户发送一个ACK段(ACK=1,seq=v,ack_seq=u+1),ACK段可以封装应用层数据(如果有)。服务器状态由ESTABLISHED状态进入CLOSE_WAIT,在这一状态下,服务器仍然可以发送数据,但不再接收数据。当客户收到ACK段后,其状态由FIN_WAIT_1进入FIN_WAIT_2,仍然可以接收来自服务器的数据。此时的TCP连接已经关闭了客户向服务器方向的数据传输,故也称为半关闭。
③当服务器向客户发送完最后一个数据段后,服务器向客户发送FIN段(FIN=1,ACK=1,seq=w,ack_seq=u+1),同样,该FIN段也不携带应用层数据。服务器状态则由CLOSE_WAIT进入LAST_ACK,此时服务器也不再发送数据。
④当客户收到服务器发送的FIN后,向服务器发送ACK段(ACK=1,seq=u+1,ack_seq=w+1),其状态由FIN_WAIT_2进入TIME_WAIT,等待2MSL时间,然后进入CLOSED状态,最终释放连接,服务器在收到最后一次ACK段后,状态由LAST_ACK进入CLOSED,最终释放连接。


lemon
44 声望2 粉丝

人生苦短,我用python,shell,java