核心机制:TCP 断开连接(四次挥手)

article/2025/8/4 2:15:37

断开连接的四次挥手,可能是客户端主动发起的,也可能是服务端主动发起的

而三次握手,一定是客户端先发起的(倒果为因)(先发起的一方定义为客户端)

1.客户端告诉服务器,我要和你断开连接,请你把我删了

2.服务器回应"收到"

3.服务器告诉客户端,我也要和你断开连接,请你把我也删了

4.客户端回应"收到"

客户端和服务器都会把对方的信息(之前保留的对方的 IP 和 端口)删除掉,删除完了,连接就断开了

三次握手和四次挥手本质的区别在于四次挥手不是完全由操作系统内核完成的,而是和应用层代码有关系

四次挥手之所以叫四次挥手,是因为中间的两次交互,是不一定触发合并的(有的时候会合并,有的时候不会)

1.不合并

对于服务器来说,从 hasNext 返回 false 到调用 close 中间,其实要经历多少代码,多少时间,是不确定的!!! 看程序员的代码是怎么写的

2.合并

TCP 有机制:延时应答(后面会介绍),应答 ack 的时机,往后拖一段时间(不会很久)

比如,收到了 FIN 触发 close 之间,间隔的时间本身就不长,再加上上一个 ack 延时应答了,就可以把这两个数据合并了.

合并相比于不合并来说,更好,合并提高效率,一系列的封装和分用,都是需要有开销的

合并场景是属于 特殊情况 优化手段,还是把 TCP 的断开连接称为"四次挥手"

面试的经典面试题:

建立连接的时候,必须握手三次吗?

        四次:可以但,是没有必要

                中间两次的传输,时间是同时的,合并成一次,有利于提高效率(封装分用 2 次 > 1次)

        两次:不可以

                两次握手,无法完成"通信双发发送能力,接受能力的验证"

断开连接的时候,必须挥手 四次吗? 三次?

四次挥手的意义,就是为了"释放空间"

建立连接需要保存信息,连接不用了,保存的信息自然就要释放

CLOSE_WAIT:被动断开连接的一方进入的状态

                        收到对方发来的 FIN 的时候,就会返回 ACK,同时进入 CLOSE_WAIT 状态(可以理解成 wait close, 等待关闭,等待应用程序代码,调用 close),正常情况下,存在的时间比较少

TIME_WAIT:类似于线程 TIMED_WAITNG, 有时间的等待)

        等待连接的释放

进入时机:主动发起断开连接的一方,进入

                我方发送 FIN,对方返回 ACK

                对方发送 FIN,我方返回 ACK ,同时进入 TIME_WAIT

按道理说,我方返回 ACK 相当于是四次挥手结束了,就可以释放连接了

实际上不能立即释放连接,而是要等等

等等,是为了应对最后一个 ACK 丢包的情况

TIME_WAIT

如果客户端没有等,直接释放连接,此时重传的 FIN 就无人处理了, 因此就需要客户端先等待一段时间,看这个时间里面,对方是否会重传 FIN

TIME_WAIT 等待时间,称为 2 * MSL

MSL 网络上任意两点之间,传输消耗的最大时间,实际上 MSL 给的值是非常宽裕的值,比如 Linux 上默认是60s

TCP 协议中的几个关键状态

LISTEN:手机开机,信号良好,随时可以打电话

ESTABLISHED:连接已经建立,电话接听,可以说话了

CLOSE_WAIT:等待代码调用 close

TIME_WAIT:等待 FIN 重传,应对最后一个 ACK 丢包的情况

面试非常高频的问题

实际上,三次握手,四次挥手,大部分工作都是内核来完成的,其实和实际代码关系不是很大存在的意义,更多的是让我们理解/调试程序

TCP 可靠传输,更多的还是靠前面的确认应答,超时重传

        


http://www.hkcw.cn/article/ZjWDTFpGgu.shtml

相关文章

WEBSTORM前端 —— 第3章:移动 Web —— 第3节:移动适配

目录 一、移动Web基础 1.谷歌模拟器 2.屏幕分辨率 3.视口 4.二倍图 二、适配方案 三、rem 适配方案 四、less 1.less – 简介 2.less – 注释 3.less – 运算 4.less – 嵌套 5.less – 变量 6.less – 导入 7.less – 导出 8.less – 禁止导出 五…

【笔记】MSYS2 安装 Python 构建依赖记录Cython + Ninja + Meson + meson-python

#工作记录 📌 安装目标 为构建 Python C 扩展(如 numpy)安装必要依赖: CythonNinjaMeson meson-python ✅ 成功安装命令 pacman -S mingw-w64-x86_64-cython pacman -S mingw-w64-x86_64-ninja pacman -S mingw-w64-x86_64-me…

【染色归一化】staintools工具详讲

staintools工具原代码是没有GPU加速的,代码链接 运行速度较慢,因此,github上有研究者写了pytorch加速版本的staintools 本篇主要讲GPU加速版本的staintools工具的使用教程。 1.背景 目前的公开数据库中的WSI是由不同研究机构制作上传的,这导致WSI有很大的颜色差别,例如:…

历年中山大学计算机保研上机真题

历年中山大学计算机保研上机真题 2025中山大学计算机保研上机真题 2024中山大学计算机保研上机真题 2023中山大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 不连续1的子串 题目描述 给定一个数字 n n n,输出长度为 n n n 的 01…

历年山东大学计算机保研上机真题

历年山东大学计算机保研上机真题 2025山东大学计算机保研上机真题 2024山东大学计算机保研上机真题 2023山东大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 从1到100找质数 题目描述 从 1 1 1 到 100 100 100 中找出所有的质数。 输入格式 …

殷咏梅教授:OptiTROP-Breast05亮相2025 ASCO,中国原创TROP2 ADC为mTNBC一线治疗带来新希望

引言 抗体药物偶联物(ADC)以其精准杀伤特性,已成为乳腺癌治疗领域的探索热点。近年来,在全球ADC研发赛道中,中国的ADC力量正逐步崛起,乳腺癌领域首个中国原研、国际品质的TROP2 ADC芦康沙妥珠单抗脱颖而出&…

02.上帝之心算法用GPU计算提速50倍

本文介绍了上帝之心的算法及其Python实现,使用Python语言的性能分析工具测算性能瓶颈,将算法最耗时的部分重构至CUDA C语言在纯GPU上运行,利用GPU核心更多并行更快的优势显著提高算法运算速度,实现了结果不变的情况下将耗时缩短五…

latex 三线表-算法对比表

效果 导入包 \usepackage{booktabs} \usepackage{multirow}表格 \begin{table}[t]\caption{\textbf{Comparison of test results of various algorithms}\label{tab}}\centering\begin{tabular}{ccccc}\toprule\multirow{2}{*}{Algorithms} & \multirow{2}{*}{mAP} &…

蓝桥云课ROS学习C++教程cpp-geeksforgeeks版本

教程 网上教程很多&#xff0c;都可以在蓝桥云课ROS中复习。 #include <bits/stdc.h> using namespace std;int main() {// Creating a map of integer keys// and string valuesmap<int, string> m {{1, "Geeks"},{2,"For"}, {3,"Geek…

rtos,什么意思

RTOS,它的全称是 Real-Time Operating System,中文我们通常称之为“实时操作系统”。 让我们把这个词拆解开来,细细品味: Operating System (操作系统 - OS): 你肯定熟悉我们日常用的 Windows、Linux (桌面版或服务器版)、macOS 等。这些都是操作系统。它们的核心作用是什…

研读论文《Attention Is All You Need》(13)

原文 26 4 Why Self-Attention In this section we compare various aspects of self-attention layers to the recurrent and convolutional layers commonly used for mapping one variable-length sequence of symbol representations ( x 1 , ⋯ , x n ) (x_1,\cdots,x_…

智能体时代的数据安全:企业如何平衡效率与风险

数据来源&#xff1a;企业网D1net 智能体时代的数据安全&#xff1a;企业如何平衡效率与风险&#xff1f; 在数字化转型浪潮中&#xff0c;智能体&#xff08;Autonomous AI Agents&#xff09;正成为企业提升效率的利器。这些能够自主执行任务、分析数据并做出决策的AI系统&…

从模式到架构:Java 工厂模式的设计哲学与工程化实践

一、工厂模式概述 &#xff08;一&#xff09;定义与核心思想 工厂模式&#xff08;Factory Pattern&#xff09;是软件开发中常用的创建型设计模式&#xff0c;其核心思想是将对象的创建过程封装起来&#xff0c;通过工厂类来统一管理对象的创建逻辑。这种模式分离了对象的创…

Torch 和 CUDA 版本不兼容

原因解释 参考&#xff1a;https://stackoverflow.com/questions/76678846/pytorch-version-for-cuda-12-2 nvcc CUDA Toolkit 12.6 Downloads | NVIDIA Developer nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Fri_Jun_14_…

第九天:java注解

注解 1 什么是注解&#xff08;Annotation&#xff09; public class Test01 extends Object{//Override重写的注解Overridepublic String toString() {return "Test01{}";} }2 内置注解 2.1 Override Override重写的注解 Override public String toString() {ret…

Linux --进程状态

目录 进程状态(宏观) Linux进程状态 进程状态的查看 进程状态(宏观) 为了了解Linux的进程状态&#xff0c;首先我们得了解进程状态&#xff0c;因为不仅仅是在Linux下有进程状态&#xff0c;macos和windows下都有进程状态&#xff0c;这里先解释的是一个宏观概念下的&#xff…

定时任务:springboot集成xxl-job-core(二)

定时任务实现方式&#xff1a; 存在的问题&#xff1a; xxl-job的原理&#xff1a; 可以根据服务器的个数进行动态分片&#xff0c;每台服务器分到的处理数据是不一样的。 1. 多台机器动态注册 多台机器同时配置了调度器xxl-job-admin之后&#xff0c;执行器那里会有多个注…

操作系统学习(十)——文件系统

一、文件系统 在操作系统中&#xff0c;文件系统是用于管理存储设备上数据组织与存取的一种机制。 它是操作系统的重要组成部分&#xff0c;承担着对文件的创建、读写、组织、存储、访问控制等管理任务。 功能&#xff1a; 文件的创建与删除&#xff1b;文件的读写与访问&am…

【Linux】shell的条件判断

目录 一.使用逻辑运算符判定命令执行结果 二.条件判断方法 三.判断表达式 3.1文件判断表达式 3.2字符串测试表达式 3.3整数测试表达式 3.4逻辑操作符 一.使用逻辑运算符判定命令执行结果 && 在命令执行后如果没有任何报错时会执行符号后面的动作|| 在命令执行后…

Codeforces Round 1028 (Div. 2)(ABC)

A. Gellyfish and Tricolor Pansy 翻译&#xff1a; 水母和小花在玩一个叫 “决斗 ”的游戏。 水母有 a HP&#xff0c;花花有 b HP。 它们各有一个骑士。水母的骑士有 c HP&#xff0c;而花花的骑士有 d HP。 他们将进行一轮游戏&#xff0c;直到其中一方获胜。对于 k1、2、.…