tcp 是 如何保证可靠传输的? tcp 是 如何做到流量控制以及拥塞控制的?今天我们用八分钟的时间彻底搞懂 tcp 的 可靠传输以及流量与拥塞控制。如果当前没有时间看完,可以先点赞收藏,等你有时间的时候慢慢看,保证你收获满满。 tcp 连接建立后, tcp 的 可靠传输依靠的是超时重传和确认机制。 tcp 可靠传输的基本逻辑是,发送方每发送一个报文段,就启动一个定时器。 如果在定时器到期之前收到了接收方的 a、 c、 k 确认,就销毁定时器。如果超时没收到,就会触发重传这个报文如果只是简单地发一个报文,等一个 a、 c、 k 的 话,效率就太低了。 tcp 引入了滑动窗口的概念。什么是滑动窗口?滑动窗口本质上是 发送方当前被允许发送但还没被确认的数据范围,这个范围是用序号来表示的。比如当前窗口大小是十,意味着发送方可以连续发送十个数据段,只要这些数据还在窗口大小范围里,发送方就可以继续发。 当接收方确认了一部分数据,窗口内的数据便会被释放掉,窗口就会整体向前移动,于是发送方又可以继续发送新的数据。这个向前移动的过程就是滑动窗口这个名字的来源。你可以把窗口理解成一条正在向前推进的传送带, 后面是已经确认的数据,中间是已经发送但还没确认的数据,前面是暂时不能发送的数据,窗口只会朝一个方向滑动,不会倒退。如果在传输中出现了丢包, tcp 主要通过两种方式处理,第一种是超时重传,这很好理解,时间到了,没有收到 ack 确认就重发。 发送方在发出一个数据段时,会启动一个定时器,如果在规定时间内没有收到 ack 就 直接重传。 第二种叫快速重传,这是为了优化对单个包丢失的响应速度,而无需等待慢涨的超时。假设发送方连续发送了数据包一、二、三、四、五,包二在网络中丢失了,但包三、四、五都成功到达了接收方。 接收方遵循 tcp 的 累积确认原则,他必须按顺序确认数据。当他收到包三时,发现期待的包二没到,他不会确认包三,而是再次发送一个对包一的确认,即重复 ack。 同理,收到包四和包五时,接收方依然会继续发送对包一的重复 ack。 当发送方连续收到三个对同一个数据包的重复 ack 时,他就可以做出一个非常合理的推断, 这个 a、 c、 k 之后的数据报包二极有可能丢失了。此时发送方不必等待包二的超时计时器到期,而是立即重传被认为丢失的包二,这就是快速重传, 这极大地提高了效率。重传机制绝非孤立工作,它与 t c p 的 庸色控制是完全联动的,共同构成了 t c p 的 流量与庸色管理行为。 接下来我们看一下 tcp 的 流量控制与拥塞机制。流量控制解决的是点对点的问题,防止发送方发送数据的速度超过接收方应用程序的读取和处理能力,导致接收方的缓冲区溢出,数据被丢弃。在 tcp 报文头中有一个十六位的字段叫 window, 这就是接收窗口 r、 w、 n、 d。 当连接建立时,接收端会告诉发送端自己的缓冲区大小。在数据传输过程中,接收端每回复一个 a、 c、 k 确认报文,都会在 window 字段里填上自己当前缓冲区还剩余多少空间。 发送端收到 a、 c、 k 后,会根据这个值调整自己的发送窗口。如果接收端的应用程序读取数据很慢,缓冲区快满了,接收端发回的 window 值就会变小,发送端就会减慢发送。如果缓冲区彻底满了, window 值变为零, 这就是所谓的零窗口。此时发送端必须立刻停止发送数据,否则一定会丢包。这里有一个技术细节, 如果窗口变成了零,发送端停止发送,那连接后续是不是就不发送数据了?为了解决这个问题, tcp 引入了零窗口探测报文。当发送端收到零窗口通知后,会启动一个定时器,每隔一段时间发送一个只有一个字节数据的探测包。 接收端收到后,会回复当前的窗口大小,一旦窗口不为零,传输立刻恢复。这就是流量控制,非常直观,完全由接收端的反馈决定。拥塞控制解决的是整个网络的问题, 如果网络中的路由器和链路过窄了,数据包会大面积丢失。这时候如果 tcp 还拼命重传,只会让网络更堵。 相比于流量控制,有明确的反馈,庸色控制更难,因为网络本身不会告诉发送端我堵了,发送端只能靠自己去猜、去试探。为此, tcp 维护了一个状态变量,叫庸色窗口 c、 w、 n、 d。 tcp 的 庸色控制算法主要包含四个阶段,慢启动庸色,避免庸色发生快速恢复。我们按顺序来看数据传输的全过程。 阶段一,慢启动 slow start。 当连接刚建立或者发生超时重传时, tcp 处于慢启动阶段。这时候发送端不知道网络的深浅,所以非常谨慎。它通常把拥塞窗口 c w n d 初使化为一个 m s s。 最大豹纹段,长度虽然较慢启动,但它的增长速度其实是指数级的,非常快。每受到一个 a c k 确认,庸色窗口就加一。这意味着发一个回一个 a c k, 窗口变二,发两个回两个 a c k, 窗口变四,发四个回四个 a c k, 窗口变八。这种指数增长会一直持续,直到庸色窗口达到一个预值, 叫慢启动预值。一旦达到这个值,说明发送速率已经比较高了,不能再疯涨了,于是进入第二阶段。阶段二,庸色避免 congestion avoidance。 在 这个阶段,窗口的增长模式从指数增长变为限性增长。具体的算法是,每经过一个往返时间 r t t, 也就是把当前窗口的所有包都发完并收到确认的时间, 庸色窗口只增加一个 m s s m s s 是 maximum segment size, 中文翻译叫最大豹纹断长度, 指的是纯 tcp 数据载荷的最大值,不包含任何头部信息。庸色避免阶段是一种加法增大,目的是小心翼翼地试探网络的上限,直到网络出现庸色为止。阶段三,庸色发生。 当网络终于承受不住,开始丢包了,发送端收不到 a k 了,这就意味着庸色发生了。 tcp 对 庸色的判断有两种情况,处理方式也完全不同。 情况 a, 超时重传,发送端发了数据,一直等到定时器超时都没收到 a、 c、 k, 这说明网络可能已经瘫痪了,情况非常严重, tcp 会反应非常剧烈,一、把慢启动域值降为当前拥塞窗口的一半。二、把拥塞窗口 c、 w、 n、 d 直接重置为一。 三、重新进入慢启动阶段,这叫一夜回到解放前,对传输性能影响极大。情况 b, 收到三个重复, a、 c、 k, 说明网络只是有点拥堵,没完全断,这时候如果还把窗口归零,就太浪费了。于是, tcp 采用快速重传和快速恢复算法。阶段四,快速恢复在这个阶段, tcp 的 操作是一把慢启动域值降为当前拥塞窗口的一半。二。 关键点来了,它不把拥塞窗口归零,而是把拥塞窗口设置为新的域值大小,也就是减半后的值三, 然后直接重传丢失的那个包。四,如果后续收到新的 a、 c、 k, 说明重传成功。此时把庸色窗口设置为新的域值,然后进入庸色避免阶段。以上就是庸色控制的全过程。 tcp 的 庸色控制本质上是一个动态调整的闭环系统。 这就是为什么 tcp 被称为既贪婪又克制的协议。贪婪在于它总是试图占满待宽。克制在于一旦发现网络拥堵, 它会立即退让,防止整个互联网崩溃。总结一下, tcp 之所以能成为支撑互联网核心业务的可靠传输标杆,正是可信传输、流量控制、拥塞控制这三大机制的无缝协同。 正视着三大机制的默契配合,让 tcp 既能支撑微信消息、网上支付等对准确性要求极高的场景,也能适配从家庭宽带到骨干网络的复杂环境,成为互联网中最稳定、最通用的传输协议。希望这期的内容能帮你打通 tcp 协议的任督二脉,我们下期见。
粉丝9.7万获赞20.5万

如果 tcp 三次握手中任何一个包丢了,会发生什么? 我用 mini net 模拟了上千次 tcp 连接,故意搞破坏,制造丢包,结果发现 tcp 的 每一步本质上是在应对各种连接的不确定性。 这期视频我们不讲定义,只用实验。一起看下 tcp 到底是如何活下来的。首先,我们先跑一次正常的 tcp 连接,不丢包,不延迟,看看 tcp 在 一切顺利的时候是怎么工作的。 最上面三行就是三次握手,客户端先发信,服务端回信和 act, 客户端再回一个 act。 到这里,双方三次握手完成 连接建立之后,开始真正的数据传输。中间这几条 push act 代表一段段数据被发出, 每发一段都会收到对应的确认,只要确认收到, tcp 就 知道前面的数据已经安全送达。最后三行是连接关闭, 客户端先发 finish, 服务端在确认收到的同时,如果自己这边已经没有数据要发,会把 app 和 finish 合并在一个包里发出,客户端再回一个 app 连接正式关闭。 关闭连接不是一刀切断开,而是双方各自收尾,把事情交代清楚再退出连接。 到此,整条时间线非常顺,几乎没有任何波折。这就是 tcp 在 理想网络下完整的一次生命周期。 刚才这一套是在理想网络下发生的,但现实网络远没这么好。如果 tcp 三次握手里第一个 same 就 丢了,会发生什么?我们先从最常见也最直观的一种情况开始。握手阶段 same 丢包, 我在 mini net 里故意把客户端发出的第一个瞬丢掉。客户端发起连接之后,并没有立刻失败,而是安静了一小会儿,然后同样的连接请求又来了一次。 注意,这里抓包里标出来的 tcp retransmission 并不是应用曾在重试,而是 tcp 自己认为刚才那个包可能没送到,所以选择重新再发一遍。也正因为如此,你看到的是完全相同的讯在同一个连接上被重复发送。 tcp 的 逻辑其实很简单,等不到回应,他就假设网络出了问题,于是他选择再试一次。如果重试了几次,依然没有任何回应, tcp 才会最终认定这次连接失败了。 刚才那种情况是最直观的,讯直接丢了。这次客户端的讯其实已经到了,服务端也回了讯和 app 三次握手,看起来只差最后一步, 偏偏就出在这里。那最后一次 act 被我故意丢掉了。从客户端的视角看,事情已经结束了。 act 发完,连接应该已经建立,但服务端这边,他始终等不到那一下确认,他不知道对方到底有没有收到自己的回应。 于是你会看到一个有点反直觉的现象,服务端又把孙和艾克发了两次,不是他出错了,而是服务端在确认一件很关键的事,我刚才那句你真的听见了吗? p c p。 在 这里非常谨慎,只要这件事没被确认,它就不会假装连接已经建立。所以当最后那个 act 丢失时,服务端宁可多问几次,也不会贸然进入通信状态。你会发现,三次握手并不是形式上的流程, 他是在一个随时可能丢包的世界里,反复确认双方是不是真的在同一个状态上。接下来,我们把难度再往上提一点,如果丢的不是三次握手的包,而是正在传输的数据包,那 tcp 又会怎样做呢? 这一次连接已经建立,双方开始正常传输数据。我在 mini net 中故意丢掉了客户端请求的数据包,你会看到连接没有断,程序也没有立刻报错。 注意看这张图,红色的数据包反复重传,这并不意味着网络完全断开,而是 tcp 协议在等待丢失的数据包的确认。每次重传的间隔越来越长,显示出 tcp 对 丢失数据的处理策略。 tcp 的 策略是宁可慢一点也不跳过丢失的数据。只要有一个数据包没确认,即使后续数据已到达, tcp 也不会交给应用层。 tcp 的 兜底方式就是补齐丢失的数据,而不是绕过它。如果丢失的数据包一直无法送达, tcp 会放弃重传,最终断开连接。 图中多个标记为 retransmission 的 数据包,这些包因为前一个没有确认,所以被重传。 retransmission 是 tcp 重传机制的核心,确保即使数据包丢失连接,也能尽量保证数据的完整性, 这也是 tcp 作为一个可靠协议的关键所在。本期视频我们通过 mini net 模拟了 tcp 连接的正常与异常场景。首先,正常的连接是这样的,三次握手,顺利建立,数据正常传输,四次挥手,优雅断开。然后,我们引入三种常见的异常场景, 三次握手,悌丢失,客户端的悌丢了 t、 c p 重试连接,直到成功或者超时。三次握手, a c k 丢失,服务端的最后一个 a c k 丢了,服务端反复发悌和 a c k, 直到收到确认 正常传输数据丢失,数据传输过程中包丢了, t、 c、 p, 持续重传,直到收到确认或者放弃。 这些异常场景告诉我们, tcp 在 面对丢包时,始终通过重试和保持连接稳定,确保数据传输不丢失,这也是 tcp 作为可靠协议的核心特性之一。最后感谢你的观看, 如果这期视频对你有帮助,欢迎点赞转发,你的点赞转发就是对我最大支持,我是 cold cheers, 我 们下期见!

传输层有几层协议呢? tcp 是怎么保持可靠的传输的呢?这个不太清楚。嗯,传输层协议我们经常遇到的呢,有两个,一个是 tcp, 一个是 usbp, 而 tcp 怎么保持可靠的传输呢? 第一点就是确认和重传。什么是确认呢?就是当消息的接受方接受到数据之后,会返回一个确认真给发送方,发送方收到这个确认真才会认为数据已经传授成功。而什么叫做重传呢? 如果发送方在发送后一段时间之内没有收到确认真,他通常会重新发送。第二点就是数据的交易,第三点是数据的分片和顺序的排列。第四点是流量控制,就是消息的接送方如果他已经处理不了这么多数据的时候,他会提示 发送者减少数据的发送量,从而减少报道丢失。第五点是用色控制。 tcp 发送方要维持一个用色窗口的状态变量, 拥色控制窗口的大小取决于网络的拥色成长并且动态变化。发送方让自己的发送窗口取为拥色窗口和接收方的接收窗口中最小的一个,你明白了吗?

tcp 协议为什么需要? tcp 协议增加数据传输的可能性?在互联网中,数据传输可能因网络拥堵设备故障信号干扰等,导致数据包丢失延迟重复或乱序。二 tcp 的 核心目标 通过一系列机制,如确认机制重传机制流量控制等,将不可靠的底层网络转化为可靠的端到端数据传输通道,确保数据能完整有序无差错地从发送方传递到接收方。

tcp 协议二十问八, tcp 的这个超时重传时间是如何计算的?我们知道 tcp 呢,它具有超时重传的机制,也就是说你作为发送方,如果隔了一段时间,你没有收到数据报文的回复的话,那么你就会重传这个数据包, 所以呢,这个重传的间隔,我们可以叫他超时重传时间,那么他的英文全称叫做 retrace mission time out, 简称 rto。 那么你可以发现在进行重穿的时候可能会有这样的问题,这个时间呢不太好设置,比如你把这个 lto 设置的很小的话,那么作为发送方,有可能你进行重穿的时候是没有必要的, 因为你的接收方可能是延迟了一段时间,所以这是奥迪欧设置的过小,他会导致一些没有必要的冲踹。然后另外的话呢,如果你把这个 奥迪欧射的很长,那么有可能他的丢失包的时间要隔了很久才会发生重传,所以呢,这也是 tcp 的这个超时重传时间不太好计算的一个原因。 那么这个地方我讲一个比较经典的方法啊,它适用于 r t t 波动比较小的情况。什么叫 r t t 呢?你就是进行发送和传输,它有一个延迟时间,延迟时间呢,我们称之为往返食盐啊,那么它的简称叫 r t t。 一个最简单的方式呢,就是取平均的值,比如说你第一次的 r t t, 你发送和接受的这个延迟是五百毫秒,第二次是八百毫秒,那么第三次发送的话呢,我们就取一个平均的 rto, 比如说是六百五十毫秒。那么这种算法呢,它引入了一个叫做平滑往返时间的一个计算,然后经过这个平滑以后的这个 rtt 的值啊,每一次你算出来的 这一个 rtt 就需要对我们的 srtt 做一次更新,也就是说我们的计算这一个重传时间,其实他会根据上一次的重传时间来进行一个波动。那么具体的公式是这样的, 那么这一个里面引入的这一个平滑往返时间,它的简称叫做 s r t t, 对,然后的话呢,我们还要依靠上一个已经存在的旧的 s r t t 的值,中间呢,我们设置了一个平滑音子啊,阿尔法,它是零点八, 那么你可以看到它等于二法,再乘以已存在旧的 s r t t 它一个值,然后再加上一个一减二法,再乘以一个 r t t, 这个 r t t 呢,就是新采样的我们往返的一个食言。一般来说呢,这个阿尔法它是一个平滑因子,建议设成零点八到零点 九,中间假设这个平滑因子是零点八的话,八的话啊,那么我们可以算出来这个 s r t t, 它大概就等于百分之八十的这个初始值,再加上百分之二十的一个新彩样的 r t t 的值。所以你发现没有啊,这种设置的话呢,首先它会跟上一次的这个你设置的 这一个重传时间有关系,然后其次的话呢,还跟你采一样的这一个往返时间有关系,那么这个阿尔法呢,他本身 一般来说建议是零点八到零点九,但是的话呢,这个值如果屈均于一的话,你会发现他很接近于上一次的这一个重缠时间,这个这个 srtt 对不对?与我们新采样的这个 rtt 的时间关系越小, 表现形式了,就是对短暂的食言变化不敏感,就是你的网络如果发生波动的话,那么这种情况 他对这种波动的变化,他感他的变化不会太敏感啊,当然了,这个阿尔法如果说接近于零的话, 那么你会发现啊,其实他就跟我们采样的值有关系,跟之前的这个旧的 srtt 他没有他的关系,所以他表现出来的是对我们的岩石非常的敏感,他能够快速的去跟上实验的变化啊,变化, ok, 这个呢就是我们常说的啊,这一个如何去进行 tcp 超时 重传的一个时间的设定,并且呢他是如何进行计算的啊?并且呢我用了一个比较经典的或者是比较经典的方式进行计算, ok, 这种经典的计算呢,他比较适用于 rtt 波动比较小的情况,因为往往呢你计算的时候这个平滑音子啊,把它设置成零点八,也就是说他更依赖于我们上一次的这一个 重穿的时间,然后呢新采样的这一个往返时间呢,他也会对我们的结果有一定的变动,或者是有一定的影响。

![网络协议依赖关系图[网络科普] 在网络协议栈中,应用层协议通过依托传输层的TCP或UDP协议,实现各自的核心功能。以下是基于传输层依赖关系的详细分类说明:
一、基于TCP的协议(强调可靠性)
此类协议依赖TCP提供的面向连接、可靠传输特性,确保数据无丢失、按序到达,适用于对数据完整性要求严格的场景:
SMTP/SMTPS:邮件发送协议,通过TCP端口25(SMTP)或465(SMTPS,加密版)传输,借助TCP的确认重传机制保障邮件投递的准确性。
IMAP/IMAPS:邮件接收协议,默认使用TCP端口143(IMAP)或993(IMAPS,加密版),通过稳定连接支持邮件的增量同步与文件夹管理。
HTTP/HTTPS:超文本传输协议,HTTP使用TCP端口80,HTTPS通过SSL/TLS加密(端口443),依赖TCP实现网页内容、API数据的可靠传输。
RDP:远程桌面协议,通过TCP端口3389建立连接,借助TCP的可靠性确保远程操作指令与图形流的完整传输。
SSH:安全外壳协议,独占TCP端口22,通过加密通道实现远程服务器登录与命令执行,TCP保障指令传输的完整性。
BGP:边界网关协议,利用TCP端口179建立自治域间的路由邻居关系,确保路由表同步的准确性。
二、基于UDP的协议(侧重效率与实时性)
此类协议优先选择UDP的无连接、低延迟特性,适用于对速度敏感、可容忍少量丢包的场景:
DNS:域名系统,默认通过UDP端口53处理≤512字节的查询请求,快速完成域名到IP的解析,大数据量响应时自动切换至TCP。
SNMP:简单网络管理协议,UDP端口161用于设备状态查询,端口162接收告警信息,轻量特性适配大规模网络监控。
RTP:实时传输协议,常与UDP结合传输音视频流,通过序列号与时间戳保障同步,丢包由上层动态调整。
三、特殊协议与混合模式
部分协议因场景灵活性,存在跨层或双传输层依赖的特性:
ICMP:工作于网络层(IP层),不依赖TCP/UDP,用于传递网络错误信息(如“目标不可达”)和诊断工具(如Ping)。
QUIC:基于UDP的新一代传输协议,集成TCP的可靠性(重传、拥塞控制)与UDP的低延迟,作为HTTP/3的底层协议,支持0-RTT握手与多路复用
#计算机 #网络工程师 #编程](https://p3-pc-sign.douyinpic.com/image-cut-tos-priv/49cc9ad9c1dff1463d56212c37fdecdc~tplv-dy-resize-origshort-autoq-75:330.jpeg?lk3s=138a59ce&x-expires=2083053600&x-signature=OqB1Bi4yB%2F%2FIdF6jpTCYaI6TVVo%3D&from=327834062&s=PackSourceEnum_AWEME_DETAIL&se=false&sc=cover&biz_tag=pcweb_cover&l=20260106183833338555E8530C48D1973D)
