三次握手
第一次握手:
客户端和服务端都是close状态,服务器端首先进入端口监听模式,客户端随机开启一个端口向服务器发送一条建立连接报文,报文中含有 SYN=1,seq=x, SYN表示建立一个新的请求控制段,seq表示传输报文段的第一个数据字节,发送完成后客户端进入SYN_SENT状态,表示客户端已经发送一个连接请求段,等待回复
第二次握手:
服务器返回报文段SYN=1,ACK=1,seq=y,ack_seq=x+1, SYN表示同意建立新连接;ACK表示确认序号有效;seq表示服务器通知客户端 服务器的序列号为y;ack_seq表示已经接收了序列号为x的报文段,准备接收x+1的报文段,服务器状态由listen状态变为SYN_RCVD(同步收到)
第三次握手:
客户端向服务器发送同意建立连接报文段,确认报文 报文包含 ACK=1,seq=x+1,ack_seq=y+1
表示确认序号有效,此次报文段的序号是x+1,ack_seq表示期望接收序号为y+1的数据
当客户端发送ACK时,客户端进入ESTALISHED状态,
服务器也进入EDTABLISHED状态
注意:第三次握手客户端可以添加数据
四次挥手(连接拆除)
第一次挥手:
客户端向服务器发送释放连接报文段 FIN=1,seq=u;分别代表FIN=1发送端数据发送完毕,请求释放连接,seq=u传输的第一个数据字节的序号是u,客户端状态由Established进入Fin_Wait_1,进入等待1状态,只能进行收数据不能进行发数据(不是报文段)
第二次挥手:
由服务器向服务器发送确认段,Ack=1,seq=v,ack_seq=u+1,分别代表ACK确认序号有效;ack_seq=u+1;服务器期望接收客户数据序号为u+1;seq=v服务器传输序号是v,服务器状态有Established进入close_Wait 关闭等待(可以继续发送数据),客户端收到Ack状态后,由Fin_Wait进入Fin_Wait_2状态(能收不能发数据)
第三次挥手:
服务器向客户发送释放连接报文段,其中包括FIN=1,Ack=1,seq=w,ack_seq=u+1 依次表示Fin=1:请求释放连;ACK=1:确认字号段有效;ack_seq=u+1:表示服务器期望接收客户数据序号为u+1;seq=w:表示自己传输的第一个数据字节的序号是w。 服务器状态由Close_Wait进入Last_ACK(最后确认状态)
第四次挥手:
客户向服务器发送确认段,其中包括ACK=1,seq=u+1,ack_seq=w+1,依次代表Ack=1:确认序号有效;ack_seq=w+1:表示客户端期望接收服务器数据序号为w+1;seq=1:表示客户传输的数据序号是u+1
客户端状态由Fin_Wait_2进入Time_Wait,等待2MSL时间,进入Close状态。
服务以在收到最后一次的Ack,由Last_Ack进入Close状态
第二次挥手表示是对第一次客户端挥手的确认
第三次挥手表示服务器想请求断开连接
msl 参考
https://blog.51cto.com/u_10706198/1775555