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

TCP相关问题 第一篇

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.xdnf.cn/news/937549.html

相关文章:

  • Windows权限提升篇数据库篇MYSQLMSSQLORACLE自动化项目
  • 管理数据洪流:自动化处理与归档每日数据文件的策略与实践
  • BOM(Browser Object Model)核心对象手册
  • CNN核心机制深度解析:卷积池化原理 PyTorch实现经典网络
  • MSYS2 环境配置与 Python 项目依赖管理笔记
  • Z-FOLD: A Frustratingly Easy Post-Training Quantization Scheme for LLMs
  • MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点
  • 深入理解 Java 的反射、注解与动态代理
  • 基于Python学习《Head First设计模式》第十章 状态模式
  • JavaScript数组扁平化(Array Flattening)全解析:从基础到进阶的9种实现方式及深度对比
  • C++.OpenGL (17/64)深度测试(Depth Testing)
  • Python Wheel 打包基本原理详解
  • LangChain工具集成实战:构建智能问答系统完整指南
  • RoboDK 自定义机器人
  • 当前市场环境下,软件行业的突围之道:技术演进与商业模式重构
  • 工厂方法模式和抽象工厂方法模式的battle
  • 135. 分发糖果
  • 【P2P】直播网络拓扑及编码模式
  • 【2025年6月8日】Claude 4 国内使用全攻略
  • 【优选算法】模拟 问题算法
  • CompletableFuture+线程池使用案列
  • 直观地理解程序的堆和栈
  • Go 语言中的内置运算符
  • LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现
  • 算法工程师认知水平要求总结
  • (javaEE)网络原理-初识 局域网和广域网 ip地址和端口号 协议 五元组 协议分层 OSI七层模型 网络数据通信的基本流程
  • (二)原型模式
  • AI短视频创富营
  • Go语言系统监控实战:gopsutil库全面解析与应用
  • nginx部署