TCP三次握手是,通讯的双方(客户端和服务端)建立连接的过程。
TCP是可靠的传输协议,为什么说可靠呢?因为在建立连接以后,客户端和服务端都得知道自己和对方都能正常的发送和接收报文。
第一次握手:客户端发送连接报文(syn:表示建立连接,seq:报文序列号)给服务端,服务端收到报文以后。
这个时候,服务端能得出的结论是:客户端能够正常发送和自己能够正常的接收报文。
第二次握手:服务端对第一次报文的确认和连接的请求(syn:表示建立连接,seq:报文序列号,ACK表示有确认信息,Ack表示确认报文的序列号+1),客户端收到报文以后。
这个时候,客户端能得出结论是:服务端可以正常的接收和发送报文,自己也能正常的发送报文。(但是服务端还不确定客户端能不能正常的接收自己的报文)
第三次握手:客户端对服务端建立连接的报文(seq,改报文序列号,ACK表示有确认信息,Ack表示确认报文的序列号+1)进行确认。服务端收到以后。
这个时候,服务端就知道了客户端能正常接收自己的报文。
最后,建立连接。
这个过程:客户端的状态由syn_sent到established;
服务端的状态由syn_rcv到establish。
四次挥手:等数据包传完以后,TCP关闭连接,为了确保可靠,就是客户端都需要知道对方的报文已经传输完成了。
第一次挥手:客户端发送(FIN:断开连接,seq:改报文序列号)断开连接的报文,服务端收到以后。
这个时候,服务端能得出的结论是:客户端的数据报文传完了,客户端也知道自己的数据传完了。
第二次挥手:服务端客户断开连接的请求发送响应报文(ACK有确认信息,Ack:确认报文的序列号+1,seq:改报文序列号),客户数收到以后。
这个时候,客户端只能得出结论是:服务端知道自己数据传完了,但是还不能关闭连接,因为不知道服务端还有没有其他的数据包要传。
第三次挥手:等到服务端的数据传完以后,也发起一个断开连接的报文(FIN:断开连接,seq:改报文序列号),客户端收到以后。
这个时候,客户端就能得出结论是:服务端数据传完了,我也传完了,可以断了
第四次挥手:给服务端发送确认第三次请求的报文(ACK有确认信息,Ack:确认报文的序列号+1,seq:改报文序列号),断开(为了可靠,通知服务端,我收到了断开连接的报文了)。
这个过程,客户端状态:由established >>> FIN_wait_1>>>>>>FIN_wait_2>>>>>>Time_wait>>>>>closed;
客户端状态:由established >>> FIN_wait_1>>>>>>FIN_wait_2>>>>>>Time_wait>>>>>closed;
服务端状态:由established >>> close_wait>>>>>>last_ack>>>>>closed