TCP小结 - 指南

news/2025/10/6 13:19:27/文章来源:https://www.cnblogs.com/ljbguanli/p/19127558

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 个,所以这一次能够发送 8 个。可以看出慢启动算法,就是当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于发包的个数是指数性的增长

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

有一个叫慢启动门限  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波动:标准差反映网络稳定性。

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

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

相关文章

泰安营销型网站建设公司公司网络营销策略

税收问题&#xff0c;怎么把一个数按照部分进行计算呢&#xff1f;比如一个数大于10000&#xff0c;然后超过10000的部分按照5%计算&#xff0c;10000-5000的区间按照3%计算 在C中&#xff0c;你可以使用条件语句&#xff08;if-else语句&#xff09;来根据不同的条件计算税收…

亦庄网站建设wordpress单用户案例

无锁队列的基本介绍 一个关于无锁队列的多线程读写代码示例。在这里&#xff0c;我提供一个简单的示例来说明这个问题。 在使用无锁队列时&#xff0c;需要注意以下几点&#xff1a; 使用原子操作来实现对队列的读写操作&#xff0c;以避免多线程同时访问同一数据导致的竞争条…

石家庄网站建设公司黄页做网站建设 个体经营 小微企业

目录 一、为什么需要低代码平台 二、低代码平台的搭建能力 三、低代码其他能力 四、写在最后 随着互联网和信息技术的快速发展&#xff0c;各行各业都在积极拥抱数字化转型。在这个过程中&#xff0c;软件开发成为企业实现数字化转型的关键环节。然而&#xff0c;传统的软件开发…

国庆 Day2 强基物理

转动惯量又来了。相对论入门。前言:和暑假讲的有重合,上午主要是刚体转动力学、转动惯量、积分求解。那么就结合暑假的部分一起整理了。晚上等老师发了笔记再来更新。 讲了几乎一上午的积分。就当做是复习暑假自学的…

ZR 2025 十一集训 Day 6

100 + 100 + 10 + 0 = 210, Rank 5/22.良心模拟赛,吊打 MX。25十一集训day1 链接:link 题解:题目内 时间:4.5h (2025.10.06 08:30~13:00) 题目数:4 难度:A B C D\(\color{#F39C11} 橙\) \(\color{#3498DB} 蓝\)*…

AirSim 安装过程记录 - zzh

AirSim 安装简略教程与注意事项 Part 1: 安装摘要 本文旨在记录本人安装AirSim的过程,以便于后续在其他设备上的迁移安装 参考网站:微软官方下载指导:https://microsoft.github.io/AirSim/powershell 下载指导:htt…

LARAVEL安装报错:Illuminate\Database\QueryException could not find driver (Connection: sqlite, SQL:

安装LARAVEL12.32.5时,执行 composer global require laravel/installer cd example-appphp artisan serve后访问http://localhost:8000/ 时报错:Illuminate\Database\QueryException could not find driver (Conne…

unix/linux source 命令,其发展历程详细时间线、由来、历史背景 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于AXI模块的视频流传输(硬件连接篇)

初来乍到,先自我介绍,我是一所双非学校集成电路专业的学生,目标是成为一个合格的FPGA,数字ic设计,验证工程师,目前大三,此篇章仅以记录我打FPGA创新创业大赛过程的一些学习经验,是基于zynq7020开发板的开发项目…

四、函数调用具备单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型

四、函数调用具备单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型2025-10-06 12:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

商丘网站建设的公司哪家好企业所得税什么时候交

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

深圳网站建设 利科技有限公司购物网站建设服务

如果对于二叉搜索树不是太清楚&#xff0c;为什么要使用二叉搜索树&#xff1f;作者推荐&#xff1a;二叉搜索树的初步认识_加瓦不加班的博客-CSDN博客 定义节点 static class BSTNode {int key; // 若希望任意类型作为 key, 则后续可以将其设计为 Comparable 接口Object val…

[GDOUCTF 2023]泄露的伪装

打开题目,根据题目提示扫描题目所在目录扫描完成后访问扫描到的两个文件 在压缩包文件中看到php文件直接访问php文件后,看到源码使用写入协议 ?cxk=data://text/plain;base64,Y3RybA==得到flag

仿射密码

前言 在密码学的发展历程中,从简单的凯撒密码到更具安全性的加密方式,仿射密码是重要的进阶。它基于数论知识,通过线性变换为信息加密,既保留了替换加密的简洁,又大幅提升了保密性,是理解现代加密算法的关键基础…

写作网站有哪些深圳建设工程交易平台

阻塞I/O Socket设置为阻塞模式&#xff0c;当socket不能立即完成I/O操作时&#xff0c;进程或线程进入等待状态&#xff0c;直到操作完成。如下图&#xff1a; 这种模型非常经典&#xff0c;也被广泛使用&#xff0c;优势在于非常简单&#xff0c;等待的过程中占用的系统资源微…

网站建设从入门pdfwordpress文章出问题

什么是二进制&#xff1f; 数字电路 中 只有 高电平 和低电平 就是 1 和0 进位规则是“逢二进一”&#xff0c;借位规则是“借一当二”。 二进制、八进制 、十进制、十六进制 二进制 有两个数来表示 &#xff1a; 0、1 八进制 有8个数来表示 &#xff1a; 0、1、2、3、4、…

压铸东莞网站建设中国站长之家

结合单元测试框架pytest数据驱动模型allure 目录 api&#xff1a; 存储测试接口 conftest.py :设置前置操作 目前前置操作&#xff1a;1、获取token并传入headers&#xff0c;2、获取命令行参数给到环境变量,指定运行环境 commmon&#xff1a;存储封装的公共方法 connect_mysq…

AtCoder Regular Contest 207 (Div.1) 游记

赛时一个半小时没出题,赛后再来三个小时终于搞出 A。省流 赛时一个半小时没出题,赛后再来三个小时终于搞出 A。10.5 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 本来发现要补的东西还剩很多,结果当天上午…

kubeadm续约k8s 1.23.14所有证书

[root@zy-nph-skg-fat-k8s-master01 kubernetes-1.23.14-0]# kubeadm certs renew all [renew] Reading configuration from the cluster... [renew] FYI: You can look at this config file with kubectl -n kube-sys…

Linux或者Windows下PHP版本查看便捷的方法总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …