TCP内部工作原理
TCP的工作流程分为三个步骤:
- 三次握手进行连接
- 进行数据传输
- 四次挥手断开连接
1. TCP内部工作原理1:与对方套接字的连接
TCP的连接需要进行三次握手
- 首先由客户端发送syn同步报文
- 在服务器收到之后给出ack应答并发送syn同步报文,此时服务器可知自身的接收没有问题
- 客户端收到服务器的ack应答后可知自身的发送和接收都没有问题,然后向服务器的syn同步报文给出ack应答
- 服务器在收到客服端的ack应答后可知自身的发送没有问题
经过三次无误握手之后,双方可进入就绪状态。
2. TCP内部工作原理2:与对方套接字进行数据交换
TCP传输是全双工(full duplex)的,所以只需要讨论一个方向的传输机制即可:
TCP发送数据端采用
- 发送序列号+数据长度
- 等待应答
2.1 收到应答,继续发送
2.2 超时,重新发送
TCP接收数据端采用
- 接收到数据序列号+数据长度
- 发送应答 = 数据序列号 + 数据长度,即告知对方现在接收到哪里了,可以往后继续发送
3. TCP内部工作原理3:与对方套接字断开连接
TCP断开连接采用四次挥手的机制
-
第一次挥手:
客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。
也就是客户端发出连接释放报文段(FIN报文),指定序列号seq = u,主动关闭TCP连接,等待服务器的确认。 -
第二次挥手: 服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = u + 1。
接着服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。 -
第三次挥手: 服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LAST_ACK(最后确认)状态,等待客户端的确认。服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。
-
第四次挥手: 客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。
客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。
参考链接: TCP四次挥手