目录

一、三次握手与四次挥手:可靠连接的建立与终止

1. 三次握手 - 建立连接

为什么是三次?

2. 四次挥手 - 终止连接

为什么需要TIME_WAIT状态?

二、流量控制与滑动窗口:解决收发速度不匹配

核心机制:滑动窗口协议

滑动窗口过程:

流程步骤:

三、拥塞控制:解决网络路径拥堵问题

1. 慢启动

2. 拥塞避免

3. 快重传

4. 快恢复


TCP协议是互联网的可靠传输保障,其核心在于如何建立/终止连接、如何确保数据有序无误地送达,以及如何在复杂的网络环境中高效传输。理解这些机制,是掌握网络编程和进行网络故障排查的关键。

一、三次握手与四次挥手:可靠连接的建立与终止

TCP是面向连接的协议,通信前必须建立一条虚拟链路,通信后要有序地释放它。

1. 三次握手 - 建立连接

目的是确认双方的发送和接收能力正常,并同步初始序列号(ISN)。

  • 第一次握手 (SYN=1, seq=x):客户端发送SYN包(同步位SYN=1)到服务器,并随机生成一个初始序列号(ISN)x。客户端进入 SYN_SENT 状态。

  • 第二次握手 (SYN=1, ACK=1, seq=y, ack=x+1):服务器收到SYN包,必须确认客户的SYN。同时自己也发送一个SYN包(SYN=1)以及确认号(ACK=1, ack=x+1)。服务器随机生成自己的ISN y。服务器进入 SYN_RCVD 状态。

  • 第三次握手 (ACK=1, ack=y+1):客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=1, ack=y+1)。此包发送完毕后,客户端和服务器都进入 ESTABLISHED 状态,完成连接建立。

为什么是三次?

主要是为了防止已失效的连接请求报文突然又传到了服务器,从而产生错误。
假设只有两次握手:一个延迟的旧SYN请求到达服务器,服务器会误以为客户端要建立新连接并响应,但客户端实际并无此意,导致服务器空等,浪费资源。三次握手机制下,客户端不会对那个延迟的确认包再进行确认,连接便无法建立。

2. 四次挥手 - 终止连接

TCP连接是全双工的,因此每个方向必须单独地进行关闭。

  • 第一次挥手 (FIN=1, seq=u):客户端(主动关闭方)发送一个FIN包,用来关闭客户端到服务器的数据传送。客户端进入 FIN_WAIT_1 状态。

  • 第二次挥手 (ACK=1, ack=u+1):服务器收到FIN后,发回一个ACK包,确认序号为收到的序号加1。服务器进入 CLOSE_WAIT 状态,客户端收到后进入 FIN_WAIT_2 状态。此时,从客户端到服务器的连接已关闭,但服务器到客户端的连接仍然可用

  • 第三次挥手 (FIN=1, seq=v, ack=u+1):服务器准备好关闭连接时,发送一个FIN包给客户端。服务器进入 LAST_ACK 状态。

  • 第四次挥手 (ACK=1, ack=v+1):客户端收到FIN后,发回ACK确认,并进入TIME_WAIT 状态。服务器收到ACK后,关闭连接,进入 CLOSED 状态。客户端等待 2MSL(最大报文段生存时间)后,也关闭连接。

为什么需要TIME_WAIT状态?
  1. 可靠地终止连接:确保客户端最后的ACK能到达服务器。如果ACK丢失,服务器会重发FIN,客户端在 TIME_WAIT 状态下能再次响应ACK。

  2. 让旧连接的所有报文在网络中消逝:防止之前连接的延迟报文段被之后新建的、相同四元组(源IP、源端口、目的IP、目的端口)的连接错误接收。

二、流量控制与滑动窗口:解决收发速度不匹配

如果发送方发送得太快,接收方的缓冲区可能会被填满,导致数据丢失。流量控制就是解决发送方和接收方速度不匹配的问题

核心机制:滑动窗口协议

  • 接收窗口 (rwnd):接收方通过TCP首部中的窗口大小字段,告知发送方自己当前接收缓冲区还有多少可用空间。这个值动态变化。

  • 工作原理

    1. 发送方维护一个发送窗口,其大小不能超过接收方通告的接收窗口大小。

    2. 窗口内的报文段可以连续发送出去,而无需等待确认。

    3. 每当收到一个确认ACK,发送窗口就向前“滑动”。

    4. 接收方处理完数据,腾出新的缓冲区后,会在下一次ACK中更新窗口大小通告给发送方。

举个例子:接收方说:“我的窗口现在大小是3000字节”。发送方就可以连续发送3000字节的数据,而不用每发一个包就停下来等ACK。这极大地提高了信道利用率。

滑动窗口过程:

流程步骤:
  1. 【客户端请求】
    客户端向服务端发送请求数据报文。

  2. 【服务端发送数据 80B】
    服务端收到请求报文后,发送确认报文和 80 字节的数据。

    • 结果:可用窗口 Usable 减少为 120 字节。

    • 发送指针 SND.NXT 向右偏移 80 字节,指向 321(下次发送数据的序列号)。

  3. 【客户端确认 80B】
    客户端收到 80 字节数据后:

    • 接收窗口向右移动 80 字节,接收指针 RCV.NXT 指向 321(期望的下一个报文序列号)。

    • 客户端发送确认报文给服务端。

  4. 【服务端发送数据 120B】
    服务端再次发送 120 字节数据。

    • 结果:可用窗口耗尽,Usable = 0,服务端无法继续发送数据。

  5. 【客户端确认 120B】
    客户端收到 120 字节数据后:

    • 接收窗口向右移动 120 字节,RCV.NXT 指向 441

    • 客户端发送确认报文给服务端。

  6. 【服务端收到 80B 的确认】
    服务端收到对 80 字节数据的确认报文后:

    • 已发送未确认指针 SND.UNA 向右偏移,指向 321

    • 结果:可用窗口 Usable 增大到 80

  7. 【服务端收到 120B 的确认】
    服务端收到对 120 字节数据的确认报文后:

    • 已发送未确认指针 SND.UNA 向右偏移,指向 441

    • 结果:可用窗口 Usable 增大到 200

  8. 【服务端发送数据 160B】
    服务端可以继续发送,于是发送了 160 字节的数据。

    • 结果:发送指针 SND.NXT 指向 601

    • 可用窗口 Usable 减少到 40

  9. 【客户端确认 160B】
    客户端收到 160 字节数据后:

    • 接收窗口向右移动 160 字节,RCV.NXT 指向 601

    • 客户端发送确认报文给服务端。

  10. 【服务端收到 160B 的确认】
    服务端收到对 160 字节数据的确认报文后:

    • 发送窗口向右移动 160 字节,SND.UNA 指针指向 601

    • 结果:可用窗口 Usable 增大至 200

三、拥塞控制:解决网络路径拥堵问题

如果网络本身已经拥堵,此时大量重发数据只会让情况恶化。拥塞控制就是防止过多的数据注入到网络中,避免网络中的路由器或链路过载。它是一个全局性的过程。

TCP的拥塞控制主要基于四个核心算法:

1. 慢启动

  • 连接刚建立时,发送方并不清楚网络状况,需要一种探针机制。

  • 拥塞窗口(cwnd)从1个MSS(最大报文段长度)开始。

  • 每收到一个ACK,cwnd就指数增长(cwnd *= 2)。这就像启动时猛踩油门,速度增长很快。

  • 当 cwnd 达到慢启动门限(ssthresh) 时,进入下一个阶段。

2. 拥塞避免

  • 当窗口变大后,指数增长变得危险。此时进入线性增长阶段。

  • 规则变为:每经过一个往返时延(RTT),cwnd只加1(即每收到一个ACK,cwnd增加 1/cwnd)。

  • 这个过程是在小心翼翼地探测网络的最大可用容量。

3. 快重传

  • 传统超时重传太慢。快重传要求接收方每收到一个失序报文段就立即发出重复确认

  • 如果发送方连续收到3个重复的ACK,就认为该报文段已经丢失,立即重传它,而不必等待超时计时器到期。

4. 快恢复

  • 在快重传之后触发,而非直接进入慢启动。

  • 发送方认为网络状况尚可(因为还能收到3个ACK),只是个别包丢失。

  • 将 ssthresh 设置为当前 cwnd 的一半,并将 cwnd 设置为新的 ssthresh 值(有的实现会加3),然后直接进入拥塞避免阶段。

拥塞控制的整体过程可以概括为:加法增大乘法减小,即在不拥塞时线性增加窗口,在出现拥塞时(超时或收到3个重复ACK)将窗口乘性减半。

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

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

相关文章

如何在 DevOps 管道中实现 AI?

对于许多寻求提升效率、优化性能并缩短上市时间的组织而言,将人工智能 (AI) 集成到 DevOps 流水线中已成为一项战略举措。AI 与 DevOps 的结合,有时被称为 AIOps(面向 IT 运营的人工智能),正在重塑开发和运营团队构建、测试、发布和维护软件应用程序的方式。本文将引导您了…

【Agent】DeerFlow Planner:执行流程与架构设计(基于真实 Trace 深度解析)

本文档系统阐述 DeerFlow 中 Planner 的职责边界、端到端执行流程、关键节点设计、数据结构、容错与人审机制,以及与研究/编码子代理的协同方式。面向开发与运维读者,帮助快速理解与调优 Planner 相关链路。 时序图(Sequence Diagram&#xf…

后端接口防止XSS漏洞攻击

有这样一个场景,首先构建一个docx文件并插入超链接(恶意的链接),上传到文件服务器后获取对应的文件filekey。现在我们提供一个预览接口,通过filekey便可以预览,在根据filekey转html文档返回给页面的时候由于…

4.1Vue基本使用

1.使用Vue-引入 Vue 的本质,就是一个 JavaScript 的库: 刚开始我们不需要把它想象的非常复杂; 我们就把它理解成一个已经帮我们封装好的库; 在项目中可以引入并且使用它即可。 那么安装和使用 Vue 这个 JavaScript 库有哪些方式呢? 方式一:在页面中通过 CDN 的方式来引…

CAD绘图:杂项

一、样式标注管理器 新建CAD图纸的样式标注是定死的,需要手动去改变合适的大小 1)命令行中直接输入“D”,打开样式标注管理器 2)点击“修改”,可以改变其颜色,线条样式以及文字大小、颜色、字体等 3)若想添加字体: a)在网上下载需要的字体 b)右键Auto CAD图标(…

Git上有更新而本地无更新时的解决方案

问题分析 分支名称不匹配:你尝试推送到 main 分支,但你当前在 master 分支上远程仓库有新内容:远程仓库包含你本地没有的提交,需要先拉取 解决方案 方法1:继续使用 master 分支 # 1. 先拉取远程更改 git pull origin m…

用于骨盆骨折复位与固定自动术前手术规划的基于几何的端到端流水线|文献速递-最新医学人工智能文献

Title题目An End-to-End Geometry-Based Pipeline forAutomatic Preoperative Surgical Planning ofPelvic Fracture Reduction and Fixation用于骨盆骨折复位与固定自动术前手术规划的基于几何的端到端流水线01文献速递介绍骨盆骨折及其术前规划相关研究背景与本文方法 骨盆骨…

【导航】OS复习

【OS】操作系统概述-CSDN博客 【OS】PV-CSDN博客 【OS】进程与线程-CSDN博客 【OS】文件管理-CSDN博客 【OS】IO_检查用户io请求的合法性-CSDN博客

Google Nano-banana AI模型图像生成能力实证分析:基于47个案例的系统化技术验证

Google Nano-banana AI模型官方示例库(Awesome-Nano-Banana🍌-images),通过系统化分析47个技术案例,实证验证其在图像生成、编辑与转换任务中的核心能力。所有测试基于Apache 2.0开源许可的公开案例数据集,…

MySQL 多表操作与复杂查询:深入理解多表关系和高级查询

大家好!今天我们要深入探讨 MySQL 中两个非常重要的主题——多表操作 和 复杂查询。一. 多表操作什么是多表操作?在实际应用中,数据通常分布在多个表中,需要通过多表操作来获取完整信息。比如,一个学生表和一个课程表之…

Java入门级教程7——eclipse新建Maven项目,创建和连接数据库,创建数据库表

目录 1.若没有Maven项目,可以选择新建 2.添加Maven依赖 3.数据库的创建 3.1 新建连接 --> 创建数据库 3.2 创建数据库表 4.连接数据库 1.若没有Maven项目,可以选择新建 步骤一:点击 File --> New --> Project 步骤二&#xf…

请求库-axios

Axios 是一个基于 Promise 的 HTTP 客户端库,用于浏览器和 Node.js 环境。它支持发送异步 HTTP 请求,并提供了简洁的 API 来处理请求和响应。1、安装axios因为axios是一个第三方库,所以在使用之前我们需要先安装第三方模块。安装 Axios 需通过…

电子烟的4种屏幕驱动集成语音方案介绍

目前电子烟在全球市场的表现非常不错,很多国产电子烟厂家都有非常不错的产品,而屏幕驱动方案是电子烟智能化的重要组成部分,今天就给大家带来电子烟的4种主流屏幕驱动方案(含2025年最新版方案)。​  方案一、LED显示方案语音播报集成方案 W…

无法加载 DLL“xxxxxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。

(无法加载 DLL“xxxxxxx.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。) 这个错误: 无法加载 DLL“ZH_P2P_Libx64.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 意味着你的程序在运行时试图加载一个名为 xxxxxxx.dll 的动态链接库&#…

Flask/Django 生产部署:Gunicorn vs Nginx,Windows 与 Linux 实战指引

Flask/Django 生产部署:Gunicorn vs Nginx,Windows 与 Linux 实战指引 TL;DR Gunicorn:Python WSGI 应用服务器,运行 Flask/Django(Linux 用)。Nginx:反向代理/网关(TLS、静态、限流…

Nginx 优化与防盗链全解析:从性能调优到资源保护

Nginx 优化与防盗链全解析:从性能调优到资源保护 文章目录Nginx 优化与防盗链全解析:从性能调优到资源保护一、基础安全优化:隐藏版本号1.1 查看当前版本号1.2 两种隐藏/修改方案方案一:修改配置文件(快速隐藏&#xf…

HOT100--Day20--39. 组合总和,22. 括号生成,79. 单词搜索

HOT100–Day20–39. 组合总和,22. 括号生成,79. 单词搜索 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型:回溯。 关键:掌握排列,组合。记得回溯。可以重复选的话,下一层index从哪里开始&#x…

高并发场景下的“命令执行”注入绕道记

环境:CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景:营销团队上线了一个“图片裁剪”接口,参数直接拼进 shell_exec,结果被打成“矿机”。1. 发现:流量突增 30 倍,却不见数据库慢查询 iftop -i eth0出站 1.8…

【modbus学习】

Modbus通信(源于施耐德)串行链路:RTU(传输大量数据,适合工业)、ASCII(少量数据,适合计算机)TCP/IP:TCP(传输严谨,效率低)、…

Redis单线程模型为什么快?

Redis的单线程模型指的是redis只使用一个线程来出来所有的命令式指令,但是不是意味着redis内部就只使用一个线程来处理所有的任务。都知道redis是一个客户端-服务器的程序,那么redis就只有一个服务器,但是有多个客户端,就像mysql一…