TCP相关问题1

1.TCP主动断开连接方为什么需要等待2MSL

在这里插入图片描述

如上图所示:在被动链接方调用close,发送FIN时进入LAST_ACK状态,但未收到主动连接方的ack确认,需要被动连接方重新发送一个FIN,而为什么是2MSL,一般认为丢失ack在网络中生存的时间是1MSL,重传FIN也需要1MSL,所以需要等待2MSL时间。

2.SYN什么时候被丢弃?
  • TCP的半连接队列和全连接队列满了,造成SYN被丢弃

  • 开启tcp_tw_recycle参数,并且在NAT环境下,造成SYN被丢弃

a.TCP中linux 内核维持两个队列,半连接队列和全连接队列

三次握手过程 :

  1. 服务端收到客户端SYN请求请求后,内核会把该连接存储到半连接队列,并向客户端响应SYN+ACK。
  2. 接着客户端会返回ACK,服务端收到第三次握手的ACK后,内核会把连接从半连接队列(listen)移除。
  3. 然后创建新的完全连接,并将其添加到accept完全队列,等待进程调用accept函数时把连接取出来。

在这里插入图片描述

  • 半连接队列满了:大量SYN同时道道服务端,导致SYN被丢弃,会造成SYN泛洪攻击。

    • 解决方案:

      ​ 1.增加半连接队列。

      ​ 2.开启tcp_syncookies

      ​ 3.减少syn+ack重传次数

  • 全连接队列满了:在服务端并发处理大量请求,如果accept队列过小时或者应用程序accept不及时,会造成accept队列满了,这是之后的连接会被丢弃,这样会造成服务端请求数量上不去的问题。

    • 解决方案:

      ​ 1.调大accept队列最大长度,通过accept 的backlog参数以及samaconnect参数

      ​ 2.检查系统或者程序代码为什么accept不及时。

b.开启tcp_tw_recycle参数,并且在NAT环境下,造成SYN被丢弃

2.前因

​ TCP四次挥手过程中主动断开方会有一个TIME_WAIT状态,这个状态会有2MSL等待时间变为CLOSE状态。

在这里插入图片描述

  • 前因1:在linux操作系统中,TIME_WAIT等待时间2MSL为60s。主动断开方需要等待2MSL时间端口才能被释放。

  • 前因2:客户端主动断开连接并且大量主动断开连接。客户端一直占用连接,2MSL时间内端口一直被占用,一般开启的端口号为32768~61000,资源有限。如果客户端发起大量连接,并且断开进入TIME_WAIT状态,端口被占用导致后面其他客户端无端口可用。

    小结:TCP要解决当前没有端口可用,客户端还要建立连接,所以诞生了tcp_tw_recycle

  • 前因3:

    • tcp_tw_recycle,如果选项开启的话,允许处于TIME_WAIT状态的连接被快速回收。
    • tcp_tw_reuse,如果选项开启的话,在调用connect函数时,如果内核选择到的端口已经被相同的四元组占用时,就会判断是否处于TIME_WAIT状态,如果状态处于TIME_WAIT,并且状态持续时间超过了1s,那么就会重用这个连接,然后可以正常使用这个端口了,只使用于连接发起方
  • 前因4:开启了recycle和timestamp选项,触发PAWS机制(per-host的PAWS机制)

    • 作用防止TCP中的序号发生绕回

      使用tcp协议进行数据传输时,tcp都包含一个32位的序号,用于表示报文段中的数据在整个数据流中的位置,TCP序号的最大值为2^32,是一个无符号整数,到达最大值时序号会循环变为0,这个现象叫做"序号绕回"

在这里插入图片描述

  • 经过同一NAT转换来自不同的client的数据流,在服务端看来是于同一host打交道

    客户端用的NAT网关,不同客户端经过同一NAT之后,转换为同一个公网IP,在服务端看来好像跟同一个客户端打交道

  • 虽然经过同一个NAT转化,但不同客户端各自携带自己的timestamp,经过NAT转换后无法保证数据包带的timestamp值严格递增。

  • 当服务端的per-host PAWS机制被触发后,会丢弃timestamp值不符合递增条件的包。

    例如:

    ​ a.当客户端A经过NAT网关和服务端建立TCP连接,然后服务端主动关闭并快速回收TIME_WAIT状态连接后,客户端B 也通过NAT和服务器建立连接,由于客户端A和B经过同一个NAT转换,所以相同的IP地址服务端认为是一个客户端发送过来的,客户端B发送的timestamp较小,由于服务端的PAWS机制,服务端会丢弃客户端B发送的较小timestap的SYN包

  • tcp_tw_recyle在linux4.12版本后,直接取消了这一参数。

mestap的SYN包

  • tcp_tw_recyle在linux4.12版本后,直接取消了这一参数。

参考连接:https://www.bilibili.com/video/BV1Pw411U7TA?spm_id_from=333.788.videopod.sections&vd_source=4a32de7f18a719e139c5f65d7ba504d1

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32启动文件学习(startup_stm32f40xx.s)

原代码 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40xx.s ;* Author : MCD Application Team ;* version : V1.8.0 ;* date : 09-November-2016 ;* Desc…

uni-app学习笔记二十三--交互反馈showToast用法

showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

概述 在历经半个月的间歇性开发后,RagflowPlus再次迎来一轮升级,正式发布v0.4.0。 开源地址:https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码: git clone https://github.com/zstar1003/ragflow-plus.…

【论文解读】Toolformer: 语言模型自学使用工具

1st author: ‪Timo Schick‬ - ‪Google Scholar‬ paper: Toolformer: Language Models Can Teach Themselves to Use Tools | OpenReview NeurIPS 2023 oral code: lucidrains/toolformer-pytorch: Implementation of Toolformer, Language Models That Can Use Tools, by…

Spring 官方推荐构造函数注入

1. 依赖关系明确 构造函数注入可以清晰地声明类的依赖关系,所有必需的依赖项都通过构造函数参数传递,使得代码的可读性更高。这种方式让类的使用者能够直观地了解类的依赖,而不需要通过注解或反射来猜测。 2. 增强代码健壮性 构造函数注入…

[深度学习]搭建开发平台及Tensor基础

一、实验目的 1. 掌握Windows下PyTorch 深度学习环境的配置 2. 掌握一种PyTorch开发工具 3. 理解张量并掌握Tensor的常用操作(创建、调整形状、加、减、乘、除、取绝对值、比较操作、数理统计操作 4. 掌握Tensor与Numpy的互相转换操作 5. 掌握Tensor 的降维和…

【Zephyr 系列 14】使用 MCUboot 实现 BLE OTA 升级机制:构建安全可靠的固件分发系统

🧠关键词:Zephyr、MCUboot、OTA 升级、BLE DFU、双分区、Bootloader、安全固件管理 📌面向读者:希望基于 Zephyr 为 BLE 设备加入安全 OTA 升级功能的开发者 📊预计字数:5200+ 字 🧭 前言:为什么你需要 OTA? 随着设备部署数量增多与产品生命周期延长,远程升级(…

App Search 和 Workplace Search 独立产品现已弃用

作者:来自 Elastic The Search Product Team App Search 和 Workplace Search 的核心功能已集成到 Elasticsearch 和 Kibana 中。 我们宣布在 9.0 版本中弃用 App Search 和 Workplace Search。 如果你是 Elastic 的客户,当前正在使用 App Search 和 Wo…

Spring Boot + OpenAI 构建基于RAG的智能问答系统

一、技术架构设计 1.1 系统架构图 [前端]│▼ (HTTP/REST) [Spring Boot Controller]│▼ (Service Call) [问答处理服务层]├─▶ [知识库检索模块] ──▶ [向量数据库]└─▶ [OpenAI集成模块] ──▶ [OpenAI API]│▼ [结果组装与返回] 1.2 技术选型 组件技术栈版本要求…

Oracle实用参考(13)——Oracle for Linux物理DG环境搭建(2)

13.2. Oracle for Linux物理DG环境搭建 Oracle 数据库的DataGuard技术方案,业界也称为DG,其在数据库高可用、容灾及负载分离等方面,都有着非常广泛的应用,对此,前面相关章节已做过较为详尽的讲解,此处不再赘述。 需要说明的是, DG方案又分为物理DG和逻辑DG,两者的搭建…

【论文阅读29】区间预测CIPM(2025)

这篇论文主要研究的是滑坡位移的区间预测方法,提出了一种新型的预测模型,叫做复合区间预测模型(CIPM),并以三峡库区的白家堡滑坡为案例进行了应用和验证。论文的核心内容和贡献包括: 背景与问题 滑坡位移预…

Linux 文件系统底层原理笔记:磁盘结构、ext2 文件系统与软硬链接解析

文章目录 一、理解硬件1.1 磁盘、服务器、机柜、机房1.2 磁盘物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构1.4.1 理解过程1.4.2 真实过程 1.5 CHS && LBA地址 二、引入文件系统2.1 引入"块"概念2.2 引入"分区"概念2.3 引入"inode"概念…

75Qt窗口_Qt窗口概览

Qt 窗⼝ 是通过 QMainWindow类 来实现的。 QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的布局。 QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝&#x…

Appium+python自动化(九)- 定位元素工具

简介 环境搭建好了,其他方面的知识也准备的差不多了,那么就开始下一步元素定位,元素定位主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作. 此外在介绍另一款工具:Insp…

apipost将token设置为环境变量

右上角 可以新增或者是修改当前的环境 环境变量增加一个token,云端值和本地值可以不用写 在返回token的接口里设置后执行操作,通常是登录的接口 右侧也有方法提示 //设置环境变量 apt.environment.set("token", response.json.data.token); 在需要传t…

【Docker 02】Docker 安装

🌈 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行,没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …

青少年编程与数学 01-011 系统软件简介 08 Windows操作系统

青少年编程与数学 01-011 系统软件简介 08 Windows操作系统 1. Windows操作系统的起源与发展1.1 早期版本(1985-1995)1.2 Windows 9x系列(1995-2000)1.3 Windows NT系列(1993-2001)1.4 Windows XP及以后版…

微服务架构的性能优化:链路追踪与可观测性建设

📋 目录 引言:微服务性能挑战微服务架构性能瓶颈分析可观测性体系概述链路追踪技术深度解析性能监控指标体系日志聚合与分析分布式追踪系统实现性能优化策略与实践自动化性能调优故障诊断与根因分析最佳实践与案例研究未来发展趋势 引言 随着微服务架…

ubuntu屏幕复制

在ubnuntu20中没有办法正常使用镜像功能,这里提供一下复制屏幕的操作. 使用xrandr查看所有的显示器情况 这里我发现自己的电脑没有办法直接设置分辨率,但是外接的显示器可以设置,从命令行来说就是设置: xrandr --output HDMI-0 --mode 1920x1080那怎么样才能将原生电脑屏幕换…

Android 线性布局中常见的冲突属性总结

1. gravity vs layout_gravity 冲突原因:两者作用对象不同,混用会导致行为异常。 区别: android:gravity:父容器的属性,控制子元素在容器内的对齐方式。android:layout_gravity:子元素的属性,控…