运输层可以比作城市快递分拣中心把快递分给不同客户附近的快递点。运输层只管电脑里的软件到对方电脑里的软件。一台电脑能同时开微信、浏览器、游戏全靠运输层区分不同软件的数据。本章重点速览运输层提供的服务UDP 协议TCP 协议 ※一、运输层提供的服务主要介绍运输层的通用基础功能。解决问题卡车只送到城市怎么精准分给城里不同住户附近的快递点一套通用规则端口、收发区分、两种工作模式。1.1 运输层的介绍定位从通信和信息处理的角度看运输层向它上面的应用层提供通信服务它属于面向通信部分的最高层同时也是用户功能中的最低层。核心能力运输层位于网络层之上它为运行在不同主机上的进程之间提供了逻辑通信而网络层提供主机之间的逻辑通信。举例如下你手机电脑 A开微信给朋友手机电脑 B发消息网络层任务数据包从你的手机 → 朋友手机只送到设备不知道给谁运输层任务精准送到朋友手机里的微信软件而不是浏览器、抖音。关键特新即使网络层协议不可靠网络层协议使分组丢失、混乱或重复运输层同样能为应用程序提供可靠的服务保证软件收到完整正确数据。1.2 运输层三大核心功能端到端的通信运输层提供应用进程之间的逻辑通信软件 - 软件。与网络层的区别是网络层提供的是主机之间的逻辑通信。复用和分用复用发送端是指发送方不同的应用进程都可使用同一个运输层协议传送数据类比家里三个人同时寄快递全部交给同一个分拣员统一打包运输。举例电脑同时开微信、浏览器、QQ三个软件的数据全部交给运输层统一发出去。分用接收端是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。类比一堆包裹送到你家小区分拣员看房间号分别递给爸爸、妈妈、你。举例一堆数据发到你的电脑运输层区分来源微信的数据丢给微信网页数据丢给浏览器。运输层还要对收到的报文进行差错检测首部和数据部分类比分拣员收到包裹先检查外包装有没有破损、缺东西破损直接丢弃。举例运输层收到数据校验数据有没有传输中损坏坏的直接扔掉。提供两种不同的传输协议即面向连接的 TCP 和无连接的 UDP。1.3 运输层的寻址与端口1. 端口的作用端口能够让应用层的各种应用进程将其数据通过端口向下交付给运输层以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。IP 地址 你家小区完整地址唯一定位一台电脑端口 小区里每户人家门牌号唯一定位电脑里一个软件没有端口数据包到了你小区不知道送给谁全部堆在门口2. 端口号服务器端使用的端口号。它又分为两类熟知端口号数值为0~1023把这些端口号指派给了 TCP/IP 最重要的一些应用程序让所有的用户都知道是固定公用门牌号全网统一规定类比相当于小区物业、快递站固定门牌所有人都知道。举例网页浏览器访问网站永远走 80 号门发邮件固定 25 号门域名解析 DNS 固定 53 号门。登记端口号数值为1024~49151它是供没有熟知端口号的应用程序使用的小众软件专用门牌需要官方登记避免冲突。客户端使用的端口号为短暂端口号也称临时端口客户端你的手机电脑使用的端口号数值为49152~65535。由于这类端口号仅在客户进程运行时才动态地选择。举例你打开浏览器刷网页电脑随机分配一个临时端口网页看完关闭这个门牌号回收给别的软件用。疑问我打开浏览器刷网页为什么是电脑随机分配一个临时端口而不是直接用 80 端口解答这个问题搞混【客户端】和【服务器】。熟知端口号是服务器的固定门牌号而短暂临时端口是客户端自己设备上软件的临时编号两者分工不同。完整的【访问百度网页】的例子如下百度那边的机器网页服务器它专门提供网页服务官方规定网页服务固定用80 熟知端口相当于百度门店永久门牌号 80所有人想来看网页都去找 80 号门。你的手机浏览器客户端主动发起请求的一方你是访客不能占用 8080 是店铺专用系统会随机给浏览器分配一个临时短暂端口比如 51320。完整通信流程你的手机临时端口 51320→ 发送请求 → 百度服务器固定端口 80。百度收到请求后回复数据时会标记「收件端口 51320」你的手机收到数据一看编号是 51320就交给浏览器不会错分给微信、游戏。常见应用程序和对应端口号应用程序英文全称中文名称端口通俗用途FTPFile Transfer Protocol文件传输协议21电脑 / 服务器之间批量传大文件早期网盘、网站上传文件都靠它TELNETTeletype Network远程终端协议23远程操控另一台电脑 / 服务器明文传输密码现在基本淘汰不安全SMTPSimple Mail Transfer Protocol简单邮件传输协议25专门用来发送邮件比如你用 QQ 邮箱发消息给别人DNSDomain Name System域名系统53上网第一步必用把baidu.com翻译成服务器 IP 地址TFTPTrivial File Transfer Protocol简易文件传输协议69极简版传文件无加密无验证仅局域网设备刷机、配置设备使用HTTPHyperText Transfer Protocol超文本传输协议80普通网页浏览不带加密现在大部分网站升级成 HTTPS443 端口SNMPSimple Network Management Protocol简单网络管理协议161网管工具用监控路由器、交换机、服务器是否正常运行3. 套接字 Socket套接字 IP 地址 端口号类比完整收货地址 小区地址IP 房间门牌号端口唯一确定全网某一台设备上的某一个软件。1.4 无连接服务与面向连接服务面向连接服务就是在通信双方进行通信之前必须先建立连接在通信过程中整个连接的情况一直被实时地监控和管理。通信结束后应该释放这个连接。无连接服务是指两个实体之间的通信不需要先建立好连接需要通信时直接将信息发送到网络中让该信息的传递在网上尽力而为地往目的地传送。TCP/IP 协议族在 IP 层之上使用了两个传输协议一个是面向连接的传输控制协议TCP采用TCP时运输层向上提供的是一条全双工的可靠逻辑信道打电话通信前先建立连接拨号、对方接听三次握手全程维持连接实时沟通说完必须主动挂断释放连接四次挥手。优点说话不会听漏对方没听清会重复说有序不乱。另一个是无连接的用户数据报协协议UDP采用UDP时运输层向上提供的是一条不可靠的逻辑信道发短信不用提前打招呼编辑完直接发送没有持续连接发完就完事不知道对方有没有收到不会重发。优点速度极快不用等待建立连接。二、UDP 协议相当于临时工分拣员干活风格速度快、省事、不保证包裹不丢、不核对、不回访。2.1 UDP 数据报1. UDP 概述IP 网络层只能把数据包送到对应电脑分不清电脑里哪个软件。UDP 只在 IP 的基础上额外实现两个最小功能端口复用分用 简单差错校验除此之外啥额外保障都没有。等于软件几乎直接裸奔在 IP 上极简设计。优点不需要建立连接零等待时延。电话要拨号等对方接听三次握手发短信写完直接发送不用等待。场景王者荣耀实时对战、抖音直播语音、视频通话延迟必须极低等不起连接建立的时间。无连接状态。TCP 服务器要记录每一个用户收发缓存、序号、拥塞参数上万用户同时在线会占用大量内存UDP 服务器发完数据就清空记录完全不记住客户端百万观众看直播服务器也不会崩。分组首部开销小只有 8 字节。TCP 有20B的首部开销而 UDP 仅有8B的开销。数据包体积小传输更快占用带宽更少。没有拥塞控制不会主动降速 应用层能更好地控制要发送的数据和发送时间。网络堵车的时候TCP 会主动放慢发送速度避免网络崩溃UDP 不管堵不堵该多快发就多快发因此网络中的拥塞不会影响主机的发送效率。适合直播画面卡顿可以丢几帧但不能主动降低清晰度变慢播放缺点网络拥堵时大量丢包消息直接消失。UDP支持一对一、一对多、多对一和多对多的交互通信。TCP 只能一对一单独通信UDP 可以主播一条数据同时发给上万观众一对多广播直播、网课直播全靠这个特性。2. UDP 首部格式UDP 数据包 8 字节首部 应用层数据四个字段源端口你本机客户端的临时短暂端口49152 以上目的端口目标服务器的熟知 / 登记端口比如 DNS 53UDP 长度整个 UDP 报文首部 数据总字节长度校验和用来检查传输过程中数据有没有损坏。2.2 UDP 校验校验和作用数据包在网线、路由器传输时有可能电流干扰导致数据错乱。接收方通过校验和判断数据是否损坏损坏直接丢弃报文不会交给上层软件。伪首部12字节在计算校验和时要在 UDP 数据报之前增加12B的伪首部。伪首部不是真实数据包的一部分不会跟着报文在网络传输只在计算校验和时临时拼接在 UDP 头部前面算完直接扔掉。校验和就是按照这个临时的UDP数据报来计算的。伪首部既不向下传送又不向上递交而只是为了计算校验和。伪首部里存放 4 类信息本机 IP、目标服务器 IP、协议标识标记这是 UDP 报文、UDP 报文总长度。为什么添加伪首部只靠 UDP 自己的首部校验只能检查端口和数据有没有出错但如果传输时 IP 地址被篡改数据包走错服务器单纯 UDP 校验发现不了。伪首部带上了两端 IP 地址计算校验时会连同 IP 一起校验。举例你本来要发给 DNS 服务器 114.114.114.114:53传输中 IP 被改成别的服务器 IP端口还是 53。没有伪首部校验和正常数据会错分给另一台机器的 53 端口有伪首部IP 参与计算校验和对不上直接丢弃错误报文。三、TCP 协议相当于全职严谨分拣员干活风格稳扎稳打保证包裹不丢、不乱序、不多发收发前打招呼、收发完道别堵车自动减速。所有文件下载、网页、微信文字聊天、网盘传输都用 TCP不能接受消息丢失。3.1 TCP 协议的特点TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非常复杂的一个协议主要特点如下面向连接通信前必须先建立专属连接通信结束必须主动断开没建立连接就不能传输任何业务数据。类比打电话必须先拨号接通没接通没法说话UDP 发短信不用打招呼。只能点对点一对一通信一条 TCP 连接只允许两台设备互相通信不支持一对多广播。局限直播、游戏多人实时互动不能用 TCP只能 UDP。可靠交付TCP 最核心价值保证三件事① 数据不会丢失② 不会重复收到③ 全部按发送顺序到达。举例你发一段 1000 字文档哪怕网络卡顿、中途丢包TCP 会自动重传丢失片段乱序到达的片段自动重新排序最终接收方拿到完整、有序、唯一的文档。全双工通信接通连接后两边可以同时互相发送数据不需要你说完对方才能说。配套设计连接两端各自有发送缓存、接收缓存。类比打电话时你说话的同时对方也能插话双方同时收音、播音缓存就是双方暂时存没说完 / 没听完的话的记事本。面向字节流TCP 完全不关心应用层发给它的数据是一段文字、一张图片还是一条消息只会把所有数据当成一串连续、无边界的字节数字。坑点举例微信连续发两条消息「你好」「吃饭了」应用层是两条独立内容但 TCP 可能把两段拼接在一起打包发送接收方 TCP 只会交给应用层一串连续字节分不清原本两条消息分割消息需要软件自己处理。对比 UDP每一条 UDP 数据报都是独立完整消息天然有边界。3.2 TCP 报文段UDP 的传输单元叫「UDP 数据报」TCP 的传输单元叫TCP 报文段。1. TCP 报文段概述TCP 传送的数据单元称为报文段。TCP 报文段既可以用来运载数据又可以用来建立连接、释放连接和应答。用途不只是传文字、文件数据建立连接、断开连接、回复确认、紧急指令全部靠报文段承载控制类报文甚至可以不带任何应用数据。结构一个 TCP 报文段分为首部和应用数据两部分整个 TCP 报文段作为 IP 数据报的数据部分封装在 IP 数据报中。首部长度对比UDP固定8B长度永远不变TCP最小固定20B最多60B多出的部分是可选扩展项按4B整数倍增加。2. TCP 报文段格式序号 seq4字节TCP 是面向字节流每一个字节数据都会分配一个独一无二的编号。seq 当前这条报文段携带数据的「第一个字节的编号」。举例子前面已经完整发送了字节 1~499本次报文携带 500~999 共 500 个字节那么这条报文的 seq 500。补充SYN、FIN 这类连接控制报文哪怕不带数据也会单独占用一个序号。确认号 ack4字节占4B是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N则表明到序号N-1为止的所有数据都已正确收到。只有大写ACK 确认位 1时这个数字才生效。数据偏移即首部长度4位即4bit作用标记 TCP 头部占多少字节用来区分「头部结束、数据开始的位置」指出TCP报文段的数据起始处距离 TCP 报文段的起始处有多远。存储空间TCP 头部设计时给 “数据偏移” 这个小格子只分配了4 个二进制位bit用来存放数字。格子只有 4 个位置最多只能写 4 个 0/1也就是取值范围0~15十进制。 这里的 4 位是存储空间大小是协议标准硬性规定死的不是算出来的。格子里的数字代表「多少个 4 字节块」。工程师为了硬件读取效率规定格子里写数字 N真实头部长度 N × 4 字节。单位单位是4 字节32 位4 位数字最大是 15111115 × 4 60对应 TCP 首部最大 60 字节。公式TCP 真实首部字节 数据偏移值 × 4 字节举例没有任何扩展选项时基础首部 20 字节20 ÷ 4 5这个字段就填 5。5 个 1 比特控制标志位开关0 关闭 / 1 开启核心 5 个急位 URGURG1 时紧急指针生效报文里有紧急插队数据不用在接收缓存排队优先交给应用程序。场景远程控制强制关机、游戏紧急退出指令。确认位ACK4字节连接建立成功之后所有传输数据的报文ACK 必须置 1只有第一次发起连接的 SYN 报文 ACK0。只要是回复对方的消息ACK 一定打开。推送位 PSHPush接收方收到 PSH1 的报文不会等接收缓存填满立刻把现有全部数据上交 APP。场景微信实时聊天消息不用攒一堆再弹窗。同步位 SYNSYN1这是连接请求 / 连接同意报文三次握手核心标识会占用 1 个序号。终止位 FINFinish用来释放一个连接。FIN1发送方数据全部发完请求关闭单向传输通道四次挥手核心标识占用 1 个序号。3.3 TCP 连接管理每个TCP连接都有三个阶段连接建立、数据传送和连接释放。TCP 连接的管理就是使运输连接的建立和释放都能正常进行。TCP 连接的建立采用客户/服务器方式。主动发起连接建立的应用进程称为客户Client而被动等待连接建立的应用进程称为服务器Server。1. TCP 连接的建立连接的建立经历以下 3 个步骤通常称为三次握手。目标双方互相确认「收发功能正常」同步各自的初始字节序号 seq协商连接参数。关键规则SYN1的报文建连请求不带数据但会消耗 1 个序号只有ACK1时确认号 ack 生效。设客户端初始序号seq x服务器初始序号seq y第一步客户端 → 服务器客户机的 TCP 首先向服务器的 TCP 发送连接请求报文段。这个特殊报文段的首部中的同步位SYN 置1同时选择一个初始序号seqx。TCP 规定SYN 报文段不能携带数据但要消耗掉一个序号。报文标记SYN1ACK0seqx人话客户端拨号对服务器说我想和你建立连接我后续数据字节从编号 x 开始。此时没有确认号因为ACK0。第二步服务器 → 客户端服务器的 TCP 收到连接请求报文段后如同意建立连接则向客户机发回确认并为该 TCP 连接分配缓存和变量。在确认报文段中把SYN 位和 ACK 位都置 1确认号是ackx1同时也为自己选择一个初始序号seq y。注意确认报文段不能携带数据但也要消耗掉一个序号。报文标记SYN1ACK1seqyackx1两层含义SYN1服务器同意建立连接我这边的数据从编号 y 开始ACK1、ackx1我已经收到了你 x 号的同步信号期待你下一个字节是 x1。第三步客户端 → 服务器当客户机收到确认报文段后还要向服务器给出确认并为该 TCP 连接分配缓存和变量。确认报文段的ACK位置 1确认号acky1序号seqx1。该报文段可以携带数据若不携带数据则不消耗序号。报文标记ACK1seqx1acky1人话我收到了你的同意信号期待你下一个数据字节是 y1。这条报文特点仅 ACK 标志没有 SYN不占用新序号可以直接携带业务数据比如你要访问网页的请求发送完毕客户端进入连接就绪状态服务器收到这条报文后连接正式打通。2. TCP 连接的释放通常称为四次挥手。核心逻辑全双工通道可以单独关闭一条方向。一方发 FIN1仅代表「我不再发送数据」不影响对方继续传数据。FIN1报文同样无数据也会消耗 1 个序号。假设客户端数据先发完主动提出关闭。第一步客户端 → 服务器客户机打算关闭连接时向其 TCP 发送连接释放报文段并停止发送数据主动关闭 TCP 连接该报文段的终止位 FIN 置 1序号 sequ它等于前面已传送过的数据的最后一个字节的序号加 1FIN 报文段即使不携带数据也消耗掉一个序号。报文FIN1sequu 客户端之前发送完所有数据最后一字节序号 1人话我这边没有数据要发给你了请求关闭「客户端→服务器」这条通道。第二步服务器 → 客户端服务器收到连接释放报文段后即发出确认确认号acku1序号seqw等于它前面已传送过的数据的最后一个字节的序号加1。此时从客户机到服务器这个方向的连接就释放了。报文ACK1acku1人话收到你的关闭申请但我这边还有剩余数据没发完你先等着我把剩下消息发给你。当前状态单向半关闭服务器仍能持续向客户端发数据。第三步服务器数据全部传输完毕服务器 → 客户端服务器把自己剩余所有数据全部发送完毕后没有数据再传输主动向客户端发送FIN1的连接释放报文报文FIN1ACK1seqwacku1人话服务器告知客户端我这边也没有数据要发了准备关闭服务器→客户端这条方向的连接。第四步客户端 → 服务器客户端收到服务器的 FIN 报文后立即回复确认报文报文ACK1ackw1人话收到你的关闭请求确认双方通道全部关闭。两端后续状态服务器收到客户端发来的这个 ACK 后直接进入CLOSED状态立刻断开连接客户端发送完 ACK 后进入TIME-WAIT状态等待2MSL最长报文段寿命。等待目的防止最后这条 ACK 丢失服务器超时重传 FIN 时客户端还能补发确认2MSL 超时结束客户端才进入CLOSED整条 TCP 连接彻底释放。3.4 TCP 的可靠传输TCP 能保证数据不丢、不乱、不重复全靠下面三套机制配合工作一套负责编号、一套负责回执、一套负责丢包补救。1. 序号解决乱序、重复问题TCP 是面向字节流每一个字节的数据都会分配唯一序号不是给整个报文段编号是给单个字节编号。两个核心作用接收端排序网络里数据包可能走不同路线后发的包先到、先发的包后到。接收方凭借字节序号把乱序的数据重新排整齐再交给应用程序。举例你先发 1~500再发 501~1000网络先把 501~1000 送到接收端不会直接上交先存在缓存等 1~500 到达后拼接有序。接收端去重网络故障会导致同一个数据包重复发送到接收方接收方看到完全一样的字节序号直接丢弃重复数据不会重复推送消息给软件。2. 确认累计确认机制TCP 默认使用累计确认只确认连续、无缺口的字节。- 确认号规则回顾ackN代表0~N-1全部完整收到下一段期待从 N 号字节开始。关键特性中间缺一段后面再多数据都不会确认模拟场景发送方发出两段包 A (1~500)、包 B (501~1000)包 A 在路上丢失只有包 B 先到达接收缓存。虽然缓存里存满 501~1000 的数据但 1~500 存在缺口属于不连续数据。接收方只能回复ack1不会回复 ack1001。发送方看到 ack1就知道开头的数据丢了需要重传。累计确认的好处不用收到一段就回复一条确认报文减少网络里的回执包数量降低带宽开销。3. 重传丢包兜底发送方发完报文后会等待接收方的 ack如果迟迟收不到回执就判定数据包丢失触发重传。分两种场景超时和冗余 ACK。超时TCP 每发送一个报文段就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时就要重传这一报文段。缺点超时等待时间较长网络轻微卡顿就要等很久传输效率低因此引出优化方案 —— 快重传。冗余ACK冗余确认触发快重传冗余 ACK 就是再次确认某个报文段的 ACK而发送方先前已经收到过该报文段的确认。连续收到 3 个相同冗余 ACK不等定时器超时直接重传缺失报文。例子发送四段1500、5011000、10011500、15012000第一段 1~500 丢失后面三段全部抵达接收端。接收方每收到一段都回复 ack1连续产生 3 条相同的冗余 ACK。发送方收到第 3 个重复 ack不等待超时计时器到期立刻重传缺失的 1~500大幅缩短等待时间。3.5 TCP 流量控制流量控制解决「发送方发太快接收方电脑缓存存不下」是端到端的问题只看接收主机的负载由接收方说了算。类比你疯狂打字发给朋友朋友手机内存缓存不够装不下你发的消息会告诉你 “慢点发我缓存不够了”。和数据链路层流量控制的区别数据链路层控制相邻两台交换机 / 路由器之间的数据窗口大小固定不变TCP 运输层控制两台相隔很远的主机窗口可以随时动态调整。1. 接收窗口 rwndreceive window含义接收方电脑里有一块接收缓存用来存放已经收到、但还没上交微信 / 浏览器等 APP 的数据。rwnd 接收缓存当前剩余空闲字节数代表我现在最多还能收下多少字节的数据。工作规则接收方每次回复确认报文ACK1时都会把当前 rwnd 写到 TCP 头部的「窗口」字段告诉发送方。发送方严格遵守单次发送的数据总量不能超过 rwnd。实例演示服务器接收缓存总容量1000 字节初始状态缓存全空剩余 1000 空位 → ACK 报文中rwnd1000发送方可以一次性最多发 1000 字节服务器 APP 处理消息很慢缓存已经存了 700 字节没读取只剩 300 空位 → 下次回复 ack 时rwnd300发送方立刻减速最多只能一次性发 300 字节极端情况缓存完全占满没有一点空位 →rwnd0称为零窗口通知发送方必须立刻停止发送所有数据。2. 零窗口探测机制如果收到rwnd0发送方不能永久卡住需要定时发窗口探测报文每隔一段时间发送 1 字节极小探测包询问接收方现在缓存腾出空位了吗新的 rwnd 是多少一旦接收方 APP 清空缓存返回 rwnd0发送方恢复正常传输。作用避免两端永久卡死。3. 发送窗口上限发送方真正能发多少由两个窗口共同约束发送窗口的上限值min[rwnd,cwnd]rwnd接收方缓存能承受的上限流量控制cwnd网络能承受的上限下一节拥塞窗口拥塞控制。谁更小就以谁为标准限速。3.6 TCP 拥塞控制拥塞控制是指防止过多的数据注入网络保证网络中的路由器或链路不致过载解决「互联网中间路由器堵了」是整个网络全局的问题跟接收方缓存无关。1. 拥塞窗口 cwnd 和慢开始门限 ssthresh拥塞窗口 cwnd发送方根据自己估算的网络拥塞程度而设置的窗口值反映网络的当前容量。发送方自己设定一次性能往网络里发多少字节。网络通畅就加大 cwnd网络拥堵就减小 cwnd。单位是 MSS单个 TCP 报文最大长度。慢开始门限 ssthresh一条分界线当前cwnd ssthresh执行慢开始算法指数暴涨窗口当前cwnd ≥ ssthresh执行拥塞避免算法线性缓慢涨窗口2. 慢开始算法连接刚建立试探网络规则刚建立 TCP 连接完全不清楚网络承载能力不能一次性发大量数据初始化cwnd 1 MSS一次只发 1 个报文每收到 1 个全新报文的 ACK 确认cwnd cwnd 1一轮往返时间 RTT 过后cwnd 直接翻倍指数增长。举例直观理解ssthresh 初始值设为 8 MSScwnd1 → 发 1 个包收到 ACK → cwnd2cwnd2 → 发 2 个包全部收到 ACK → cwnd4cwnd4 → 发 4 个包全部收到 ACK → cwnd8此时 cwnd ssthresh停止慢开始切换拥塞避免。类比刚通车的马路先放 1 辆车确认顺畅再翻倍放行快速试探上限。3. 拥塞避免算法到达阈值后平缓增长当 cwnd 超过等于 ssthresh不再翻倍增长速度大幅放缓每经过一整个往返 RTTcwnd cwnd 1线性缓慢上涨。举例ssthresh8cwnd8一轮 RTT 后 cwnd9再一轮 10…… 一点点放大发送量避免瞬间把网络挤爆。4. 网络拥塞的处理网络出现丢包 网络拥堵分两种丢包场景处理逻辑完全不一样。场景1超时重传严重拥堵整条链路堵塞现象报文发出去计时器超时都没收到任何 ACK代表数据包直接堵死在路上丢失。处理步骤更新慢开始门限ssthresh cwnd / 2把上限砍半但不能小于2拥塞窗口直接归零重置cwnd 1重新执行慢开始算法从头缓慢试探网络逻辑超时 网络彻底堵死必须大幅减少发包量缓慢恢复。场景2连续收到 3 个冗余 ACK轻微拥堵少量丢包网络没卡死比如发送 4 段报文第一段丢失后三段全部到达接收方持续重复回复 ack1产生 3 条一模一样的确认。这里配套两个优化机制快重传 快恢复快重传不等超时计时器立刻重传丢失的报文节省等待时间快恢复核心区别于超时处理ssthresh cwnd / 2门限同样减半cwnd ssthresh窗口直接等于新阈值不用重置到 1直接进入拥塞避免线性缓慢增大窗口逻辑只是少量丢包网络只是轻微拥挤不用退回到最原始的慢开始传输效率更高。