简述tcp三次握手 四次挥手

1,221 阅读4分钟

首先简单介绍一下tcp协议:

  • 基于连接的:数据传输之前需要建立可用的连接
  • 全双工的:可以双向传输
  • 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
  • 流量缓冲:解决双方处理能力的不匹配
  • 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
  • 拥塞控制:防止网络出现恶性拥塞

因为是基于可用连接的,所以建立连接的过程需要三次握手; 因为是全双工的,所以断开连接需要四次挥手;

ok。接下来详细介绍,三次握手的过程,四次挥手的过程,已经为什么是三次挥手,四次挥手。

一,TCP 的三次握手机制

TCP三次握手

开始客户端和服务器都处于 CLOSED 状态,然后服务端开始监听某个端口,进入 LISTEN 状态

  • 第一次握手 (SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态
  • 第二次握手 (SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCV 状态。
  • 第三次握手 (ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时

二,TCP 握手为什么是三次,不能是两次?不能是四次?

TCP 握手为什么是三次呢?为了方便理解,我们以谈恋爱为个例子:两个人能走到一起,最重要的事情就是相爱,就是我爱你,并且我知道,你也爱我,接下来我们以此来模拟三次握手的过程:

为什么握手不能是两次呢?

如果只有两次握手,女孩子可能就不知道,她的那句我也爱你,男孩子是否收到,恋爱关系就不能愉快展开。

为什么握手不能是四次呢?

因为握手不能是四次呢?因为三次已经够了,三次已经能让双方都知道:你爱我,我也爱你。而四次就多余了。

三, TCP 四次挥手过程?

TCP四次挥手过程

  1. 第一次挥手 (FIN=1,seq=u),发送完毕后,客户端进入 FIN_WAIT_1 状态
  2. 第二次挥手 (ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态
  3. 第三次挥手 (FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK。
  4. 第四次挥手 (ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

四,. TCP 四次挥手过程中,客户端为什么需要等待 2MSL, 才进入 CLOSED 状态

2MSL,2 Maximum Segment Lifetime,即两个最大段生命周期

  • 1 个 MSL 保证四次挥手中主动关闭方最后的 ACK 报文能最终到达对端
  • 1 个 MSL 保证对端没有收到 ACK 那么进行重传的 FIN 报文能够到达

五, 为什么需要四次挥手?

举个例子吧

小明和小红打电话聊天,通话差不多要结束时,小红说 “我没啥要说的了”,小明回答 “我知道了”。但是小明可能还会有要说的话,小红不能要求小明跟着自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说 “我说完了”,小红回答 “知道了”,这样通话才算结束。

ok,到这里就全明白了,以上就是通俗易懂的tcp连接的三次握手,断开连接的4次挥手。

  • 版权声明:非商业转载
  • 原文链接: juejin.cn/post/698879…
  • 作者:捡田螺的小男孩
  • 来源:掘金,著作权归原文作者所有