TCP三次握手和四次挥手
这个问题来自于一次自闭的面试,顺便就整理一下了。
摆在开头的信息
TCP >> 面向连接
完成一次通信都需要完成三个阶段:
- 连接建立 >> 三次握手
- 数据传送
- 连接释放 >> 四次挥手
三次握手简述
图自谢希仁《计算机网络(第五版)》
最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,而B被动打开连接。
(A、B关闭状态CLOSED >> B收听状态LISTEN >> A同步已发送状态SYN-SENT >> B同步收到状态SYN-RCVD >> A、B连接已建立状态ESTABLISHED)
三次握手过程
B的TCP服务器先做好准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。
- 第一次握手:A的TCP客户进程向B发出连接请求报文段,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。
- 第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),测试TCP服务器进程进入SYN-RCVD(同步收到)状态;
- 第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)。
当B收到A的确认后,也进入ESTABLISHED状态。
四次挥手简述
图自谢希仁《计算机网络(第五版)》
数据传输结束后,通信的双方都可释放连接,A和B都处于ESTABLISHED状态。
(A、B连接建立状态ESTABLISHED >> A终止等待1状态FIN-WAIT-1 >> B关闭等待状态CLOSE-WAIT >> A终止等待2状态FIN-WAIT-2 >> B最后确认状态LAST-ACK >> A时间等待状态TIME-WAIT >> —B、A关闭状态CLOSED)
四次挥手过程
- 第一次挥手:A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
- 第二次挥手:B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。
- A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
- 第三次挥手:B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
- 第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
_(:3 」∠)_