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

TCP小结

1. 核心特性

面向连接:通过三次握手建立连接,四次挥手终止连接,确保通信双方状态同步。

TCP连接建立的3次握手

抓包:

client发出连接请求;

server回应client请求,并且同步发送syn连接;

client回应连接,至此3步握手完成。

TCP连接释放的4次握手

Client:192.168.2.100 -- server:192.168.2.101之间的TCP 4次挥手(释放连接)

client主动断开连接

 server确认断开,server主动断开,client确认断开。

可靠性传输:通过序列号、确认应答(ACK)、超时重传、重复ACK检测等机制保证数据完整有序。

序列号、确认应答(ACK):

超时重传

重复ACK

全双工通信:双方可同时发送和接收数据。

字节流服务:数据被拆分为TCP段传输,接收方按序重组为连续字节流。

流量控制:通过滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出。

什么是TCP窗口

TCP 采用流量控制(Flow Control)机制,使用滑动窗口(Sliding Window)来管理数据的发送和接收。

TCP 头部中的 窗口大小字段(Window Size) 指定了接收方当前可以接受的最大数据量,用于控制数据流,以防止接收方被发送方淹没。

窗口大小字段(16 位)最大能表示的值是 65,535(2¹⁶ - 1)字节,即约 64 KB,这个值在现代高速网络环境下严重不足,因此 TCP 提供了 Window Scale 选项来扩展窗口大小

Window Scale选项的作用

Window Scale(窗口缩放)选项用于扩展 TCP 窗口的大小,使其支持最大 1GB(2³⁰ 字节)的窗口,而不是 64KB。

在 TCP 头部,窗口大小字段 只有 16 位,最大值为 65,535 字节(64KB)。

但是,高带宽-时延(BDP,Bandwidth Delay Product)网络环境下,64KB 可能会严重限制吞吐量。

Window Scale 选项通过左移窗口大小字段,扩展了窗口的范围,最大可达 1GB

Window Scale 选项的工作原理

TCP 窗口扩展通过一个"缩放因子"(Scaling Factor)来扩大窗口的大小:

Window Scale 选项定义了一个因子 n(0 ≤ n ≤ 14),窗口大小的计算方式变为:

实际窗口大小=TCP 头部窗口大小字段×2^n(2的n次方)

其中:

   TCP 头部的窗口字段(Window Size) 仍然存储 16 位的值(最大 65,535)。

   缩放因子 n 在 Window Scale 选项中存储,范围是 0 到 14。

   最终的实际窗口大小最大可达 65,535 × 2¹⁴ = 1,073,725,440 字节(即 1GB)。

Window Scale 选项的格式

Kind    Length  Shift Count

+------+--------+-------------+

|  3     |   3      |     n         |

+------+--------+-------------+

字段解释:

Kind = 3:表示这是 Window Scale 选项。

Length = 3:整个字段占用 3 字节。

Shift Count:即缩放因子 n,接收方必须用 2^n 进行窗口扩展计算。

Window Scale 选项的协商(在 TCP 三次握手时)

Window Scale 选项只能在 TCP 三次握手期间协商,后续不能更改。

双方都必须在 SYN 报文中发送 Window Scale 选项,否则不会启用。

每一方独立协商自己的窗口缩放因子。

Tcp连接第一次握手协商win-mss-ws

Tcp连接第二次握手协商win-mss-ws

Tcp连接第三次握手协商win

TCP发送窗口和接收窗口

拥塞控制:通过慢启动、拥塞避免、快速重传/恢复等算法避免网络过载。

慢启动(Slow Start)

初始拥塞窗口(cwnd)较小,每收到一个ACK,cwnd指数增长(如1, 2, 4, 8...)。

达到阈值(ssthresh)后进入拥塞避免阶段。

拥塞避免

cwnd线性增长(如每RTT增加1),避免激进发送。

快速重传与快速恢复

检测到3个重复ACK时,立即重传丢失包,并设置ssthresh = cwnd/2, cwnd = ssthresh + 3,进入快速恢复阶段。

超时重传(拥塞处理)

超时表明严重拥塞,重置ssthresh = cwnd/2, cwnd = 1,重新慢启动。

1、慢启动;慢启动的算法:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。(慢启动呈指数增加)

这里假定拥塞窗口 cwnd 和发送窗口 swnd 相等,下面举个栗子:

连接建立完成后,一开始初始化 cwnd = 1,表示可以传一个 MSS 大小的数据。

当收到一个 ACK 确认应答后,cwnd 增加 1,于是一次能够发送 2 个

当收到 2 个的 ACK 确认应答后, cwnd 增加 2,于是就可以比之前多发2 个,所以这一次能够发送 4 个

当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于是就可以比之前多发 4 个,所以这一次能够发送 8 个。可以看出慢启动算法,发包的个数是指数性的增长

那慢启动涨到什么时候是个头呢?

有一个叫慢启动门限  ssthresh (slow start threshold)状态变量。

当 cwnd(拥塞窗口) < ssthresh 时,使用慢启动算法。

当 cwnd(拥塞窗口) >= ssthresh 时,就会使用「拥塞避免算法」。

2、拥塞避免;进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。(拥塞避免线性增长),当触发了重传机制,也就进入了「拥塞发生算法」。

前面说道,当拥塞窗口 cwnd 「超过」慢启动门限 ssthresh 就会进入拥塞避免算法。

一般来说 ssthresh 的大小是 65535 字节。

那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。

接上前面的慢启动的例子,现假定 ssthresh 为 8:当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。

就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。

当触发了重传机制,也就进入了「拥塞发生算法」。

3、拥塞发生

当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:超时重传、快速重传

当发生了「超时重传」,就会使用拥塞发生算法。

这个时候,Ssthresh(慢启动门限) 和 cwnd(拥塞窗口) 的值会发生变化:

ssthresh 设为 cwnd/2(慢启动门限设置为当前拥塞窗口的1/2),

cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1),

接着,就重新开始慢启动,慢启动是会突然减少数据流的。这真是一旦「超时重传」,马上回到解放前。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。

发生快速重传拥塞发生算法

快速重传算法:当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。

TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:

cwnd(拥塞窗口) = cwnd/2 ,也就是设置为原来的一半;

ssthresh(慢启动门限) = cwnd;

进入快速恢复算法。

4、快速恢复

快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。

进入快速恢复之前,cwnd 和 ssthresh 已被更新了:

cwnd = cwnd/2 ,也就是设置为原来的一半;

ssthresh = cwnd;

进入快速恢复算法如下:

1.拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);

2.重传丢失的数据包;

3.如果再收到重复的 ACK,那么 cwnd 增加 1;

4.如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

2. 抓包分析技巧

Wireshark过滤:

  tcp.analysis.retransmission:定位重传包。

  tcp.analysis.window_update:观察窗口变化。

  tcp.options.sack:分析SACK块范围。

关键指标:

  重传率 = 重传包数 / 总包数(>1%需告警)。

  乱序深度:连续Out-Of-Order包数量。

  RTT波动:标准差反映网络稳定性。

相关文章:

TCP小结

1. 核心特性 面向连接&#xff1a;通过三次握手建立连接&#xff0c;四次挥手终止连接&#xff0c;确保通信双方状态同步。 TCP连接建立的3次握手 抓包&#xff1a; client发出连接请求&#xff1b; server回应client请求&#xff0c;并且同步发送syn连接&#xff1b; clien…...

django ssh登录 并执行命令

在Django开发环境中&#xff0c;通常不推荐直接通过SSH登录到服务器并执行命令&#xff0c;因为这违背了Django的架构设计原则&#xff0c;即前端与后端分离。Django主要负责处理Web请求、逻辑处理和数据库交互&#xff0c;而不直接执行系统级命令。然而&#xff0c;在某些情况…...

unix/linux,sudo,其高级使用

掌握了sudo的基石,现在是时候向更高阶的技巧和应用进发了!sudo的强大远不止于简单的sudo <command>。它的高级用法能让你在复杂的系统管理和安全场景中游刃有余,如同经验丰富的物理学家巧妙运用各种定律解决棘手问题。 sudo 的高级使用技巧与场景 精细化命令控制与参…...

Python 打包指南:setup.py 与 pyproject.toml 的全面对比与实战

在 Python 开发中&#xff0c;创建可安装的包是分享代码的重要方式。本文将深入解析两种主流打包方法——setup.py 和 pyproject.toml&#xff0c;并通过一个实际项目示例&#xff0c;展示如何使用现代的 pyproject.toml 方法构建、测试和发布 Python 包。 一、setup.py 与 pyp…...

计算机视觉与深度学习 | 基于OpenCV的实时睡意检测系统

基于OpenCV的实时睡意检测系统 下面是一个完整的基于OpenCV的睡意检测系统实现,该系统使用眼睛纵横比(EAR)算法检测用户是否疲劳或瞌睡。 import cv2 import numpy as np import dlib from scipy.spatial import distance as dist import pygame import time# 初始化pygame用…...

python打卡day44@浙大疏锦行

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 作业&#xff1a; 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;尽可能和他人选择的不同尝试通过ctrl进入resnet的…...

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…...

NiceGUI 是一个基于 Python 的现代 Web 应用框架

NiceGUI 是一个基于 Python 的现代 Web 应用框架&#xff0c;它允许开发者直接使用 Python 构建交互式 Web 界面&#xff0c;而无需编写前端代码。以下是 NiceGUI 的主要功能和特点&#xff1a; 核心功能 1.简单易用的 UI 组件 提供按钮、文本框、下拉菜单、滑块、图表等常见…...

生动形象理解CNN

好的&#xff01;我们把卷积神经网络&#xff08;CNN&#xff09;想象成一个专门识别图像的“侦探小队”&#xff0c;用破案过程来生动解释它的工作原理&#xff1a; &#x1f575;️♂️ 案件&#xff1a;识别一张“猫片” 侦探小队&#xff08;CNN&#xff09;的破案流程&am…...

python入门(1)

第一章 第一个python程序 1.1 print函数 print方法的作用 : 把想要输出的内容打印在屏幕上 print("Hello World") 1.2 输出中文 在Python 2.x版本中&#xff0c;默认的编码方式是ASCII编码方式&#xff0c;如果程序中用到了中文&#xff0c;直接输出结果很可能会…...

【PDF提取表格】如何提取发票内容文字并导出到Excel表格,并将发票用发票号改名,基于pdf电子发票的应用实现

应用场景 该应用主要用于企业财务部门或个人处理大量电子发票&#xff0c;实现以下功能&#xff1a; 自动从 PDF 电子发票中提取关键信息&#xff08;如发票号码、日期、金额、销售方等&#xff09;将提取的信息整理并导出到 Excel 表格&#xff0c;方便进行财务统计和报销使…...

Hugging Face 最新开源 SmolVLA 小模型入门教程(一)

系列文章目录 目录 系列文章目录 前言 一、引言 二、认识 SmolVLA&#xff01; 三、如何使用SmolVLA&#xff1f; 3.1 安装 3.2 微调预训练模型 3.3 从头开始训练 四、方法 五、主要架构 5.1 视觉语言模型&#xff08;VLM&#xff09; 5.2 动作专家&#xff1a;流匹…...

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发

封闭内网安装配置VSCode Anconda3 并配置 PyQt5开发 零一 vscode1.1 下载 vscode1.2 下载插件1.3 安装 二 anaconda 32.1 下载2.2 新建虚拟环境1 新建快捷方式,启动base2 新建虚拟环境 3 配置Qt designer3.1 designer.exe和uic.exe3.2 设置插件,3.4 ui文件转为py文件 4使用4.1 …...

大话软工笔记—组合要素2之逻辑

1. 逻辑的概念 逻辑&#xff0c;指的是思维的规律和规则&#xff0c;是对思维过程的抽象。 结合逻辑的一般定义以及信息系统的设计方法&#xff0c;对逻辑的概念进行抽提、定义为三个核心内涵&#xff0c;即&#xff1a;规律、顺序、规则。 &#xff08;1&#xff09;规律&a…...

浅谈边缘计算

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

宝塔专属清理区域,宝塔清理MySQL日志(高效释放空间)

1. 删除超过 365 天的积分变更记录 宝塔面板 → 数据库 → 选择数据库 → 点击 管理 进入 phpMyAdmin 后&#xff1a; 选择在用的数据库名 看到顶部的 SQL 点击 输入命令 然后点击执行 DELETE FROM pre_common_credit_log WHERE dateline < UNIX_TIMESTAMP(DATE_SUB(NO…...

7.Demo Js执行同步任务,微任务,宏任务的顺序(3)

一个包含 同步任务、微任务&#xff08;Promise&#xff09;、宏任务&#xff08;setTimeout&#xff09; 的例子&#xff0c;JS 是怎么调度这些任务的。 &#x1f3af; 例子代码&#xff08;建议复制到浏览器控制台运行&#xff09; console.log(‘同步任务 1’); setTimeo…...

边缘计算网关赋能沸石转轮运行故障智能诊断的配置实例

一、项目背景 在环保行业&#xff0c;随着国家对大气污染治理要求的不断提高&#xff0c;VOCs废气处理成为了众多企业的重要任务。沸石转轮作为一种高效的VOCs治理设备&#xff0c;被广泛应用于石油化工、汽车制造、印刷包装等主流行业。这些行业生产规模大、废气排放量多&…...

机器学习之深入理解机器学习常见算法:原理、公式与应用

机器学习之深入理解机器学习常见算法:原理、公式与应用 机器学习是一门让计算机自动从数据中学习规律的技术体系。常见的机器学习算法可以分为监督学习、无监督学习和深度学习三大类。本文将系统介绍每类中具有代表性的算法,并深入剖析其核心原理与数学基础。 一、监督学习(…...

Python实例题: Python 的简单电影信息

目录 Python实例题 题目 代码实现 实现原理 网页请求&#xff1a; 内容解析&#xff1a; 数据存储&#xff1a; 反爬策略&#xff1a; 关键代码解析 1. 网页请求处理 2. 电影列表解析 3. 电影详情解析 4. 爬虫主逻辑 使用说明 安装依赖&#xff1a; 修改配置&a…...

MyBatis 的动态 SQL

1. 动态 SQL 的定义 动态 SQL 是 MyBatis 的核心特性之一&#xff0c;它允许开发者根据运行时条件动态生成 SQL 语句。通过特殊的 XML 标签或注解语法&#xff0c;实现 SQL 的灵活拼接&#xff0c;避免在 Java 代码中手动拼接 SQL 字符串的复杂性和安全风险。 2. 核心作用 条…...

Redis中的setIfAbsent方法和execute

Redis中的setIfAbsent方法 Redis中的setIfAbsent方法是一种原子操作&#xff0c;它的作用是只有在指定的键不存在时才会设置值。这个方法在并发环境下非常有用&#xff0c;因为它可以避免多个客户端同时尝试设置相同键而导致的冲突。 代码示例 在Java中使用setIfAbsent方法通…...

高考数学易错考点02 | 临阵磨枪

文章目录 前言解析几何立体几何排列组合概率导数及应用前言 本篇内容下载于网络,网络上的都是以 WORD 版本呈现,缺字缺图很不完整,没法使用,我只是做了补充和完善。有空准备进行第二次完善,添加问题解释的链接。 ##平面向量 40.向量 0 ⃗ \vec{0} 0 与数 0 0 0 有区别…...

国产高性能pSRAM选型指南:CSS6404LS-LI 64Mb QSPI伪静态存储器

一、芯片基础特性 核心参数 容量 &#xff1a;64Mb&#xff08;8M 8bit&#xff09;电压 &#xff1a;单电源供电 2.7-3.6V &#xff08;兼容3.3V系统&#xff09;接口 &#xff1a;Quad-SPI&#xff08;QPI/SPI&#xff09;同步模式封装 &#xff1a; SOP-8L (150mil) &#…...

Go 中 `json.NewEncoder/Decoder` 与 `json.Marshal/Unmarshal` 的区别与实践

Go 中 json.NewEncoder/Decoder 与 json.Marshal/Unmarshal 的区别与实践&#xff08;HTTP 示例&#xff09; 在 Go 中处理 JSON 有两种主要方式&#xff1a;使用 json.Marshal/Unmarshal 和使用 json.NewEncoder/Decoder。它们都能完成 JSON 的序列化与反序列化&#xff0c;但…...

UE5 2D角色PaperZD插件动画状态机学习笔记

UE5 2D角色PaperZD插件动画状态机学习笔记 0.安装PaperZD插件 这是插件下载安装地址 https://www.fab.com/zh-cn/listings/6664e3b5-e376-47aa-a0dd-f7bbbd5b93c0 1.右键创建PaperZD 动画序列 2.添加动画序列 3&#xff0c;右键创建PaperZD AnimBP &#xff08;动画蓝图&am…...

Ubuntu 16.04 密码找回

同事整理的供参考&#xff1a; 进入GRUB菜单 重启系统&#xff0c;在启动过程中长按Shift键&#xff08;或Esc键&#xff09;进入GRUB引导菜单。 若未显示GRUB菜单&#xff0c;可尝试在启动时连续按多次Shift/Esc键。 在GRUB菜单中选择默认的Ubuntu启动项&#xff08;第一…...

【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation

DanceGRPO: Unleashing GRPO on Visual Generation 原文摘要 研究背景与问题 生成模型的突破&#xff1a;扩散模型和整流流等生成模型在视觉内容生成领域取得了显著进展。核心挑战&#xff1a;如何让模型的输出更好地符合人类偏好仍是一个关键问题。现有方法的局限性&#xff1…...

CentOS在vmware局域网内搭建DHCP服务器【踩坑记录】

1. 重新设置环境 配置dhcp服务踩了不少坑&#xff0c;这里重头搭建记录一下&#xff1a; 1.1 centos 网卡还原 如果之前搭了乱七八糟的环境&#xff0c;导致NAT模式也没法上网&#xff0c;这里重新还原 我们需要在NAT模式下联网&#xff0c;下载DHCP服务 先把centos的网卡还…...

AI炼丹日志-28 - Audiblez 将你的电子书epub转换为音频mp3 做有声书

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; 大模型与Java双线更新中&#xff01; 目前《大语言模型实战》已连载至第22篇&#xff0c;探索 MCP 自动操作 FigmaCursor 实…...