【计算机网络】TCP协议相关总结,TCP可靠性的生动讲解

TCP 可靠性 = 确保快递不丢、不乱、不过载

机制作用(快递类比)防止的问题
检验和检查包裹是否损坏,损坏就重新发数据出错
序列号给每个包裹编号,按顺序整理乱序、重复
确认应答每送到一件,就让收件人签收丢失
滑动窗口控制一次寄几件,避免堆积过载
超时重传快递超时未送达,自动补发丢失
拥塞控制高峰期限流,减少派送压力网络堵塞
流量控制收件人快递放不下了,暂停派送过载
  • 滑动窗口和流量控制的个人理解:
  • 滑动窗口是限制某一刻的发送大小,而流量控制更像所需发送的全部流量的限制大小
  • 滑动窗口 就像一条限流高速公路,最多同时允许 5 辆车行驶(窗口大小 = 5)。
  • 流量控制 相当于整个高速的容量,如果总流量太大(接收端处理不过来),就会限速或关闭部分入口(缩小窗口)。

TCP 如何保证可靠性?

1️⃣ 检验和:接收端检测数据是否出错,若有错误则丢弃并请求重传。

2️⃣ 序列号 & 确认应答

  • 序列号:保证数据按序传输,去重重复数据。
  • 确认应答(ACK):接收方收到数据后,发送 ACK 确认,告知发送方已接收的数据范围及下次应发送的位置。

3️⃣ 滑动窗口:动态调整发送数据量,提高传输效率,防止接收端超载。

4️⃣ 超时重传:若发送数据超时未收到 ACK,认为丢失并重新发送,超时时间动态计算。

5️⃣ 拥塞控制:监测网络状态,避免因发送速率过高导致网络拥堵,保证数据高效传输。

6️⃣ 流量控制:接收端通过窗口大小告知发送方自身处理能力,避免数据过载和丢包。


TCP 滑动窗口详解

1. 滑动窗口是什么?

TCP 滑动窗口(Sliding Window)是一种流量控制机制,用于管理发送端和接收端的数据传输速率,确保高效传输的同时,防止接收端超载。
窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。

核心作用:

  • 提高传输效率:无需等待每个数据包的 ACK 确认才能继续发送,而是允许发送多个数据包,提高带宽利用率。
  • 避免接收方过载:根据接收方的处理能力调整发送速率,防止数据溢出。

2. 滑动窗口的工作过程

假设发送端一次最多发送 5 个数据包,窗口大小 = 5(每个数据包用 ①②③④⑤ 表示):

1️⃣ 初始状态(发送窗口 = 5)

[①②③④⑤] ⑥⑦⑧⑨🔟 ...  (窗口大小 = 5,最多可发送 5 个)
  • 发送方先发送 ①②③④⑤,等待 ACK 确认。

2️⃣ 收到部分 ACK(窗口右移)

✔① ✔② [③④⑤⑥⑦] ⑧⑨🔟 ...  
  • ①② 已收到 ACK,窗口向前滑动 2 位,允许发送 ⑥⑦。

3️⃣ 持续滑动(高效传输)

✔① ✔② ✔③ ✔④ ✔⑤ [⑥⑦⑧⑨🔟] ...  
  • 每次收到 ACK,窗口继续滑动,提高传输效率。

3. 窗口大小如何调整?

1️⃣ 流量控制(Flow Control)

  • 接收端调整窗口大小(rwnd,防止缓存溢出。例如:

    • 缓存充足 → 窗口大 → 发送方可发送更多数据。

    • 缓存快满了 → 窗口缩小 → 发送方减少数据发送。

    • 缓存满了 → 窗口变 0 → 发送方暂停发送,等待窗口恢复。

2️⃣ 拥塞控制(Congestion Control)

  • 发送端根据网络情况调整窗口大小(cwnd,防止网络拥堵。例如:

    • 网络畅通cwnd 增加,提高发送速率。

    • 检测到丢包cwnd 减小,降低发送速率。


TCP 拥塞控制详细解析

四大算法:

  • 慢开始(Slow Start)

  • 拥塞避免(Congestion Avoidance)

  • 快速重传(Fast Retransmit)

  • 快速恢复(Fast Recovery)


明确拥塞产生的基础过程:A发送报文,B回一个ACK表示收到,循环操作

慢开始

初始阶段指数增长,避免一开始就占满带宽,即每收到一次ACK就指数增长下一次发送报文的大小,但由此带来的问题是,从1开始的指数增长会不会也变得很大,导致拥塞,于是引出拥塞避免

拥塞避免

为慢开始的指数增长设定一个阈值,一旦超过后,不再指数增长,而是每次+1

快速重传

TCP 规定:当发送方连续收到 3 个重复 ACK,说明某个数据包丢失了。发送方立即重传丢失的数据包,而不等待超时。

  • 例:发送方发送 pkt1, pkt2, pkt3, pkt4。
    pkt2 丢失,接收方收到 pkt3 后,发送 重复 (在很短的时间内)ACK(pkt2)。

  • 发送方收到 3 个 ACK(pkt2),立即重传 pkt2,无需等待超时。(如果没有快速重传机制,正常是接收方每收到pkt2,所以一直不发送pkt2的ACK导致发送方没接到这个ACK最终超时,才进行重新发送)

快速恢复

避免慢开始,从丢包前的一半窗口大小开始,随后采用拥塞避免算法逐步增加窗口

  • 设想一下当前链路每次传输100,突然丢包,如果没有快速恢复,则根据慢开始算法从1开始,重新增长速度,太低效,因此规定,减少窗口大小到1/2而不从1开始,即,从50开始,同时停止指数增长,每次+1,复用拥塞避免的逻辑而不使用慢开始,这就是快速恢复。

什么是 SYN洪泛攻击?如何防范?

SYN洪泛攻击属于 DOS 攻击的一种,它利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。

1. 什么是半连接(Half-Open Connect)

在 TCP 三次握手过程中,服务器发送 [SYN/ACK] 后(第二次握手后),进入 SYN_RECV 状态,等待客户端的 [ACK]

  • 若收到 [ACK],连接建立。
  • 若未收到,服务器会 重发 [SYN/ACK] 直至超时,占用资源。
2. SYN 攻击原理

攻击者伪造 大量不存在的 IP 地址,向服务器发送 [SYN],服务器回复 [SYN/ACK] 并等待 ACK,但客户端 不会响应

  • 影响:大量半连接占满队列,导致正常请求无法处理,甚至服务器瘫痪。
  • 检测:若服务器出现 大量 SYN_RECV 连接,且来源 IP 随机,基本可判定为 SYN 攻击。
3. SYN 攻击防范
  • 网络层防护
    • 通过 防火墙/路由器 过滤异常流量。
    • 限制 每个 IP 的 SYN 速率
  • TCP/IP 协议栈优化
    • 增加最大半连接数,提高抗攻击能力。
    • 缩短 SYN 超时时间,减少资源占用。
  • SYN Cookies 技术
    • SYN/ACK 中嵌入 特殊编码(Cookie),不分配资源,只有客户端回复正确的 ACK 才真正建立连接。
    • 特点:无需维护半连接队列,可有效抵御 SYN 攻击。

https://github.com/0voice

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

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

相关文章

Go基于协程池的延迟任务调度器

原理 通过用一个goroutine以及堆来存储要待调度的延迟任务,当达到调度时间后,将其添加到协程池中去执行。 主要是使用了chan、Mutex、atomic及ants协程池来实现。 用途 主要是用于高并发及大量定时任务要处理的情况,如果使用Go协程来实现每…

杰发科技AC7801——滴答定时器获取时间戳

1. 滴答定时器 杰发科技7801内部有一个滴答定时器,该定时器是M0核自带的,因此可以直接用该定时器来获取时间戳。 同样,7803也可以使用该方式获取时间戳。 2. 滴答定时器原理 SysTick是一个24位的递减计数器,它从预设的重装载值…

湖仓一体概述

湖仓一体之前,数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库,它是一个最基础的概念,主要负责联机事务处理,也提供基本的数据分析能力。 随着数据量的增长,出现了数据仓库,它存储的是…

第十五届蓝桥杯单片机组4T模拟赛三(第二套)

本套试题在4T平台中的名字为第15届蓝桥杯单片机组模拟考试三,不知道哪套是4T的模拟赛,所以两套都敲一遍练练手感。 为了代码呈现美观,本文章前面的各个模块在main函数中的处理函数均未添加退出处理,在最后给出的完整代码中体现。 …

CT技术变迁史——CT是如何诞生的?

第一代CT(平移-旋转) X线球管为固定阳极,发射X线为直线笔形束,一个探测器,采用直线和旋转扫描相结合,即直线扫描后,旋转1次,再行直线扫描,旋转180完成一层面扫描,扫描时间3~6分钟。矩阵象素256256或320320。仅用于颅脑检查。 第二代CT (平移-旋转) 与第一代无质…

Virtual Box虚拟机安装苹果Monterey和big sur版本实践

虚拟机安装苹果实践,在Windows10系统,安装Virtual Box7.1.6,安装虚拟苹果Monterey版本Monterey (macOS 12) 。碰到的主要问题是安装光盘不像Windows那么容易拿到,而且根据网上很多文章制作的光盘,在viritualBox里都无法…

dify基础之prompts

摘要:在大型语言模型(LLM)应用中,Prompt(提示词)是连接用户意图与模型输出的核心工具。本文从概念、组成、设计原则到实践案例,系统讲解如何通过Prompt解锁LLM的潜能,提升生成内容的…

【学写LibreCAD】0 仿写LibreCAD简介

一、LibreCAD 核心模块: 核心模块(Core) 功能:处理 CAD 的核心逻辑,如几何计算、图形对象管理、坐标系转换等。关键组件: 图形对象:如直线、圆、圆弧、多段线等。数学工具:向量、矩…

HTML元素,标签到底指的哪块部分?单双标签何时使用?

1. 标签&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 标签&#xff08;Tag&#xff09; 标签是 HTML 中用于定义元素的符号&#xff0c;用尖括号 < > 包裹。例如 <img> 是标签。元素&#xff08;Element&#xff09; 元素是由 标签 内容…

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…

Token相关设计

文章目录 1. 双Token 机制概述1.1 访问令牌&#xff08;Access Token&#xff09;1.2 刷新令牌&#xff08;Refresh Token&#xff09; 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token&#xff08;使用 JWT&#xff09;3.2 解析 Token3.3 登录接口&#xff08;返回…

HTTP 请求时传递多部分表单数据

HTTP 请求时传递多部分表单数据&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基础关键_013_日期处理

目 录 一、传统 API 1.System.currentTimeMillis() &#xff08;1&#xff09;说明 &#xff08;2&#xff09;实例 2.构造方法 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;无参构造 &#xff08;3&#xff09;有参构造 3.日期格式化 &#xff08;1&am…

51单片机中reg52.h与regx52.h在进行位操作时的不同

reg52.h中不能使用例如 P2_0;这样的定义 而只能使用 P2^0;这样的定义 但是都不可以对位进行直接赋值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下划线的才可以对位进行赋值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 语言中&#xff0c;…

基于Rook的Ceph云原生存储部署与实践指南(上)

#作者&#xff1a;任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…

Spring Data JPA 中的分页实现:从 BasePage 到 Pageable

文章目录 Spring Data JPA 中的分页实现&#xff1a;从 BasePage 到 Pageable背景&#xff1a;为什么需要分页&#xff1f;认识 BasePage 类深入 toPageable() 方法1. 处理页码和页面大小2. 处理排序方向3. 处理排序字段4. 生成 Pageable 对象 实战&#xff1a;如何使用 BasePa…

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…

python量化交易——金融数据管理最佳实践——qteasy创建本地数据源

文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心&#xff0c;删除后无法恢复&#xff01;&#xff01;总结 qteas…