Computer Networking A Top-Down Approach Learning Note Part 3
前言:
本文是笔者初学计算机网络的笔记和一些心得,难免会有部分疏漏和错误,还请各位读者积极指出,不吝赐教。
有一些内容是笔者认为对自己暂时没那么重要的部分,就没有放上去,具体的内容可以查看相关的书籍。
观前提醒:本文篇幅较长,若您只是想看其中的某一小节的知识,直接点击目录进行跳转即可!
事不宜迟,我们开始吧!
Bilibili:space.bilibili.com/57089326
注:本文图片的水印均是笔者自己的。
参考资料:《自顶向下的计算机网络》《王道计算机网络考研复习指导》
传输层概述
传输层,为运行在不同主机上的应用进程,提供直接的通信服务,起着至关重要的作用。
Learning Target:
传输层的工作原理:
- 多路复用 / 多路分解
- 可靠数据传输
- 流量控制
- 拥塞控制
Internet的传输层协议:
- UDP:无连接传输
- TCP:面向连接的可靠传输
- TCP的拥塞控制
概述和传输层服务:
传输服务与协议
传输服务和协议目的:为运行在不同主机上的应用进程提供逻辑通信。
传输协议运行位置:端系统。
- 发送方:将应用层来的报文分成报文段,然后继续传递给网络层。
- 接收方:将报文段重组成报文,然后继续传递给应用层。(相反的过程)
还需注意的是,有很多传输层协议可以使用,对于Internet来说,就是TCP和UDP。
我们来对比一下传输层和网络层的区别
网络层服务:主机之间的逻辑通信。
传输层服务:进程之间的逻辑通信(更细)。
- 传输层服务依赖于网络层的服务(延时和带宽,这两个不可以被加强)
- 传输层服务对网络层的服务进行增强(数据丢失、数据混乱、加密)
笔者的理解:网络层建立起主机之间的逻辑通信之后,传输层才能在之上进行颗粒度更细的进程上的逻辑通信。
Internet传输层协议
TCP:
- 多路复用、多路分解
- 建立连接
- 拥塞控制
- 流量控制
UDP:
- 多路复用、多路分解
- 没有为尽力而为的IP服务添加更多的额外服务
传输层的寻址与端口:
端口:
端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,
以及让传输层知道应当将其报文段中的数据通过端口向上交付给应用层的相应进程。
端口是传输层服务访问点(T-SAP);
(类比)端口在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用;
不同的是,IP和MAC地址标识的是主机,而端口表示的是应用进程。
端口号:
应用进程通过端口号进行标识,端口号长度为16bits,能表示65536个不同的端口号。
应当注意的是,端口号只具有本地意义。
端口号分类:
的端口号称之为周知端口号,保留给HTTP(80)等周知应用层协议,由IANA指派。
的端口号称之为登记端口号,供没有周知端口号的应用程序使用,也需要在IANA上登记。
的端口号称之为临时端口,通信结束后,这些就会释放掉。
IANA,互联网地址指派机构
套接字:
套接字
在网络中,采用发送方和接收方的套接字来识别端点,唯一地标识网络中的一台主机和其上的一个应用进程。
多路复用与多路分解:
人话解释:就是将,由网络层提供的主机到主机的交付服务,延伸到,为运行在主机上的应用程序提供进程到进程的交付服务。
这是所有的计算机网络都需要的服务,而不仅仅是Internet独有的。
复习套接字:相当于网络和进程之间传递数据的门户。
发送方主机——多路复用:
含义:从多个套接字,接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息,对报文段用头部加以封装(该头部信息用于以后的解复用)。
接收方主机——多路分解:
含义:根据报文段的头部信息中的IP地址和端口号,将接收到的报文段发给正确的套接字(和对应的应用进程)。
- Port是端口号,用于区分进程
- PID是进程的唯一标识
如果还没有明白,可以仔细阅读这个例子 :
传输层多路复用的要求:
- 套接字有唯一标识符;
- 每个报文段有特殊字段来指示该报文段所要交付到的套接字;
无连接的多路复用与多路分解:
一个UDP套接字是由一个二元组来全面标识的:
该二元组包含一个目的IP地址和一个目的端口号。
那么,源端口号还有存在的必要吗?答案是有的,源端口号作为返回地址的一部分。
面向连接的多路复用与多路分解:
TCP套接字和UDP套接字的区别是,TCP套接字是由一个四元组来全面标识的:
四元组:源IP地址,源端口号,目的IP地址,目的端口号。
与UDP不同的是:
两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
具体的细节并没有在此展开,笔者认为,一方面是因为写在一起过于纷繁复杂,不便于读者观看;另一方面是笔者自己也一时间看不下去那么多细节,所以就先Overview,之后在做题的过程中遇到问题再返回来查漏补缺。
Web服务器与TCP,先以一图以示之:
无连接传输 - UDP:
UDP数据报:
UDP的全称到底是什么?事实上是:User Datagram Protocol,即用户数据报协议。
UDP传的是数据报。
与IP一样,也是尽力而为的,除了相比IP,更加细分了进程到进程以外(IP是主机到主机),几乎没有额外的内容了,仅仅增加了两个最基本的服务:复用和分用以及差错检测。
UDP的首部格式以及UDP的优点:(其中,左图上面四个部分都是16bits的)
除此之外,UDP还支持一对一,一对多,多对一和多对多的交互通信。
UDP常用于一次性传输较少数据的网络应用,如DNS,SNMP等;
UDP也常用于多媒体应用,这对于实时性是有要求的;
UDP不保证可靠交付,但这不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可以由用户在应用层完成。
UDP是面向报文的,一次交付一个完整的报文,因此报文是UDP数据包处理的最小单位。
UDP的数据报包含两部分:UDP首部和用户数据。UDP的首部有8B,由四个字段组成,如上图所示↑,意义如下:
- 源端口号:在需要对方回信时选用,不需要是全置零;
- 目的端口:这在终点交付报文时必须使用到;
- 长度:UDP数据报的长度,最小值是8(仅有首部);
- 校验和:检测UDP数据报在传输中是否有错,有错就丢弃,该字段是可选的,当源主机不想计算校验和时置零。
UDP基于端口的分用:
UDP校验:
在计算校验和时,要在UDP数据报之前增加12B的伪首部,
只是用于在计算校验和时,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。
校验和需要用这个临时的UDP数据报来计算。
UDP数据报的首部和伪首部示意图:
校验和的计算方法:
UDP校验和的计算方法与IP数据报首部校验和的计算方法类似,
但不同的是,IP数据报的校验和只检验IP数据报的首部,但是UDP的校验和则检查首部和数据部分。
这部分的题目不多(也有可能是笔者见的比较少),具体的计算方法这里暂略。
以下给出一个计算UDP校验和的例子:
校验和的目的:
快速检测在被传输报文段中的差错(如比特反转)。
虽然这种方法的校错能力不强,但是有点是简单快捷。
面向连接的传输 - TCP:
TCP是在不可靠的IP层之上实现的可靠的数据传输协议,主要解决传输的可靠、有序、不丢失和不重复的问题。
TCP报文段:
报文段是什么:TCP传送的数据单元称为报文段。
TCP报文段用处:
- 运载数据
- 建立连接、释放连接和应答
组成概述
一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。
首部的前20B是固定的,TCP首部最短就为20B,后面有4N字节是根据需要而增加的选项,长度是4B的整数倍。
如图所示:
各个字段的意义:(这部分有点多,但是大概是很重要的部分)
源端口和目的端口:
各占2B的大小。
端口是传输层与应用层的服务接口,传输层的复用和分用功能都要通过端口实现。
序号:
占4B的大小,范围是,共个序号。
(有的地方也称之为序列号,反正都是Sequence Number)
TCP为每个报文段分配一个序列号,用于报文段的重组和丢失检测。
∵TCP是面向字节流的(即TCP传送时时逐个字节传送的)
∴TCP连接传送的字节流中的每个字节都按顺序编号,
序号字段的值指的是本报文段所发送的数据的第一个字节的序号(类似于首地址)。
确认号:
占4B的大小,是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号为N则说明序号到N-1为止的所有数据都已正确收到。
数据偏移(首部长度):
占4bits, 首部长度指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。
∵数据偏移的单位是32bits,即4B;
又∵4位二进制数能表示的最大值为15;
∴TCP首部的最大长度为60B。
这里如果没理解的话可以看如下解释:
首部长度字段占4比特,最大值为15。但是这个15不是直接表示15个字节,而是表示15 * 4 = 60个字节。 这是因为TCP报文段采用32位定界长度的格式,所以所有的字段都必须是4字节对齐的。所以当首部长度字段的值是1时,代表首部4字节;当值为2时,代表首部8字节;以此类推,最大值为15时,代表首部15 * 4 = 60字节。
保留:
占6bits,目前置零。
紧急位URG:
当URG == 1
时,表明紧急指针字段有效,它告诉系统此报文段中有紧急数据,应当尽快传送。
不过,需要注意的是,URG需要配合首部中紧急指针字段(后续会介绍)使用,
即,数据从第一个字节到紧急指针所指的字节就是紧急数据。
确认位ACK:
当ACK == 1
时,确认号字段才有效。
TCP规定,在连接建立之后,所有传送的报文段都必须把ACK置1。
推送位PSH:
当接收方TCP收到PSH == 1
的报文段,就会尽快地交付给接收应用进程,而不是等到整个缓存都填满了再向上交付。
复位位RST:
当RST == 1
时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接。
同步位SYN:
当SYN == 1
时,表示这是一个连接请求 or 连接接受的报文。
当SYN == 1 && ACK == 0
时,说明这是一个连接请求报文(还没建立连接),
若对方同意建立连接,则在响应报文中为SYN == 1 && ACK == 1
。
终止位FIN:
用来释放一个连接,当FIN == 1
时,说明此报文段的发送方的数据已经发送完毕,并要求释放连接。
窗口:
占2B,范围为。
它指的是,现在允许对方发送的数据量,这是因为接收方的数据缓存空间是有限的,
这个窗口值可以作为接收方让发送方设置其发送窗口大小的依据。
校验和:
占2B,校验和字段检验的范围包括首部和数据两部分。
与UDP一样,在计算校验和时,要在TCP报文段的前面加上12B的伪首部,具体来说:
- 将UDP伪首部的协议字段的17改成6
- UDP长度字段改成TCP长度
其他的都和UDP一样。
紧急指针:
占2B,如上文,指出本报文段中紧急数据共多少字节。
选项:
长度可变。
TCP最初只规定了一种选项,即最大报文段长度Maximum Segment Size(MSS) ,
MSS是TCP报文段中的数据字段的最大长度。
填充:
这是为了是整个首部长度是4B的整数倍而设置的。
TCP连接管理:
概述:
因为TCP是面向连接的协议,所以每个TCP连接都要经历三个阶段:
- 建立连接
- 传输数据
- 释放连接
在TCP连接的建立过程中,需要解决以下三个问题:
- 要让每一方都能够确知对方的存在
- 要允许双方协商一些参数
- 能够对运输尸体资源进行分配
TCP把连接作为最基本的抽象,每条TCP连接有两个端点,但这端点不是主机,不是IP地址,也不是应用进程,而是套接字。
TCP采用C-S模式。
TCP三次握手:
连接建立前,服务器进程处于LISTEN状态。
第一步:
如图所示,图上展示出的内容不再赘述,需要指出的是,SYN报文段不能携带数据,但要消耗掉一个序号;
此时,客户端进程进入SYN-SENT(同步已发送)状态。
第二步:
同意建立连接后,发回确认,并为该TCP连接分配缓存和变量;
确认报文段也不能携带数据,但是也要消耗掉一个序号;
此时,TCP服务器进程进入SYN-RCVD(同步收到)状态。
(与此同时,由于服务器端的资源是在第二次握手时分配的,而客户端则在第三次握手时才分配,这个空档期就可以用来对服务器进行SYN泛洪攻击)
第三步:
当客户端收到确认时,还要向服务器给出确认,并为该TCP连接分配缓存和变量;
该报文段可以携带数据,若不携带数据则不消耗序号;
此时,TCP客户端进程进入ESTABLISHED(已建立连接)状态。
TCP四次挥手:
与三次握手一样,如图所示,图上展示出的内容不再赘述;
需要指出的一点是,参与TCP连接的两个进程中的任意一方都可以主动终止该连接。
第一步:
FIN报文段即使不携带任何数据,也会消耗一个序号;
此时,TCP客户进程进入FIN-WAIT-1(终止等待1)状态;
第二步:
服务器收到连接释放报文段后,发出确认,进入CLOSE-WAIT(关闭等待)状态。
但我们要注意的是,TCP连接可以视为一个双有向边,即L->R关闭不影响R->L的数据传输。
第三步:
如果服务器已经没有要向客户端发送的数据,就通知TCP释放连接,这时进入LAST-ACK(最后确认)状态。
你真的要离开我了吗?
第四步:
客户端收到连接释放报文段时,类似第二步地,也必须发出确认;
值得一提的是,这里有一个计时器,必须等待2MSL(最长报文段寿命)之后,客户端才能进入CLOSED(连接关闭)状态。
选择题喜欢考察关于连接和释放的题目,ACK、SYN、FIN一定切记等于1。
TCP流量控制:
下面以数据链路层的流量控制与可靠传输机制进行说明,在传输层也类似,亦会从中介绍。
流量控制涉及对链路上的帧的发送速率的控制,以便接收方有足够的缓冲空间来接收每个帧。
流量控制的基本方法是由接收方控制发送方发送数据的速率。
流量控制的两种常见方式:
- 停止-等待协议
- 滑动窗口协议
停止-等待(SW)流量控制基本原理:
一句话描述Stop-and-Wait:
发送方每发送一帧,都要等待接收方的应答信号,之后才能发送下一帧;
接收方每接收一帧,都要反馈一个应答信号,表示可接收下一帧,若接收方不反馈应答信号,则发送方必须一直等待。
这样每次只发送一帧,然后陷入等待的这种过程,传输效率很低。
借用我初中年级主任的一句话:人生就是在这样你等我,我等他的过程中被浪费掉了。
滑动窗口流量控制基本原理:
滑动窗口分为两个窗口:
- 发送窗口:在任意时刻,发送方维持一组连续的,允许发送的帧的序号。
- 接收窗口:在任意时刻,接收方维持一组连续的,允许接收的帧的序号。
表示在还未收到对方确认信息的情况下,发送方最多还可以发送多少个数据帧,的道理类似。
有如下例:
那么,窗口具体是如何滑动的呢?
发送端每收到一个确认帧,发送窗口就向前滑动一个帧的位置;当发送窗口内没有可以发送的帧(即窗口内的帧全是已发送但未收到确认的帧)时,发送方就会停止发送,直到收到接收方发送的确认帧,使得窗口移动,移动之后,窗口内有了新的可以发送的帧,才开始继续发送。
接收端收到数据帧后,将窗口向前移动一个位置,并发回确认帧,若收到的数据帧落在接收窗口之外,则一律丢弃。
好,那么滑动窗口有什么重要的特性吗?
-
只有接收窗口向前滑动,且接收方发送了确认帧时,发送窗口才有可能向前滑动(得收到确认帧)。
-
停止-等待协议、GBN协议和SR协议只在发送窗口与接收窗口的大小上有所差别:
- SW:发送窗口大小 = 接收窗口大小 = 1
- GBN:发送窗口大小 > 1,接收窗口大小 = 1
- SR:发送窗口大小 > 1,接收窗口大小 > 1
-
只有接收窗口大小为1时,才能保证帧的有序接收。
-
数据链路层的滑动窗口大小在传输过程中时固定的,而传输层的则不是。
TCP如何使用窗口机制实现流量控制:
接收窗口rwnd:
在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的窗口大小,
即调整TCP报文段首部中的窗口字段值来限制发送方向网络注入报文的速率。
拥塞窗口cwnd:
发送方根据其对当前网络的拥塞程度的估计而确定的窗口值,其大小与网络的带宽和时延密切相关。
我们假设了接收方总是有足够大的缓存空间,故发送窗口的大小由网络的拥塞程度决定,故而等效为拥塞窗口。
传输层和数据链路层的流量控制的区别:
传输层定义端到端用户之间的流量控制;
数据链路层定义两个中间的相邻节点的流量控制;
另外,数据链路层的滑动窗口协议和窗口大小不能动态变化,传输层的则可以动态变化。
TCP可靠传输:
数据链路层的可靠传输:
数据链路层的可靠传输使用确认和超时重传两种机制来完成。
-
确认:
是一种无数据的控制帧,使得接收方可以让发送方知道哪些内容被正确接收;
有时为了图方便,会将确认捎带在一个回复帧中,称为捎带确认。
-
超时重传:
指发送方在发送某个数据帧后就开启一个计时器⏲,在一定的时间内,如果没有得到发送的数据帧的确认帧,那就重新发送该数据帧,直到发送成功为止。
那么问题来了,当数据帧传输到了以后出错了怎么办呢?答案是ARQ。
自动重传请求(Automatic Repeat reQuest, ARQ):
通过接收方请求发送方重传出错的数据帧,来恢复出错的帧。
传统自动重传请求分为三种:
- SW-ARQ
- GBN-ARQ
- SR-ARQ
后两者是滑动窗口技术与请求重传技术的结合。
传输层的可靠传输:
TCP在IP层的不可靠的、尽力而为的服务的基础上建立了一种可靠数据传输服务。
TCP通过校验、序号、确认和重传等机制来达到目的,我们分别展开。
校验:
与UDP一样,不再赘述。
序号:
概括:
TCP首部的序号字段,用来保证数据能够有序提交给应用层;
TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流上,而非报文段。
关于字节流的更多细节:
TCP连接传送的数据流,把每个字节都编上序号,序号字段的值是指本报文段所发送的数据的第一个字节的序号。
有例图所示:
第一个报文段的序号是0,第二个报文段的序号是3,第三个是6,第四个是8。
确认:
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号,这想必不难理解。
此外,发送方的缓存区会缓存已经发送但是还没收到确认的报文段,以便在需要时重传。
很重要的一点是,TCP默认使用累计确认,即TCP只确认字节流中至第一个丢失字节为止的字节。
有点不好理解?我们以一个例子说明:
在上图中,例如,接收方B收到了发送方A发送的,包含字节0~2
及字节6~7的报文段,但是,由于种种原因,接收方B并没有收到字节3~5
的报文段,此时B仍在等待字节3及其后面的字节,因此B到A的下一个报文段将会把确认号字段置为3,以保证顺序。
重传:
有两种情况会导致TCP对报文段进行重传:超时和冗余ACK。(这部分在后续的拥塞控制里面也有提及,故简要叙述)
超时:
TCP每发送一个报文段,就对这个报文段设置一次计时器。
当计时器设置的重传时间到期但还未收到确认时,就会重传这一报文段。
这其中有一种自适应的算法来确认加权平均往返时间,由于这方面的考题不多,故算法不做介绍。
冗余ACK
TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
简单举个例子:当A收到对于1号报文段的3个冗余ACK时,就可以认为2号报文段已经丢失,这时候,A就可以对2号报文段执行重传,这部分在后续的拥塞控制里的快重传有介绍,这里点到为止。
TCP拥塞控制:
拥塞控制的意义:
防止过多的数据注入网络,保证网络中的路由器或链路不至于过载。
关于拥塞:
当拥塞出现的时候,端点实际上并不了解拥塞发生的细节,对于通信连接的端点来说,只能"观察"到其现象,即通信时延的增加。
我们考虑以下这个例子:
控制与流量控制的区别:
拥塞控制:全局性的过程,让网络能够承受现有的网络负荷,涉及所有的主机、路由器以及与降低网络传输性能有关的所有因素。
流量控制:局部性的过程,是端到端的问题,与拥塞控制一样,是通过控制发送方发送数据的速率来达到控制效果。
两个窗口:
TCP为什么要有两个窗口呢?
事实上,这是因为发送方在确定发送报文段的速率的时候,既要考虑接收方的接收能力,又要从全局考虑不要使网络发生拥塞。
-
接收窗口rwnd:
接收方根据目前接收缓存大小所许诺的最新窗口值,反映接收方的容量。
由接收方根据其放在TCP报文的首部的窗口字段,通知对方。
-
拥塞窗口cwnd:
发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络的当前容量。
只要网络未出现拥塞,拥塞窗口就可以再大一些,以便把更多的分组发送出去,反之,一旦出现网络拥塞,拥塞窗口就会减小一些,以限制注入网络的分组数。
这两者有一个上限:
发送窗口的上限值 =
然而,接收窗口的大小是根据TCP报文首部的窗口字段通知发送方的,但是发送方该如何维护拥塞窗口呢?这时候就需要慢开始和拥塞避免算法了,请看下文。
当然,我们上文中提到,上述条件成立的前提是,我们假设了接收方总是有足够大的缓存空间;
基于此,发送窗口的大小由网络的拥塞程度决定,故而等效为拥塞窗口。
四种拥塞控制的算法:
慢开始、拥塞避免、快重传、快恢复。
这四种算法是同时运用的。
一句话概括:
在TCP连接建立和网络出现超时的时候,采用慢开始和拥塞避免算法;
当发送方接收到冗余ACK时,采用快重传和快恢复算法。
慢开始算法:
一句话解释算法:
在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd = 1,即一个最大报文段长度MSS;
每当接收到一个对新报文段的确认后,cwnd++,即增大一个MSS;
这样逐步增大发送方的cwnd,可以使分组注入网络的速率更加合理。
慢开始的慢到底是什么意思
其实,这个慢的意思是一开始先不着急用很大的窗口来发送报文段,初始时,cwnd = 1的效果类似于"试探"。
这就是慢的含义——花费一点时间来慢慢的进入正题。
使用慢开始算法后,每经过一个传输轮次RTT,cwnd就会加倍,也就是说是指数规律增长,这样一来,慢开始就会一直把cwnd增大到一个规定的慢开始门限ssthresh(阈值) ,然后改用拥塞避免算法。
所谓RTT,就是往返时延Round-Trip Time
是指网络通信中一个数据包从发送端发送到接收端,再从接收端返回到发送端所需的时间。
在计算机网络中,往返时延是一个重要的网络性能指标,可以反映出网络的响应速度和稳定性。当我们在浏览网页、发送邮件、进行在线游戏等网络操作时,RTT 往返时延会直接影响我们的体验。较低的 RTT 往返时延可以提高网络响应速度和传输效率,较高的 RTT 往返时延则会导致网络传输变慢、卡顿、延迟等问题。
拥塞避免算法:
一句话解释算法:
每经过一个RTT,就让cwnd++,而不是加倍,使得cwnd线性缓慢增长。
据此,我们可以知道:
- if (cwnd < ssthresh): use 慢开始算法
- if (cwnd > ssthresh): use 拥塞避免算法
- if (cwnd == ssthresh): use 慢开始算法 or 拥塞避免算法(一般来说是用拥塞避免算法)
网络拥塞的处理过程:
无论是哪个阶段,只要发送方判断网络出现拥塞(未按时收到确认ACK),
就要把慢开始门限ssthresh设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2),
然后,把cwnd重新设置为1,继续执行慢开始算法。
特别地,在慢开始阶段,若2cwnd>ssthresh,则令下一个RTT后的cwnd=ssthresh而不是2cwnd。
如例图所示:
然而,需要注意的是,这两种算法都不能完全避免拥塞,只是可以缓解拥塞。
所谓ACK,是指确认(Acknowledgment)的缩写,它是一种用于确认收到数据的信号。在TCP/IP协议中,当一个计算机接收到另一个计算机发送的数据包时,会向发送方发送一个ACK信号,表示已经成功接收到数据。这个ACK信号是由接收方发送给发送方的,以告诉发送方数据已经被正确接收。在TCP协议中,发送方会等待一个ACK信号来确认数据已经被成功接收,如果在一定时间内没有收到ACK信号,就会认为数据包丢失或损坏,然后重新发送数据。因此,ACK在计算机网络中非常重要,它能够确保数据的可靠传输。
快重传和快恢复算法是对慢开始和拥塞避免算法的改进。
快重传:
一句话解释算法:
我们已经知道的是,TCP可靠传输机制中,利用了快重传技术,通过冗余ACK来检测丢包的发生。
在这里,我们利用冗余ACK来检测网络的拥塞,其实是同一套道理(因为丢了包不就意味着网络可能出现了拥塞嘛)。
快重传并不是取消了重传计时器,而是在某些情况下更早地重传丢失的报文段。
当发送方连续收到三个重复的ACK时,直接重传对方尚未接收到的报文段,而不必等待那个报文段设置的重传计时器超时。
快恢复:
一句话解释算法:
当发送方连续收到三个冗余ACK时,把慢开始门限ssthresh设置为此时cwnd的一半,这是为了预防网络发生拥塞。
这一过程与慢开始有点类似,但是不同的是,快恢复会把cwnd值设置为慢开始门限ssthresh改变后的数值,而不是1,然后直接开始进行拥塞避免算法。如下图例子所示:
传输层易错题链接:juejin.cn/post/723117…