当前位置: 首页 > news >正文

TCP协议的三次握手和四次挥手(面试)

三次握手

首先可以简单的回答:

      1、第一次握手:客户端给服务器发送一个 SYN 报文。

      2、第二次握手:服务器收到 SYN 报文之后,会应答一个 SYN+ACK 报文。

      3、第三次握手:客户端收到 SYN+ACK 报文之后,会回应一个 ACK 报文。

      4、服务器收到 ACK 报文之后,三次握手建立完成。 

也可以详细的介绍:

刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后
      1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。

      2、第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。

      3、第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。

      4、服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

为什么只有三次握手才能确认双方的接受与发送能力是否正常

 这里先解释一下为啥只有三次握手才能确认双方的接受与发送能力是否正常,而两次却不可以:
          第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
          第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
          第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。

      因此,需要三次握手才能确认双方的接收与发送能力是否正常。

三次握手的作用:

三次握手的作用也是有好多的,多记住几个,保证不亏。例如:
      1、确认双方的接受能力、发送能力是否正常。
      2、指定自己的初始化序列号,为后面的可靠传送做准备。
      3、如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成到。

为什么要进行三次握手?

当进行第一次握手,网络不好可能会堵塞,所以连接的请求并没有到达服务器端;
但是tcp连接有超时重传的机制,所以再一次发送请求,这时候服务器端接收到了你的请求,他也会返回一个请求给你,这是第二次握手;
但是这时候网络环境突然又好了起来,那个堵塞的请求到达了服务器端,服务器端又给你回了一个请求,但是你又不想给服务器发送请求,这时候服务器的资源会进行占用等待你的请求,为了不使服务器的资源继续占用,你又必须发送一个请求给服务器;
所以要进行3次握手

下面进行四次挥手介绍:

        当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送 到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。   

        这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。

 

1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。

2、第二次握手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
http://www.lryc.cn/news/397572.html

相关文章:

  • css看见彩虹,吃定彩虹
  • springboot在线教育平台-计算机毕业设计源码68562
  • 形态学图像处理
  • 安泰电压放大器的选型方案是什么
  • ARMV8安全特性:Pointer Authentication
  • MySQL和Redis更新一致性问题
  • (19)夹钳(用于送货)
  • 安装lap和cython_bbox失败了很多次!!!终于被我发现了!
  • 异业联盟整合各大行业门店,共享资源
  • 前端如何去看蓝湖
  • HTML+CSS+JS 实现3D风吹草动效果(B站视频)
  • 常用网络概念
  • 图鸟UI框架在uni-app多端应用开发中的实践与应用
  • 特征值究竟体现了矩阵的什么特征?
  • C语言-顺序表
  • OpenCV漫水填充函数floodFill函数的使用
  • redis内存分析
  • redis批量删除keys,用lua脚本。
  • Python-找客户软件
  • STM32 - PWR 笔记
  • 标准盒模型和怪异盒子模型的区别
  • 推荐算法——MRR
  • idea中打开静态网页端口是63342而不是8080
  • Vue3框架搭建3:配置说明-prettier配置
  • SQL MySQL定时器/事件调度器(Event Scheduler)
  • 从0到1构建渠道运营体系:实战案例与策略指南
  • Java版Flink使用指南——将消息写入到RabbitMQ的队列中
  • python excel openpyxl
  • C++八股(一)
  • 【Git的基本操作】版本回退 | 撤销修改的三种情况 | 删除文件