TCP 之 三次握手 (面经计网篇)

news2024/9/22 15:32:05

这是tcp 简历连接的三次握手方式 , 其中的特殊符号 , 我解释下 , SYN 是 同步的这个单词(synchronization), ACK 是回执,承认的单词(acknowledgement), SYN-ACK 服务器收到SYN报文后,回复一个带有SYN和ACK标志的报文段,这表示服务器已经收到了客户端的SYN报文,并且期望收到下一个字节的序列号为服务器传递的确认号。拓展1,2,3 (介绍三个报文)

为什么是三次握手?不是两次、四次?

在前面我们知道了什么是 TCP 连接

  • 用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。

所以,重要的是为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。

接下来,以三个方面分析三次握手的原因:

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)
  • 三次握手才可以同步双方的初始序列号
  • 三次握手才可以避免资源浪费 (面经是这样的,但我个人感觉 , 1 和 3 是可以合并的,具体讲到了,再说)、

原因一:避免历史连接

我们来看看 RFC 793 指出的 TCP 连接使用三次握手的首要原因

The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

我们考虑一个场景,客户端先发送了 SYN(seq = 90)报文,然后客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,发送了 SYN(seq = 100)报文(注意!不是重传 SYN,重传的 SYN 的序列号是一样的)。(这里 ,我需要自习讲解一下  只有客户端爆掉了,或者客户端出现特殊情况了,序列号才会传递一个新的 。 不然都是重传序列号

上述中的「旧 SYN 报文」称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止「历史连接」初始化了连接

这里也说明了,为什么不是两次握手:

如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手为什么无法阻止历史连接呢?

我先直接说结论,主要是因为在两次握手的情况下,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费

可以看到,如果采用两次握手建立 TCP 连接的场景下,服务端在向客户端发送数据前,并没有阻止掉历史连接,导致服务端建立了一个历史连接,又白白发送了数据,妥妥地浪费了服务端的资源。

因此,要解决这种现象,最好就是在服务端发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手

所以,TCP 使用三次握手建立连接的最主要原因是防止「历史连接」初始化了连接。

原因二:同步双方初始序列号

TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:

  • 接收方可以去除重复的数据;
  • 接收方可以根据数据包的序列号按序接收;
  • 可以标识发送出去的数据包中, 哪些是已经被对方收到的(通过 ACK 报文中的序列号知道);

这里回答了,为什么不是四次握手:

三次,四次握手都是为了维持序列号的统一, 但看了下图,你就明白了,三次可以完成,为什么要四次来完成呢?

原因三:避免资源浪费:

这就是,我在前面说的可以和第一点合并,为什么呢?因为如果,没有防止到历史连接,自然就会有很多的序列号存在,所以,减少了历史链接,自然就避免了资源浪费 (这个“避免资源的浪费 , 基本上可以说是万金油答案”)而且还有 我自己的一些理解 ,就是通过从四次握手,减少到三次握手,会不会也减少了浪费资源

若在,握手的过程中,丢失的话,会有什么影响吗?

      第一次握手丢失了,会发生什么?

当 客户端 想和 服务端 想建立连接时,首先 , 第一次先发送SYN 报文,进入SYN-SENT 状态

在这之后,如果客户端迟迟收不到服务端的 SYN-ACK 报文(第二次握手)就会触发「超时重传」机制,重传 SYN 报文,而且重传的 SYN 报文的序列号都是一样的

通常,第一次超时重传是在1秒后,第二次超时重传是在2秒,第三次超时重传是在4秒后,第四次超时重传是在 8秒后,第五次是在超时重传 16 秒后。没错,每次超时的时间是上一次的 2倍

第二次握手丢失了,会发生什么?

当服务端收到客户端的第一次握手后,就会回 SYN-ACK 报文给客户端,这个就是第二次握手,此时服务端会进入 SYN RCVD 状态。
第二次握手的 SY-ACK 报文其实有两个目的:

  1.  第二次握手里的 ACK,是对第一次握手的确认报文;
  2.  第二次握手里的 SYN,是服务端发起建立 TCP 连接的报文,

        所以,如果第二次握手丢了,就会发生比较有意思的事情,具体会怎么样呢?


        因为第二次握手报文里是包含对客户端的第一次握手的 ACK 确认报文,所以,如果客户端迟迟没有收到第二次握手,那么客户端就觉得可能自己的 SYN 报文(第一次握手)丢失了,于是客户端就会触发超时重传机制,重传 SYN 报文 。

        然后,因为第二次握手中包含服务端的 SYN 报文,所以当客户端收到后,需要给服务端发送 ACK 确认报文(第三次握手),服务端才会认为该 SYN 报文被客户端收到了。那么,如果第二次握手丢失了,服务端就收不到第三次握手,于是服务端这边会触发超时重传机制,重传SYN-ACK 报文。

因此,当第二次握手丢失了,客户端和服务端都会重传:

  • 客户端会重传 SYN 报文,也就是第一次握手,最大重传次数由 tcp_syn_retries 内核参数决定
  • 服务端会重传 SYN-ACK 报文,也就是第二次握手,最大重传次数出 tcp_synack_retries 内核参数决定。

第三次握手丢失了,会发生什么?

        客户端收到服务端的 SYN-ACK 报文后,就会给服务端回一个 ACK 报文,也就是第三次握手,此时客户端状态进入到 ESTABLISH 状态
        因为这个第三次握手的 ACK 是对第二次握手的 SYN 的确认报文,所以当第三次握手丢失了,如果服务端那一方迟迟收不到这个确认报文,就会触发超时重传机制,重传SYN-ACK 报文,直到收到第三次握手或者达到最大重传次数。
        注意,ACK 报文是不会有重传的,当 ACK丢失了,就由对方重传对应的报文
举个例子,假设 tcp_synack_retries 参数值为 2,那么当第三次握手一直丢失时,发生的过程如下图:

上诉都参考我之前看过的文章

拓展 1 :

拓展 2 :

拓展 3 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ Primer Plus习题】8.7

问题: 解答: #include <iostream>using namespace std;template <typename T> T SumArray(T arr[], int n) {T sum arr[0] - arr[0];for (int i 0; i < n; i){sum arr[i];}return sum; }template <typename T> T SumArray(T *arr[], int n) {T sum *…

sqli-libs第四关详解

首先判断是数字型注入还是字符型注入 正常显示&#xff0c;说明是字符型注入&#xff0c;那么尝试单引号闭合 还是正常显示&#xff0c;尝试双引号闭合 有报错信息&#xff0c;含有括号&#xff0c;这时就应该想到&#xff0c;sql代码是("$id")这样写的了。直接采取闭…

强化学习——马尔可夫决策过程的理解

目录 一、马尔可夫决策过程1.策略2.状态价值函数3.动作价值函数4.贝尔曼期望方程 参考文献 一、马尔可夫决策过程 马尔可夫决策过程&#xff08;MDP&#xff09;是马尔可夫奖励过程&#xff08;MRP&#xff09;的扩展&#xff0c;它引入了“动作”这一外界的影响因素&#xff0…

翻译新选择!除了在线翻译百度,还有这三款宝藏工具等你发现

咱们来聊聊现在世界变成一个“大家庭”的事儿。现在&#xff0c;世界各地的人们交流越来越多&#xff0c;语言不通不再是障碍了&#xff01;翻译工具就像超级护照&#xff0c;帮我们轻松跨越语言障碍。说到翻译&#xff0c;百度翻译真的很有名&#xff0c;速度快&#xff0c;翻…

JAVA中的线程池说明一

系列文章 JAVA中的线程池说明一 JAVA中的线程池说明二 目录 1.为什么需要线程池? 2.什么是线程池? 3.标准库中的线程池 4.实现自定义线程池 1.为什么需要线程池? 线程的存在意义在于解决并发编程中进程开销过大的问题&#xff0c;因此引入了线程&#xff0c;也被称为…

【Hot100】LeetCode—74. 搜索二维矩阵

原题链接&#xff1a; 74. 搜索二维矩阵 1- 思路 二分 ① 实现一个二分函数② 对每行数组进行二分 2- 实现 ⭐74. 搜索二维矩阵——题解思路 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int[] m:matrix){if(binarySearch(m,target)){re…

【知识图谱】3、Python操作图数据库neo4j示例

今天突然想起上次知识图谱系列埋了一个坑&#xff08;【知识图谱】1、Neo4j环境搭建入门指南:从零开始玩转图数据库&#xff09;&#xff0c;说后续写一篇关于Python操作neo4j的示例。趁着周六有充足时间&#xff0c;这里写个demo补上。 本文demo还是以面试的求职者、岗位要求…

浅谈-Unity内存管理

灵魂拷问-什么是内存 物理内存虚拟内存内存寻址方位 物理内存 下面是一张i7的处理器的芯片细节图&#xff0c;在整个板载面积上我们可以很明显的看到Shared L3 Cache占用了最大面积。为什么&#xff1f;因为硬件产商为了让我们忽略掉CPU访问内存是一个非常慢速的过程&#x…

Nginx: TCP建立连接的优化和启用Fast Open功能

TCP 建立连接优化 在三次握手中&#xff0c;相关TCP的内核参数可优化这一过程 net.ipv4.tcp_syn_retries 6net.ipv4.tcp_synack_retries 5net.ipv4.tcp_syncookies 0net.ipv4.tcp_max_syn_backlognet.core.somaxconnnet.core.netdev_max_backlog 1 &#xff09; net.ipv4…

游戏:科技强国的璀璨星芒与经济增长新动力

游戏&#xff1a;科技强国的璀璨星芒与经济增长新动力 在时代的浪潮中&#xff0c;游戏正以一种令人瞩目的姿态&#xff0c;成为科技强国之路上一颗闪耀的星&#xff0c;同时也对经济有着多方面的深远影响。 从《黑神话&#xff1a;悟空》的爆火&#xff0c;到美国、英国、法国…

磐石云AXB小号平台同时支持AXYB、AXN、AXYBN

外卖订单&#xff0c;物流配送&#xff0c;金融&#xff0c;房地产&#xff0c;等行业都在使用订单小号或者说是工作号。 在当今数字化信息爆炸的时代&#xff0c;通信方式的多样化和复杂化给我们带来了便利&#xff0c;但也带来了管理的挑战。面对繁杂的通信需求&#xff0c;…

Ai Illustrator 取消吸附到像素点,鼠标拖动的时候只能到像素点

Ai Illustrator 取消吸附到像素点&#xff0c;鼠标拖动的时候只能到像素点 在做图的时候无意间变成吸附到像素点了&#xff0c;导致无法更细致的移动点。 像这样&#xff1a; 关闭的方法是打开上面菜单中的 【视图】取消勾选【对齐像素】 即可。 结果就是&#xff1a;

C++实现彩虹猫时空隧道特效(无害)

#include <Windows.h> // 如果不是在Visual Studio环境下运行的话W最好改小写。 using namespace std;int main() {for (int i 1; i < 10; i) {HDC hdc GetWindowDC(GetDesktopWindow());RECT rect;GetWindowRect(GetDesktopWindow(), &rect);StretchBlt(hdc, r…

240901-通过端口转发在局域网内访问WLS2中Gradio的Web应用

A. 需求描述 两台不同的电脑共用同一个路由器&#xff0c;其中一台电脑时Windows&#xff0c;上面安装了WSL2&#xff0c;我在WLS2中启动了一个Gradio的网络应用&#xff0c;并设置了server_name‘0.0.0.0’&#xff0c;另外一台电脑如何访问该网络应用。 B. 方法介绍 要使另一…

STM32H750+CubeIDE+FreeRTOS+ETH(LAN8720A)+LWIP

文章目录 STM32H750CubeIDEFreeRTOSETH(LAN8720A)LWIPCubeIDE配置RCC时钟树SYSETH串口MPUFreeRTOSLWIPGPIO然后就可以点击生成代码了&#xff01; 代码修改printf重定向补充硬件复位更改补充链接文件然后就可以编译下载ping成功了&#xff01; socket网络编程 STM32H750CubeIDE…

Freepik发布号称目前最强AI图像生成器Mystic

Freepik 于2024年8月27日正式推出了新的人工智能图像模型 “Mystic”&#xff0c;并号称是目前最强的AI图像生成器&#xff0c;本文从介绍Mystic开始&#xff0c;剖析其技术细节&#xff0c;功能特色&#xff0c;收费价格&#xff0c;并与当前市场上领先的 Midjourney V6.1 进行…

【dotnet】vscode配置dotnet开发环境

下载dotnet sdk https://dotnet.microsoft.com/en-us/download/visual-studio-sdks下载完安装&#xff0c;安装完毕在cmd中输入以下代码 dotnet出现以下结果代表安装完毕 在vscode终端中输入以下创建web项目 dotnet new webapp --output aspnetcoreapp --no-https上述命令…

[Jsprit]Jsprit学习笔记-vrp问题的求解

目录 一、整体的求解逻辑主要步骤 二、搜索策略的选择三、搜索策略执行解1、解的选择2、解的破坏3、解的接受3.1 新解的接受策略 一、整体的求解逻辑 下面是Jsprit实现的代码部分 public Collection<VehicleRoutingProblemSolution> searchSolutions() {logger.info(&q…

基于3D Slicer与matlab平台的图像引导介入手术-demo

1.实现手术手术导航的基本框架 2、基本协议框架 3、演示视频 DemoWithChinse2

unordered系列容器的实现

1. unordered_set与unordered_map的结构 我们知道STL中的unordered_set与unordered_map底层就是一个开散列的哈希表 1.1 unordered_set的结构 我们知道unordered_set其实就是K模型&#xff0c;所以unordered_set容器对红黑树的封装如下&#xff1a; template<class k, cl…