TCP 为什么是 3 次握手 4 次挥手?

ops/2024/12/14 12:55:59/

前言:

TCP 的 3 次握手 4 次挥手是一个非常经典的问题,相信各位从事 Java 的朋友在职业生涯中没少被问到这个问题,本篇我们就展开分析一下 TCP 为什么是 3 次握手 4 次挥手。

TCP 协议

要搞清楚 TCP 为什么是 3 次握手 4 次挥手我们需要先搞清楚 TCP 协议,TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host(从一台主机发送数据给另外一台主机) 数据的可靠传输,支持全双工,是一个连接导向的协议。

TCP/IP 协议

我们上面提到了 TCP 协议提供 Host-To-Host 的数据可靠传输,也就是主机到主机的数据可靠传输,也可以说是从一台设备到另外一台设备,因为不仅仅是主机还有手机、平板等,所以说 TCP 是设备到设备之间的通讯协议,而设备是应用的载体,设备上安装了应用,例如微信、微博、百度等应用,因此 TCP 的上层是应用,而应用间有对应的传输协议,但应用需要依赖设备,因此需要用到设备的 TCP 协议,需要告诉 TCP 使用的是哪个应用,也就是对应的端口号。

TCP 要实现设备到设备的通讯,就需要知道设备的网络 IP 地址,但 TCP 协议不负责网络 IP 地址之间的数据传输,TCP 把网络地址之间的数据传输交给底层的网络层处理,网络层之间的通讯协议就是 IP 协议,网络层解决了解决了数据在两个网络 IP 地址之间的传输,但是网络层不处理数据在设备之间的传递,因此又有了数据链路层和物理层。

在这里插入图片描述

以上就是 TCP/IP 协议的 5 层模型。

TCP 协议的 3 次握手和 4 次挥手

TCP 协议的 3 次握手示意图如下:

在这里插入图片描述

我们来分析三次握手的过程,如下:

  • 第一次握手:客户端发送 SYN(Synchronization)信号给服务端,请求建立连接。
  • 第二次握手:服务端收到客户端的 SYN 信号后,响应客户端,同时服务端也发送一个 SYN 信号给客户端,这一步也叫 SYN-AKC(同步和确认),表示服务端准备好了并且也想和客户端建立连接。
  • 三次握手:客户端收到服务端的 SYN 后,给服务端发送一个 ACK,表示自己也准备好了。

以上就是三次握手的过程。

为啥是 3 次握手?2 次握手可以吗?

我们从 3 次握手的作用来分析为什么需要三次握手,如下:

  • 第一次握手:客户端发送 SYN 到服务端,这可以证明客户端的发送能力是正常的。
  • 第二次握手:服务端发送 SYN 和 ACK 到客户端,到此时就可以证明客户端的发送能力、服务端的接受能力和发送能力是正常的。
  • 三次握手:客户端响应 ACK 到服务端,证明客户端端的接受能力是正常的。
  • 我们发现只有经过三次握手,才可以证明客户端和服务端的发送接受能力都正常,只有客户端和服务端的发送接受能力都正常,才可以进行数据的可靠性传输。

假设只有两次握手会有什么情况?

如果只有两次握手,服务端无法确定客户端是否已经收到自己发送的报文,如果第二次握手报文丢失,那么客户端就无法知道服务端的初始序列号,那么 TCP 的可靠性就无从谈起了。

TCP 协议的 4 次挥手示意图如下:

在这里插入图片描述
我们来分析 4 次挥手的过程,如下:

  • 第一次挥手:客户端要求断开连接,发送一个断开的请求(FIN)。
  • 第二次挥手:服务端收到请求后,给客户端一个 ACK 信号,表示自己收到了客户端的断开信号。
  • 第三次挥手:服务端给客户端一个 FIN 信号,告诉客户端可以断开了。
  • 四次挥手:客户端收到了服务端的 FIN 信号,再给服务端一个 ACK 信号。

以上就是四次挥手的全过程。

为啥需要四次挥手?可以三次挥手吗?

前面我们提到 TCP 协议是全双工的,客户端要求断开发送 FIN 后,服务端还可以向客户端发送数据,服务端收到客户端的 FIN 请求后,可能还有一些数据需要处理响应,因此不能马上向客户端响应 FIN,只能向客户端发送一个 ACK,等服务端把剩余的数据处理完成之后,再向客户端发送一个 FIN 信号,服务端需要知道客户端是否收到了自己发送的 FIN 信号,因此还需要客户端向服务端发送一个 ACK 信号。

总结:本篇简单分享了 TCP 协议的 3 次握手 4 次挥手,并从协议交互的层面上分析了为什么是 3 次握手 4 次挥手,希望可以帮助到有需要的小伙伴。

如有不正确的地方欢迎各位指出纠正。


http://www.ppmy.cn/ops/141822.html

相关文章

CPU性能优化--基于处理器事件的采样

基于处理器事件的采样processor event based sampling PEBS 是CPU的另一种非常有用的特性,PEBS被用来在每个采样点获取更多的补充数据。在Intel处理器中,PEBS是在NetBrust微架构开始i引入的,在AMD处理器中,类似的特性叫基于指令的…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:使用 Microsoft Fabric 实现数据湖仓

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加“使用 Microsoft Fabric 实现数据湖仓”活动,了解如何在 AI 的帮助下统一数据分析。了解如何简…

axios的引入和基本使用

一、axios的引入 使用 pnpm add axios 二、使用axios 三、axios的使用方法补充 axios除了直接使用它实例上的方法,还可以通过配置的方式进行使用axios({}),传入一个对象,这个对象可以有如下属性: url(字符串&#…

Polkadot 11 月生态月报:3900万交易量、69%增长率,技术与社区齐头并进

原文:https://x.com/Polkadot/status/1865118662069490074 编译:OneBlock 上个月对 Polkadot 生态来说可谓是跌宕起伏,从创下交易记录到开创性合作,Polkadot 热度不断。展现出强大的技术实力和蓬勃发展的社区活力。在回顾本月亮点…

3D开发工具HOOPS对B-Rep的支持:提升3D建模与可视化的精度与效率

在现代3D建模与计算机辅助设计(CAD)领域,“B-Rep(边界表示)"是一种广泛应用的几何建模技术。B-Rep通过定义三维对象的边界和拓扑结构,使得复杂的几何形状能够在计算机中准确表示并进行分析。作为前面的…

12.10 C语言作业3

课上类的三个练习题的构造函数 1. #include <iostream> using namespace std; class Rec {int length;int width; public:Rec(int length,int width):length(length),width(width){}void set_length(int l);void set_width(int w);int get_length();int get_width();v…

Rust 从入门到精通:开启高效安全编程之旅

摘要&#xff1a; 本文全面深入地介绍了 Rust 编程语言的学习路径&#xff0c;从基础语法起步&#xff0c;逐步深入到内存管理、并发编程、错误处理等核心特性&#xff0c;再到高级主题如宏编程、异步编程以及与其他语言的交互等方面&#xff0c;旨在帮助读者系统地掌握 Rust 语…

【LC】240. 搜索二维矩阵 II

题目描述&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,…