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

⛳ TCP 协议面试题

目录

  • ⛳ TCP 协议面试题
    • 🐾 一、为什么关闭连接的需要四次挥⼿,⽽建⽴连接却只要三次握⼿呢?
    • 🏭 二、为什么连接建⽴的时候是三次握⼿,可以改成两次握⼿吗?
    • 👣 三、为什么主动断开⽅在TIME-WAIT状态必须等待2MSL的时间?
    • 🎨 四、如果已经建⽴了连接,但是Client端突然出现故障了怎么办?

⛳ TCP 协议面试题

🐾 一、为什么关闭连接的需要四次挥⼿,⽽建⽴连接却只要三次握⼿呢?

​ 关闭连接时,被动断开⽅在收到对⽅的FIN结束请求报⽂时,很可能业务数据没有发送完成,并不能⽴即关闭连接,被动⽅只能先回复⼀个ACK响应报⽂,告诉主动断开⽅: “你发的FIN报⽂我收到了,只有等到我所有的业务报⽂都发送完了,我才能真正的结 束,在结束之前,我会发你FIN+ACK报⽂的,你先等着”。所以,被动断开⽅的确认报⽂,需要拆开成为两步,故总体就需要四步挥⼿。

​ ⽽在建⽴连接场景中,Server端的应答可以稍微简单⼀些。当Server端收到Client端的SYN连接请求报⽂后,其中ACK报⽂表示对请求报⽂的应答,SYN报⽂⽤来表示服务端的连接也已经同步开启了,⽽ACK报⽂和SYN报⽂之间,不会有其他报⽂需要发送,故⽽可以合⼆为⼀,可以直接发送⼀个SYN+ACK报⽂。所以,在建⽴连接时,只需要三次握⼿即可。

🏭 二、为什么连接建⽴的时候是三次握⼿,可以改成两次握⼿吗?

​ 三次握⼿完成两个重要的功能:⼀是双⽅都做好发送数据的准备⼯作,⽽且双⽅都知道对⽅已准备好;⼆是双⽅完成初始SN序列号的协商,双⽅的SN序列号在握⼿过程中被发送和确认。

​ 如果把三次握⼿改成两次握⼿,可能发⽣死锁。两次握⼿的话,缺失了Client的⼆次确认ACK帧,假想的TCP建⽴的连接时⼆次挥⼿,可以如下图所示:

在这里插入图片描述

​ 在假想的TCP建⽴的连接时⼆次握⼿过程中,Client发送Server发送⼀个SYN请求帧,Server收到后发送了确认应答SYN+ACK帧。按照两次握⼿的协定,Server认为连接已经成功地建⽴了,可以开始发送数据帧。这个过程中,如果确认应答SYN+ACK帧在传输中被丢失,Client没有收到,Client将不知道Server是否已准备好,也不知道Server的SN序列号,Client认为连接还未建⽴成功,将忽略Server发来的任何数据分组,会⼀直等待Server的SYN+ACK确认应答帧。⽽Server在发出的数据帧后,⼀直没有收到对应的ACK确认后就会产⽣超时,重复发送同样的数据帧。这样就形成了死锁。

👣 三、为什么主动断开⽅在TIME-WAIT状态必须等待2MSL的时间?

原因之⼀:主动断开⽅等待2MSL的时间,是为了确保两端都能最终关闭。假设⽹络是不可靠的,被动断开⽅发送FIN+ACK报⽂后,其主动⽅的ACK响应报⽂有可能丢失,这时候的被动断开⽅处于LAST-ACK状态的,由于收不到ACK确认被动⽅⼀直不能正常的进⼊CLOSED状态。在这种场景下,被动断开⽅会超时重传FIN+ACK断开响应报⽂,如果主动断开⽅在2MSL时间内,收
到这个重传的FIN+ACK报⽂,会重传⼀次ACK报⽂,后再⼀次重新启动2MSL计时等待,这样,就能确保被动断开⽅能收到ACK报⽂,从⽽能确保被动⽅顺利进⼊到CLOSED状态。只有这样,双⽅都能够确保关闭。反过来说,如果主动断开⽅在发送完ACK响应报⽂后,不是进⼊TIME_WAIT状态去等待2MSL时间,⽽是⽴即释放连接,则将⽆法收到被动⽅重传的FIN+ACK报⽂,所以不会再发送⼀次ACK确认报⽂,此时处于LAST-ACK状态的被动断开⽅,⽆法正常进⼊到CLOSED状态。

原因之⼆:防⽌“旧连接的已失效的数据报⽂”出现在新连接中。主动断开⽅在发送完最后⼀个ACK报⽂后,再经过2MSL,才能最终关闭和释放端⼝,这就意味着,相同端⼝的新TCP新连接,需要在2MSL的时间之后,才能够正常的建⽴。2MSL这段时间内,旧连接所产⽣的所有数据报⽂,都已经从⽹络中消失了,从⽽,确保了下⼀个新的连接中不会出现这种旧连接请求报⽂。

🎨 四、如果已经建⽴了连接,但是Client端突然出现故障了怎么办?

​ TCP还设有⼀个保活计时器,Client端如果出现故障,Server端不能⼀直等下去,这样会浪费系统资源。每收到⼀次Client客户端的数据帧后,Server端都的保活计时器会复位。计时器的超时时间通常是设置为2⼩时,若2⼩时还没有收到Client端的任何数据帧,Server端就会发送⼀个探测报⽂段,以后每隔75秒钟发送⼀次。若⼀连发送10个探测报⽂仍然没反应,Server端就认为
Client端出了故障,接着就关闭连接。如果觉得保活计时器的两个多⼩时的间隔太⻓,可以⾃⾏调整TCP连接的保活参数。

相关文章:

⛳ TCP 协议面试题

目录 ⛳ TCP 协议面试题🐾 一、为什么关闭连接的需要四次挥⼿,⽽建⽴连接却只要三次握⼿呢?🏭 二、为什么连接建⽴的时候是三次握⼿,可以改成两次握⼿吗?👣 三、为什么主动断开⽅在TIME-WAIT状态…...

C 语言的字符串函数 puts()

属于标准库 <stdio.h> 函数原型: int puts(const char *str) str – 这是要被写入的 C 字符串. 如果成功, 该函数返回一个非负值为字符串长度 (包括末尾的 \0), 如果发生错误则返回 EOF. 作用: puts() 函数只显示字符串, 把一个字符串写入到标准输出 stdout, 直到空…...

Flutter如何知道页面/组件可见?

在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解…...

【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库

文章目录 【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库连接MySQL的协议使用Named Pipe协议(Windows)连接MySQL步骤1&#xff1a;确认MySQL服务器已启用Named Pipe连接启动Named Pipe连接方法 步骤2&#xff1a;客户端使用Named Pipe连接MySQL服务器。例1&#xff…...

【c++】c++的一些技术操作

pthread_create 的第三个参数&#xff0c;为函数指针&#xff0c;指向处理线程函数的地址。该函数&#xff0c;要求为静态函数。如果处理线程函数为类成员函数时&#xff0c;需要将其设置为静态成员函数。C静态成员函数访问非静态成员 https://blog.csdn.net/yueguangmuyu/arti…...

JS中对象数组深拷贝方法

structuredClone() JavaScript 中提供了一个原生 API 来执行对象的深拷贝&#xff1a;structuredClone。它可以通过结构化克隆算法创建一个给定值的深拷贝&#xff0c;并且还可以传输原始值的可转移对象。 当对象中存在循环引用时&#xff0c;仍然可以通过 structuredClone()…...

2022数学建模国赛C题官网展示论文C155论文复现

2022数学建模国赛C题C155论文复现 1.内容比对2.第一问第二小问复现代码2.1 页表合并2.2 数据的正态性检验2.2.1数据的正态性检验效果图 2.3不满足正态性&#xff0c;进行中心化对数比变换2.3.1 核心步骤-inf用0值替换2.3.2中心化对数比变换效果图 2.4描述性统计2.5 箱线图绘制 …...

阿里云 K8s PVC 绑定 StorageClass 申领 PV 失败

错误场景: 因为阿里云没有默认的 StorageClass 我也懒得更新&#xff0c;所以就创建了一个类型是云盘的 StorageClass。 但是在创建 PVC 之后发现一直是 Pending 状态就查询了一下日志&#xff0c;然后看到很多下面这种错误 liuduiMacBookM1Pro ~ % kubectl describe pvc graf…...

php数组

php数组是什么&#xff1f; 可以使用单个变量名存储多个不同类型的数据的特殊变量&#xff0c;这就是php数组。 php数组就是一个特殊的变量&#xff0c;它允许存储多个任意类型的数据。 创建数组 php数组有两种类型&#xff0c;分为索引数组和关联数组。 创建数组的方法有三种…...

构造不包含字母和数字的webshell

构造不包含字母和数字的webshell <?php echo "A"^""; ?> 输出的结果是字符"!“。之所以会得到这样的结果&#xff0c;是因为代码中对字符"A"和字符”"进行了异或操作。在PHP中&#xff0c;两个变量进行异或时&#xff0c;…...

中国大学生服务外包创新创业大赛丨借 AI 之力,助“记账”难题

一、中国大学生服务外包创新创业大赛 赛事介绍 中国大学生服务外包创新创业大赛&#xff0c;是响应国家关于鼓励服务外包产业发展、加强服务外包人才培养的相关战略举措与号召&#xff0c;举办的每年一届的全国性竞赛。 大赛均由中华人民共和国教育部、中华人民共和国商务部…...

MacOS 安装Redis并设置密码

在开发过程中&#xff0c;需要本地进行安装Redis进行测试&#xff0c;记录了下MacOS环境下安装Redis&#xff0c;以及设置密码。 Brew 安装 $ brew install redis启动服务 # 启动服务 brew services start redis # 关闭服务 brew services stop redis # 重启服务 brew servic…...

函数的参数作为引用

文章目录 1. num,list ,tuple2. list 作为默认值导致共享同一列表3. 防御可变参数4. 结论 1. num,list ,tuple 结论&#xff1a;num ,tuple 作为参数&#xff0c;自身不会因为函数的原因而改变&#xff0c;list 为可变量&#xff0c;会因为函数变而变。 测试 def f(a, b):a …...

【文化课学习笔记】【化学】非金属及其化合物

【化学】必修一&#xff1a;非金属及其化合物 硅及其化合物 硅单质 物理性质 单晶硅的结构与金刚石类似&#xff0c;为正四面体的立体网状结构。晶体中每个硅原子与其他四个硅原子相连接。\(1\mathrm{mol}\) 硅单质还有 \(\mathrm{2N_A}\) 个 \(\mathrm{Si-Si}\) 键&#xff1b…...

Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)

文章目录 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)前情提要客户端部分 Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三) 前情提要 单例泛型类 using System.Collections; using System.Collections.Generic; …...

步步向前,曙光已现:百度的大模型之路

大模型&#xff0c;是今年全球科技界最火热&#xff0c;最耀眼的关键词。在几个月的狂飙突进中&#xff0c;全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后&#xff0c;新的问题也随之而来&#xff1a;大模型的力量…...

常见的 Python 错误及其解决方案

此文整理了一些常见的 Python 错误及其解决方案。 1、SyntaxError: invalid syntax 说明&#xff1a;无效的语法是最常见的错误之一&#xff0c;通常是由于编写代码时违反了 Python 的语法规则。可能的原因&#xff1a; 忘记在 if、while、for 等语句后写冒号&#xff0c;或者…...

文章评论以及回复评论邮件通知(Go 搭建 qiucode.cn 之八)

要说到评论。无疑是博客应用的灵魂所在了,它也正是站长与博友、博友与博友之间互相交流的桥梁,倘若少了它,博客应用将变得暗淡无关,索然无味,恍如一具躺在床榻上的植物人,终究是无法与周边人言语的。 也正是有了评论,站长在该博客应用所发表的博文,博友才得以通过评论,…...

java面试基础 -- ArrayList 和 LinkedList有什么区别, ArrayList和Vector呢?

目录 基本介绍 有什么不同?? ArrayList的扩容机制 ArrayLIst的基本使用 ArrayList和Vector 基本介绍 还记得我们的java集合框架吗, 我们来复习一下, 如图: 可以看出来 ArrayList和LinkedList 都是具体类, 他们都是接口List的实现类. 但是他们底层的逻辑是不同的, 相信…...

matlab 点云最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示四、可视化参考本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

以太网PHY布局布线指南

1. 简介 对于以太网布局布线遵循以下准则很重要&#xff0c;因为这将有助于减少信号发射&#xff0c;最大程度地减少噪声&#xff0c;确保器件作用&#xff0c;最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确&#xff0c;然…...