一句话概念秒懂之:TCP连接全流程

TCP连接经历了什么?3次握手建立连接,4次挥手关闭连接。

白话概念

假设有两个人A(火星人)和B(汪星人)是邻居,A找B聊天,于是:


  1. A去B家敲门(first hand),A等着B来开门(A:SYN-sent);
  2. B开门了问A你干啥?(second hand);
  3. A说找你聊天啊(thrid hand);

然后两个人在门口开始正式会晤,这就是建立连接的过程。


两个人聊完了之后:

  1. A说我说完了你还有话说么?(first wave);
  2. B说这句话我明白了,但是我想想有没有想说的了(second wave);
  3. B想了一会想起来一大堆要说的就哇啦哇啦说给A听,然后说完了告诉A:好了我也说完了(thrid wave);
  4. A说好那我回去了然后各回各家。

于是正式结束这次会晤,这就是关闭连接的过程。


三次握手

三次握手

  1. 第一次握手:A的TCP客户进程向B发出连接请求报文段(首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号),此时TCP客户进程进入SYN-SENT(同步已发送)状态。
  2. 第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认报文(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),B进程进入SYN-RCVD(同步收到)状态,A进入ESTABLISHED(已建立连接)。
  3. 第三次握手:A收到B的确认后,要向B发送确认收到确认的报文段(ACK=1,确认号ack=y+1,序号seq=x+1,初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号,TCP连接已经建立,当B收到A的确认后,也进入ESTABLISHED状态。

三次握手过程中,A的状态变化为 CLOSED->SYN-SEND->ESTABLISHED。B的状态变化为(CLOSED)LISTEN->SYNC-RECEIVED->ESTABLISHED,两者都经过3次状态变化。

为什么需要第三次握手?

第三次握手是一次客户端应答服务端确认消息的过程,是服务器端验证客户端是否在线的必要步骤。主要为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。
考虑只有两次握手,则服务端在收到请求后就已经是ESTABLISHED状态,而客户端却未收到服务响应信息或直接断开连接了,这时服务端会处于等待状态,导致无效连接和资源浪费。

四次挥手

4次挥手

  1. 客户端A向服务端B发送释放报文段(FIN=1,序号seq=u),并停止再发送数据,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。
  2. B收到连接释放报文段后发出确认收到的报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放,但B还可以向A发送数据。

A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段

  1. B在没有要向A发出的数据后,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。此时AB之间不能再有数据传输。
  2. A收到B的连接释放报文段后,对此发出确认连接释放的报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。B在收到A的确认连接释放报文后关闭TCP,状态进入CLOSED。

为什么客户端最后一次挥手后需要等待2MSL(Maximum Segment Lifetime 最大报文段生存时间)?

我们必须考虑网络是不可靠因数,有可能会出现最后一个报文丢失的情况。所以TIME_WAIT状态就是用来给服务端B的第三次挥手后进行判定重发的一个缓冲时间。

  1. 确保A发送的请求能够到达B,这样B会正确关闭。B在发送第三次挥手(B->A连接释放报文)之后,若在2MSL内没有收到A->B的确认释放报文,则会重新发送第三次挥手。这时若A在收到第一次请求后直接关闭而没有(TIME-WAIT)等待2MSL的等待阶段,则会导致B处在(CLOSE-WAIT)状态。
  2. AB之间的前后两次连接不会出现已经失效的连接中的报文出现在有效连接中。也即连接串包问题。
    若A没有等待,则收到请求后直接断开,此时立即建立A->B的新连接。而B->A之间有可能还有因为网络延迟等原因产生的数据咋网络中遗留,而A和B之间又建立了新的连接。此时老的数据报文会与新的数据报文同时出现在新连接中,可能会出现数据冲突

为什么连接的时候是三次握手,关闭的时候却是四次挥手?

假设关闭也是3次,A发送关闭->B确认收到->A发送确认。这个过程仍然是A到B,B说OK后A确认OK。这时会有一个问题是B发给A的数据是否发送完成不是由A决定的,而是由B决定的,因此必须要给B确认是否发送消息全部完成的过程,而这个阶段也需要A处于可以接收数据但不能再发送数据的状态,因此关闭时的过程是4次挥手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值