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

三次握手四次挥手详细解析面试常问

文章目录

    • 1.第2次握手传回了ACK,为什么还要传回SYN?
    • 2.断开连接-TCP 四次挥手
    • 3.为什么要四次挥手?
    • 4.为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
    • 5.如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
    • 6.为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

1.第2次握手传回了ACK,为什么还要传回SYN?

image-20230221113716266

服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。回传 SYN 则是为了建立并确认从服务端到客户端的通信。

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

2.断开连接-TCP 四次挥手

image-20230221113923120

断开一个 TCP 连接则需要“四次挥手”,缺一不可 :

第一次挥手 :客户端发送一个 FIN(SEQ=X) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送。然后,客户端进入 FIN-WAIT-1 状态。

第二次挥手 :服务器收到这个 FIN(SEQ=X) 标志的数据包,它发送一个 ACK (SEQ=X+1)标志的数据包->客户端 。然后,此时服务端进入CLOSE-WAIT状态,客户端进入FIN-WAIT-2状态。

第三次挥手 :服务端关闭与客户端的连接并发送一个 FIN (SEQ=y)标志的数据包->客户端请求关闭连接,然后,服务端进入LAST-ACK状态。

第四次挥手 :客户端发送 ACK (SEQ=y+1)标志的数据包->服务端并且进入TIME-WAIT状态,服务端在收到 ACK (SEQ=y+1)标志的数据包后进入 CLOSE 状态。此时,如果客户端等待 2MSL报文最大生存时间) 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

3.为什么要四次挥手?

TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。

举个例子:A 和 B 打电话,通话即将结束后。

  1. 第一次挥手 : A 说“我没啥要说的了”

  2. 第二次挥手 :B 回答“我知道了”,但是 B 可能还会有要说的话,A 不能要求 B 跟着自己的节奏结束通话

  3. 第三次挥手 :于是 B 可能又巴拉巴拉说了一通,最后 B 说“我说完了”

  4. 第四次挥手 :A 回答“知道了”,这样通话才算结束。

4.为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示接收到了断开连接的请求。等到数据发完之后再发 FIN,断开服务器到客户端的数据传送。

5.如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?

客户端没有收到 ACK 确认,会重新发送 FIN 请求。

6.为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。

ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN。

MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接

http://www.lryc.cn/news/14634.html

相关文章:

  • 组合由于继承
  • 大学计算机基础 知识点总结
  • 手撸React组件库前必须清楚的9个问题
  • 试用国内及国外AI绘图软件后的总结
  • DJI 无人机 Onboard SDK ROS 功能包demo运行
  • 揭开JavaWeb中Cookie与Session的神秘面纱
  • 2023-02-20 Qt 5.13.1 + OpenCV 4.5.4环境编译
  • 波次分拣系统
  • 【Servlet篇】Request请求转发详细解读
  • vector
  • LeetCode——104. 二叉树的最大深度
  • 漫画 | Python是一门烂语言?
  • 2023.2 新方案 java代码混淆 java加密 字符串加密
  • Swift 周报 第二十三期
  • android系统屏幕旋转角度,应用界面横竖屏,设备旋转角度,三者的区别以及使用。
  • 【华为云-开发者专属集市】DevCloud+ECS、MySQL搭建WordPress
  • Milvus 群星闪耀时|又一个小目标达成 :社区正式突破 15,000 星!
  • Qt信号与槽使用方法总结
  • SpringCloud alibaba-Sentinel服务降级策略
  • python常用函数——random()函数
  • PX4之启动脚本
  • Java零基础入门到精通(持续更新中)
  • 杂七杂八(12):Bilibili视频缓存 m4s音视频合并 shell脚本
  • Qt 某光谱仪程序开发
  • 蛋白质组学技术与常见分析培训班火热招生中!
  • 唤醒手腕 Java 后端 Springboot 框架结合 socketio 学习笔记
  • C++入门:内联函数、auto关键字、基于范围for循环及指针空值nullptr
  • Python遗传算法
  • GEE学习笔记 六十四:绿色中国报告(个人版)
  • 【Kubernetes】【十八】数据存储 高级存储 配置存储