还在背tcp的三次握手? 用ack 传输机制把它直接击穿!

发布于:2024-05-08 ⋅ 阅读:(24) ⋅ 点赞:(0)

背景介绍

我看到很多三次握手和四次挥手的面试题,内容全都聚焦在,握手/挥手的步骤和流程上,这种一般背了没多久就忘了,下次遇到面试的场景还得痛苦的再背一遍。我其实个人是有点反感这种死记硬背的方式的,忽略了背后的原理。

你有没有想过,互联网为什么会需要tcp协议?带着这个问题我们去做一番探究吧

什么是Ack传输机制

ack传输机制,是建立tcp链接,从一端把数据交给另一端的传输方式的约定,我们把接收方和发送方当成是两个码头,我们要传输的数据就是一船一船的去运,那两个码头在传输数据的时候就有一些问题需要去处理,比如

  1. 需要保证交互顺序,一个内容是 0b000111 ,在传输的过程中用两只船去运输,如果不去保证数据的有序性的话,那另外一段可能就会收到0b111000,这样内容就与发送方原本发送的数据不一致了
  2. 需要有重传机制,假设有一艘船触礁沉底了,或者迷路了,那我们就需要有一个重传的机制,来保证不会因为一两船的货物的缺失来导致了整批运输的失败
  3. 保证传输的效率处于一个平衡状态,如果发送方的码头派出的船只过多,那么接收方的码头自然就会因为货物太多而堵塞,如果发送方的船只数据太少,整批货物的运输时间就会拉的很长

传输的交互

可以看到,接收方发给发送方一个 ack=100 的包来告诉发送方下一个包需要你传输给我序号是100的那一个包,发送方传给对面序号是100的包后 接收方又给发送发返回了一个ack=101的包,表示下一个包需要序号101的包,所以一句话来概括这个流程就是 发送方发送哪个包取决于接收方要哪一个包 。有一点需要注意的是发送方所返回的ack 是当前连续的包的最小的一位的下一个,也就是如果接收方收到了101,102,105。那么下一个接收方发出的ack 是103 ,只有受到104这个包之后 接收方才会发出ack=106 的包

重传机制

现在知道了基本传输机制之后,我们遇到了一个问题,就是某一个包在传输的过程中受到网络波动等等的一系列的影响,导致了丢包了,也就是船只在前往另外一个码头的过程中发送触礁等等一系列事故导致沉船了,所以这时候发送方如果某一个包迟迟未收到确认回复的话,那么一定时间间隔后发送方会重新发送这个包,这个重传超时时间叫做RTO (Retransmission TimeOut) 一般是通过最近几次的传输的单次耗时(RTT) 来进行计算的

保证传输效率稳定

现在知道了传输机制,也解决了丢包的问题,紧接着下一个问题浮现了,那就是传输效率的问题,还按照刚刚的码头的比喻来,如果发送码头每分钟能发100艘船 但是接收的码头每分钟可能同时处理多个码头发来的船只,所以接收方码头每分钟可以接收10只船,那么这就会造成网络拥堵从而导致大量丢包,反过来看如果发送方每分钟只发10只船,接收方每分钟可以接收100只船,那就会导致传输不充分从而浪费时间资源。

那么如何保证传输效率稳定呢,其实一共就三点

提速阶段 -> 平稳阶段 -> 减速阶段

提速阶段发送方会先从一个数量很低的数值开始,然后进行指数级别的增长,第一次是1 、下一次是2、 下一次是4 然后 8,16... 以此类推,直到达到阈值n就停止提速,(n是上次传输计算出来的值)。

然后就会进入下一个平稳阶段,这时候虽然现在已经到了预计的一个最大数量n,但是因为传输的还算顺畅,所以这个阶段就会缓缓的增加,一次只+1,从指数级别的增长变成常数级别的增长。

此时如果不发生拥堵导致丢包的话,就会一直处于平稳阶段,一旦发生拥堵就会进入到减速阶段,减速阶段会将当前并发数量直接减半,并将减半后的数量设置成阈值n,(阈值n就是这么来的),减半之后就进入到平稳阶段继续传输直到下一次拥挤。

三次握手

基于上面的这些知识来看,三次握手只不过是一次完整的ack传输而已,只不过在握手中增加了一些标识符等额外行为而已,我们先来看下ack一个包的基本构成

当特殊标记位是SYN=1的时候表示这是一个用来建立链接请求的包,建立链接时只要保证双方都接发成功就好了,那链接花费最少的交互次数就是3次了

顺带也提一下其他的标记位 SYN 是建立链接,ACK是传输数据,RST是强制断开链接,PSH 是快速交付,FIN是关闭链接。

文章总结

tcp的通讯 包括传输 握手挥手都是基于ack 机制的,ack机制可以有效的梳理传输,还有重传机制应对丢包,还有增长策略来保证传输通道的充分使用,让其不会拥挤或者使用不充分,整体来说是一个非常完善的传输机制,相对于UDP 的丢完我就不管了,TCP是一个很有责任心的传输方式。下次如果有机会的话我们聊聊ack机制是如何在挥手的时候发挥作用的。


网站公告

今日签到

点亮在社区的每一天
去签到