【事先声明】
这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》
需要的可以私信我,无偿分享,课程简介下也有
课程链接
目录
- 传输服务与协议
- 网络层与传输层
- 多路复用与解复用
- TCP
- UDP
- 无连接传输UDP
- 用户数据报
- 可靠数据传输(rdt)原理
- 问题逻辑
- 当底层信道是完全可靠的
- 接收方与发送方
- 具有比特错位的底层信道
- FSM描述
- 自动重传协议(ARQ)
- 缺陷
- 版本2
- 对于发送方而言
- 对于接收方而言
- 具有比特错位与分组丢失的底层信道
- 流水线
- 通用:滑动窗口协议
- 发送缓冲区
- 发送缓冲区的大小
- 发送窗口
- 接收缓冲区
- 接收窗口
- 接收窗口尺寸等于1(GBN回退N步)
- 发送方
- 接收方
- 接收窗口尺寸大于1(选择重发SR)
- 发送方
- 接收方
- 滑动
- 发送确认
- 对比
- 面向连接的传输TCP
- 三次握手
- MSS(最大报文段长度)
- TCP报文段格式
- 序号(32比特)
- 确认号(32比特)
- 接收窗口
- TCP的往返延时(RTT)和超时
- 如何估计RTT
- 指数移动加权平均
- RTT的波动影响
- TCP可靠数据传递
- TCP基于IP建立了RDT协议
- 超时重传
- 情况一
- 情况二
- 快速重传
- 伪代码
- 流量控制
- 目的
- 捎带技术
- 连接管理
- 三次握手
- 四次挥手
- 拥塞控制原理
- 拥塞的代价与原因
- 两个发送方和一个无穷大缓存的路由器
- 两个发送方和一个有限缓存的路由器
- 多个发送方多台路由器
- 控制方法
- 端到端的拥塞控制
- 网络辅助的拥塞控制
- ATM
- ABR服务
- TCP拥塞控制
- 端到端的控制机制
- 如何检测拥塞
- 某个段超时(丢失):拥塞
- 3个冗余ACK:轻微拥塞
- 如何控制端的发送速率
- 超时
- 三次冗余ACK
- 正常情况
- TCP拥塞控制与流量控制的联合处理
- 控制策略
- 慢启动
- 线性增
- 乘性减
- TCP的公平性
传输服务与协议
为运行在不同主机上的应用进程提供逻辑通信
逻辑上,应用层的进程可以直接与另一主机上的进程进行通信,通过套接字即可
实际上,需要传输层以及底下的协议栈提供服务。
- 发送方:将应用层的报文分成合适的报文段,加上本层报头,然后传递给网络层
- 接收方:将报文段进行报头解析,然后重组成报文,传递给应用层
传输层协议有TCP或者UDP协议两种选择
网络层提供的是端到端(主机到主机)之间的服务,传输层在网络层的基础上,提供更加细分的服务,从进程到进程之间的服务。
网络层与传输层
网络层:主机之间的逻辑通信
传输层:进程之间的逻辑通信
- 依赖于网络层的服务:延时、带宽无法改善
- 增强网络层的服务:顺序混乱、数据丢失、加密
多路复用与解复用
TCP
以TCP为例,应用层建立TCP套接字
应用层调用传输层的服务需要提供的信息有,数据报文与socket套接字—两个参数
- 在传输层中,通过使用套接字中的源PORT与目标PORT封装报头,然后向下传输
- 在网络层中,使用套接字中的源IP与目标IP封装成IP的报头。
分组到达目标端后,依次进行报头解包,向上提供有效载荷部分,网络层还需要提供源IP与目标IP,在传输层中,根据这些数据,再解包出来的源RORT与目标PORT,根据这四个数据可以确定对应的套接字,然后根据套接字可以确定目标进程。
UDP
套接字结构
逻辑概念图
- 进程调用传输层的UDP服务,需要向下提供数据部分、套接字、目标IP与PORT—三个参数
- UDP使用套接字中的源PORT与传下来目标PORT进行报头的封装
- 将数据报、套接字中的源IP、目标IP传递给网络层,使用IP协议,封装成IP数据报
在目标端中
- 网络层对IP报头进行解包,给传输层提供,源IP与目标IP以及有效载荷
- 传输层对UDP报头进行解包,给应用层提供目标PORT与目标IP,可以确定一个套接字,既可以找到目标进程
在网络传输的过程中,只要四元组 ( 源 I P ,源 P O R T ,目标 I P ,目标 P O R T ) (源IP,源PORT,目标IP,目标PORT) (源IP,源PORT,目标IP,目标PORT)中的任何一个不一样,访问的主机的进程都会是不一样的
无连接传输UDP
UDP在IP上并没有增加一些服务的性能,报文可能丢失、乱序
- 接收端与发送端之间没有握手
- 每个UDP报文段都被独立的处理
常用于 流媒体、DNS、SNMP,一次传输搞定或者对速率要求高、丢失不敏感的类型。
用户数据报
校验和:一种校验手段,用于判断在传输的过程中,数据是否出错
传输校验码,在接收端会重新根据内容计算一遍,来与校验和对比,判断是否出错,但是校验不一定是绝对正确的,存在某些错误但是通过了校验。
报文段的头部很小,有效载荷占比大,所以传输速率高。
可靠数据传输(rdt)原理
在TCP协议中,器可以建立一条可靠数据传输信道,然后,在进行有序的分组的传输。
不过,传输层实现的有效数据传输协议的下层协议是不可靠的,要在一个底层不可靠的协议上实现可靠的传输协议。
问题逻辑
由于底层信道的不可靠性,导致rdt协议会比较复杂。
当底层信道是完全可靠的
- 没有比特出错
- 没有分组丢失
接收方与发送方
- 发送方将数据打包发送到下层信道
- 接收方从下层信道接收数据
底层信道完全可靠,不需要上层采取什么措施来保证数据可靠
具有比特错位的底层信道
假定底层信道的分组发送是按照顺序被接收的,不过在发送的过程中,会存在一些比特错位的情况(物理部件中)
发送端发送分组后,接收端接收需要对分组进行校验,校验成功,发送给接收端一个(ack)的信号,表示确认收到。
如果校验失败,接受方发送一个(nak)的信号,要求发送方再重传一次。
发送方发送一个分组后,再缓冲区中还需要留这个分组一个备份,等接受方发送一个ack的信号后,再跟新缓冲区,发送下一个分组。如果收到一个nak的信号,则从缓冲区中将备份重传一遍,等待信号。
FSM描述
自动重传协议(ARQ)
需要三种协议来处理比特差错的情况
- 差错检测(校验算法)
- 接收方反馈:确认收到ACK;否定确认,重传(NAK)
- 重传:发送方会重传该分组
缺陷
不过有一个问题,没有考虑到接收方反馈信号受损的情况(发送方没有收到ack或者nak)。
在分组之间引入一个字段代表序号
如果两个信息的序号一样,说明是处于重传的情况。序号改变了,说明这传递的是一个新的分组。
如果发送方发送了分组,序号0,接收方发送一个ack,但是ack受损,本来发送方是希望接收到ack或者nak,但是出现了其它的情况,发送方就会重新把序号0的分组发送给接收方,接收方收到,判断处前后两个分组的序号一样,就会再次发送ACK,同时一直等待,直到接收到前后两个序号不一样的分组,接收方就直到上一个状态结束了,继续去等待收到下一个序号不一样的分组。
- 分组的序号一样:说明一直在重发,接收方与发送方在等待同步
- 分组的需要不一样:说明进入了下一个阶段
接收方,在收到分组时(序号为0),如果校验通过,发回一个ack,然后等待发送方发一个序号1的分组,如果任然接受到的序号为0,说明发送方接收到的数据有误,则 会继续等待,同时发送一个ack给发送方,希望发送方可以同步上来
版本2
如果对于接收方的确认信息,ack或nak,如果不发送nak,通过序号与ack的结合也可以达到nak的效果。
对ack进行编号。
接收端收到的分组校验失败时,需要发送端重新发送一份,接收端会发送nak;发送端需要重新发送分组的情况有,nak出问题了或者分组发送校验失败,两个情况都需要重新发送一份分组
所以,当分组为0时,发送端接收到ack0时,说明双方正常,可以进行下一次分组发送,同时序号变为1;发送端接收到ack1时,说明需要重新发送一份序号0的分组。
接收方,当校验失败时,发送一个ack1,需要发送方重发,等待正常的序号0分组;当接收到一个序号0分组时,发送一个ack0,表示可以进行下一步(等待序号1的分组)。当收到一个序号0分组时,说明发送方正在重传,发回一个ack0,等待发送方发送序号1的的分组(进入下一步)。
此时状态0,等1,可以进入下一步
此时状态1,等0,可以进入下一步
对于发送方而言
- 发送的分组0,接收到ack0,则发送下一个分组;接受到ack1,继续发送分组0,同时等待收到ack0
- 发送的分组1,接收到ack1,则发送下一个分组;接受到ack0,继续发送分组1,同时等待收到ack1
对于接收方而言
- 接收到分组0,校验成功,发送ack0,等待收到分组1,进入下一步;
- 校验失败,发送ack1,等待。
具有比特错位与分组丢失的底层信道
当发送方发送一个分组,然后等待ack,但是分组丢失了,而接收方又没有收到分组,在等待分组,双方都在等待对方的信号,这样会造成死锁,无法向下进行。
引入了超时重传机制,等待超过一定时间就会重传一次分组。
对于发送方等待超时的情况下,发送方不知道是分组丢失,还是ack丢失,直接发送方重传一份。
如果是ack丢失,发送方重新发送一份,对于接收方而言,不过是重新接受一份,继续等待。
当定时设置的合适时,效率是正常的,如果定时设置的不合理,则会导致其性能严重下降。
当rdt3.0在信道较大(带宽大)的情况下,会出现吞吐量很低的情况,传输延时(距离长)较大,会造成利用率非常低,因为RTT时间长。大部分时间都花在传输上。因为,rdt3.0模式下,信道中只能有一个分组进行传输,严重浪费了带宽资源,引入流水线技术。
流水线
一个信道种传输多个分组,当一个分组发送刚出去后,立马发送下一个分组…
所以,发送端要准备一个缓冲区,将发送出去的分组暂存在缓冲区,如果发送失败了,还能重发
通用:滑动窗口协议
发送缓冲区
- 内存中的一个区域,落入缓冲区的分组可以发送
- 用于存放已经发送但是没有得到确认的分组(发送窗口)
- 当需要重发时必要
发送缓冲区的大小
一次可以发送分组的数量
- num=1时,就是停止等待协议
- num>1时,合理的值,不能很大,链路利用率不能超过100%(表示缓存区存放的分组总和有限)
由于要求链路的利用率不能超过100%,且链路的容量是指带宽大小,带宽是有限的,所以对于缓冲区能存放的分组的大小是有限的。
发送窗口
-
在发送缓冲区中,缓冲区不一定被待发送的分组全部占满了
-
缓冲区中,那些已发送,但未确认的分组的序号构成的空间
-
发送窗口的最大值是要<=发送缓冲区的值
接收缓冲区
一次最多可以接收存储多少分组
接收窗口
接收窗口才是决定到底一次性接收多少分组
接收窗口尺寸等于1(GBN回退N步)
当接收窗口为1时,按照顺序向后滑动,接受完0号分组,再去接收1好分组
当窗口在2号位置上等待接收,如果三号分组来了,是不会接收的,抛弃掉,只有接受完2号分组才回去接收下一个。
同时,接收端发送一个ack1,表明1号分组已经接收,同时根据rdt的理论,这是在向发送端说,在等待2号分组的接收。
如果接收窗口在2号分组的位置上,且来了3、4、5…其它分组的,接收窗口都不会接收,会将他们抛弃掉,同时向发送端发送一个已接收的最高分组的ack,根据rdt的理论,这个表明接收端正在等待下一个序号的分组,还没接收到。
发送方
依次流水线发送发送窗口中的分组,只有最低序号的分组得到确认窗口才能向前移动
如果发送方一直收到的是已经发送的最高序号的ack,那么说明接收方一直没接收到,需要重传,则会将窗口中的所有分组都进程重传
定时器只有一个,在发送方,发送了分组后,就会开启定时器,定时器结束前没有接收到ack,就会将窗口内的分组全部重新发送一遍。
接收方
其接收窗口的大小为1,这样要去顺序接收,如果当前序号的分组没有被接收,后面序号的分组如果到来是会被抛弃,因为要保证分组的有序性
接收窗口尺寸大于1(选择重发SR)
只要在接受窗口的范围内,是可以乱序接收的,接收到分组后,然后向发送端发送一个ack+对应接收的分组序号
。
如果窗口的第一个位置的分组丢失了,而后面的分组都被接收了,会有超时重传,重新发送发送窗口中的分组。
当最低序的分组被接受后,就可以让窗口向后滑动了,滑动到没被接收的位置。
都是要在
rdt3.0
协议下进行的流水线改造
发送方
发送窗口中的分组要依次进行发送,为避免分组丢失,会为窗口中的每一个分组都准备一个定时器,发送后开始计时。当接收到对应的ack后,窗口就会向后滑动。
如果定时器到了,就会将发送窗口中的未确认的分组重发一次。
接收方
在接收窗口的内部,是可以乱序接收的,然后将其存在缓存区的对应位置上,当最低序号的分组都被接收了,接收窗口才能向后移动。
接收窗口中的每一个分组被接收后,都会发送一个独有的信号,告诉发送方,该分组已经接收,可以停止计时。
滑动
低序号的分组接收,接收窗口向后滑动
高序号的分组到来,窗口内的乱序接收,因为要保证rdt,所以必须保证分组有序,不滑动
发送确认
收到那个分组,就发送那个分组的确认信号。
- 发送窗口发送数据
- 接收窗口接收数据,接收窗口滑动
- 接收端发送确认
- 发送窗口滑动
对比
SR会为每一个分组都准备一个定时器,而GBN则是顺序接收,只会为发送窗口中的第一个准备定时器,如果超时,会将发送窗口中的分组都发送出去。
面向连接的传输TCP
提供点到点之间的通信,一台主机对一台主机,无法做到一对多的广播模式
TCP连接只在端系统中运行,在网络核心中的网络元素(路由器与交换机)并不会维持其连接状态,对于网络元素,其看到的只是数据报,并不会专门提供一条线路维持其连接。
TCP连接提供的是全双工服务,当两台主机上的进程建立了TCP连接后,两个进程之间可以互相传递数据,而不是单向的数据传递。
三次握手
- 客户进程首先发送一条特殊的TCP报文段(没有有效载荷)
- 服务器用另一条特殊的TCP报文段来响应(没有有效载荷)
- 客户端用第三个特殊的报文段作为响应(承载有效载荷)
MSS(最大报文段长度)
指应用层数据最大字节数
MSS是由从源主机到目标主机的路径上,所有链路上所能够发送的最大链路层帧(最大传输单元),以太网与PPP链路层协议都是1500个字节的MTU
TCP报文段,包括40分字节的报头,加上1460个字节的应用层数据段。
最大对于应用层的数据只能封装成这么大,如果太大,就要对数据进行切分,然后再封装。
TCP为每块客户数据块配上一个TCP首部,形成多个TCP报文段,这些报文段被传递给网络层,通过一连串的路由器与交换机的链路层与物理层,最后到达服务端的TCP连接接收,然后放入TCP接收缓存中(这个缓存应该是在OS提供的一块缓存区)。
TCP连接的每一端都有各自的发送缓存与接收缓存。
两台主机之间的网络元素,并没有为连接提供任何的缓存与变量。
TCP报文段格式
序号(32比特)
这个是对于应用层的数据段,被分割成一块块的MSS,然后封装,这个是对于各块MSS在原数据段中的对于第一个字节的偏移量
TCP报文段中载荷部分的第一个字节在整个应用层数据流中的偏移量。
确认号(32比特)
任何一个TCP的实体,既是接收方也发送方。
在主机A与主机B建立了TCP连接,当主机A发送一串数据给主机B,主机B也会给主机A一个反馈报文段,当主机B收到主机A发送的0-533序号的所有字节,主机B会等待主机A发送534及其之后的报文段字节,主机B就会发送一个确认号为533的报文段,向主机A表明,533及其之前的报文段都已经被接受了,等待后面的报文段。
对于乱序到达的报文段,可以选择缓存(SR),也可以选择抛弃(BGN)。
接收窗口
用于流量控制,愿意接收的字节数量
TCP的往返延时(RTT)和超时
超时设置要大于RTT时间
如果超时设置较小,则会造成主机B还没反馈,就又发送报文段,会发送很多的重复报文段
如果超时设置较大,会造成需要重传时,造成很大的延时。
如何估计RTT
长时间的主机访问的RTT虽然是符合正态分布的,但是无论怎样设置都会造成较大的问题。
但是短时间的主机访问RTT的时间是非常集中的,所以超时设置应该是一个动态的自适应参数
在一个局域网中,RTT非常小,但是对于两个进程之间的TCP通信,这个RTT会不太确定,影响很多。
所以需要时不时的去测量RTT,来动态的调整超时。
指数移动加权平均
当前采样值对于整体值的影响会随着时间(采样次数)的增加而呈指数规律越来越小。
RTT的波动影响
TCP可靠数据传递
TCP是一种流水线的数据传输协议,而流水线的协议由两种:GBN与SR
TCP的数据传递是两种的混合体
TCP基于IP建立了RDT协议
- 管道化的报文段:GBN或者SR
- 累计确认:通过报文段中的确认号(类似于GBN)
- 单个重传定时器:只与最”老“那个报文段相关联,如果超时就会重发最老的那个报文段(SR与GBN的结合)
- 接收方对于乱序,没有规范,可以接收也可以抛弃
超时重传
当过早超时时,发送方会发送最老的那个报文段,然后接收方就会发送最新的预期确认号,这样就可以让发送方关掉定时器,发送预期的报文段。
接收方发送的确认是累计确认,是最新的期望接收的报文段
情况一
情况二
快速重传
如果发送方收到了3个冗余的ACK(收到了3个确认号一样的ACK),说明发送方发送的那个报文段丢失了,因为是流水线持续发送报文段。
这样不用等到定时器触发,直接重发一份。
这个时机比超时重发更早一些,提高速度
接收方发送的报文段的序号是要大于接收到的ack,这样可以检测出接收方的报文段缓冲区存在间隔
伪代码
流量控制
目的
接收方控制发送方的发送速率,不让发送方发的太快、太多,而导致接收方的缓冲区溢出。
通过TCP报文中的接收窗口这个字段,接受方发送给发送方,可以让发送方知道接收方的接收缓冲区中还有多少空间
捎带技术
TCP连接是可以双向通信的,进程A发数据给进程B,进程B也要发数据给进程A。进程B收到进程A的数据,需要将ACK发送给进程A,但是这个ACK可以和进程B发给进程A的数据在一个报文段中一起发回去,TCP报文段也提供了这个格式。
连接管理
在正式交换数据之前,接收方与发送方需要三次握手,建立连接关系
- 同意建立连接:双方都知道对方愿意建立连接
- 同意连接参数:准备资源,维护变量参数
三次握手
第二次握手后,双方就可以开始随机初始化自己的初始序号
在第三次握手后,再开始分配资源,如果再前两次握手,会存在大量的办理按揭同时会消耗大量的系统资源,一种攻击手段。
四次挥手
两个半连接的互相拆除。
客户端确认关闭连接后,双方为了TCP连接准备的资源就会被释放。
通过携带技术,服务端的FIN报文段可以携带对客户端回应的ACK
拥塞控制原理
与流量控制不同,拥塞控制是出现在网络中,针对分组的丢失率与延迟的处理
对于网络核心中的元素,路由器与交换机
- 分组丢失(路由器缓冲区溢出)
- 分组延时高(出现拥塞的情况下,分组排队的时间很长)
拥塞的代价与原因
两个发送方和一个无穷大缓存的路由器
对于路由器的带宽,给两个发送方提供服务,作为一个共享带宽,一个发送方最大享用R/2的带宽
随着发送方的发送速率越来越大了,则在缓冲区的排队的分组也越来越多。当一个发送方占用的带宽达到R/2时,说明共享链路的流量强度以及达到上限。
分组发送中的延时也会越来越大,并且指数级增长。
两个发送方和一个有限缓存的路由器
都知道路由器的缓冲区一旦溢出对于新到来的分组就会被丢失
这样会触发发送方超时重传的机制,会重新发送分组。
一种理想情况,当缓冲区每空出来一个位置,就会有一个重传的分组到达去占据这个位置
另一种情况,当分组在缓冲区中排队延时超过一定时间,会引发重传机制,会再次发送一份分组,或许时间一长(多次路由器中的排队延时),会多次重传,就会造成很多不必要的分组重传,会加剧网络的拥塞程度,同时会造成吞吐率下降,即有效的传输会严重下降。
多个发送方多台路由器
多个发送方说明网络的拥塞会急剧上升,多台路由器会出现多个拥塞的节点
当一个发送方需要经过多台路由器才能到达接收方,如果前几个录用其出现拥塞,然后发送方会发送大量的重传分组,然后某个分组到达一个新的路由器时,那个路由器因为缓冲区溢出,而抛弃那个分组,这样会造成大量的传输能力的浪费,会造成链路的带宽的浪费,会加剧网络的拥塞程度。
控制方法
端到端的拥塞控制
网络层不会为传输层提供信息,端系统必须通过对网络层数据状态的观察来推断,网络中是否出现拥塞
TCP连接通过对报文段的丢失或者收到3次冗余的报文段来判断网络是否出现拥塞,一种推理方法。
当推断网络出现拥塞时,会响应的减少发送速率,当网络情况良好的时候,会提高发送速率。
网络辅助的拥塞控制
网络中的组件(路由器)会向发送方的传输层提供网络的拥塞状况,可以很简单的使用一个比特位来表明链路中的拥塞状态,让发送方调整自己的发送速率,以抑制网络拥塞的恶化
拥塞信息的传递有两种
- 直接由网络路由器发送一个分组给发送方,告诉发送方拥塞情况
- 对于发送方发向接收方的分组中,通过某个字段标记来表明网络拥塞,然后让分组到达接收方,由接收方发送一个拥塞分组告诉发送网络拥塞了,这个往返方法至少需要一个RTT的时间,还存在丢失的情况。
ATM
该网络的交换数据单元叫信元
信元只有53个字节,远小于分组的大小,所以其在链路上的传输速率要比分组快,虽然比线路交换慢。
ABR服务
在ATM网络中,网络不发送拥塞的情况,会提高传输速率尽可能利用可用带宽,在网络拥塞的情况,会限制传输速率。
信元分为数据信元与资源管理信元,大部分是数据信元,中间残差了少量的资源管理信元
在资源管理信元,中由两个比特位,一个表示轻微拥塞,一个表示重度拥塞,在经过交换机时,交换机会根据情况来设置资源管理信元的标志位。
发送方将一组信元发送给接收方,经过一连串的交换机,到达接收方后,接收方不做处理,资源管理信元被接收方原路返回给发送方,告诉发送方网络的拥塞情况。
资源管理信元中,还存在一个字段ER,在资源管理信元经过一个个交换机后,可以知道所有交换机可以位会话提供最小的带宽是多少,可以让发送方调整发送速率,改善网络拥塞情况
TCP拥塞控制
如果是网络辅助的拥塞控制,虽然可以提高网络的拥塞控制能力,但是会增加网络的负载,增加路由器的负担,代价比较大。
端到端的控制机制
网络路由器不提供信息,而是靠端自己获得的信息来判断网络是否发送拥塞
- 路由器负载较轻
- 符合网络核心简单的TCP/IP架构原则
如何检测拥塞
某个段超时(丢失):拥塞
超时定时器的时间到了,但是那个段的确认却没收到
- 网络拥塞:某个路由器缓冲区溢出,然后被丢弃了;经过多个路由器中排
- 校验失败:因为各级错误,没有通过校验,而被丢失(概率小)
虽然,一旦超时就认为拥塞是存在问题的,但是总体的大方向控制是没有错误的
3个冗余ACK:轻微拥塞
- 收到第一个ACK:正常,收到确认信号
- 后面收到3次同样的冗余ack,说明这个分组丢失了,但是又没触发定时器,提前重传
网络还能进行一定程度的传输,说明网络存在一定轻微的拥塞
如何控制端的发送速率
为此一个变量,CongWin:在对方未确认的情况下,可以往网络中发送多少字节
发送速率 r a t e = C o n g W i n R T T rate=\dfrac{CongWin}{RTT} rate=RTTCongWin,表明单位时间内可以往网络中注入多少字节
超时
会将CongWin的发送速率调整为1个MSS,进入到一个慢启动(SS)的阶段,然后倍增到CongWin/2(每个RTT),进入到拥塞避免(CA)阶段
三次冗余ACK
CongWin降为CongWin/2,进入CA阶段
正常情况
发送方收到正常的ACK,CongWin会逐步增加
- SS阶段:成倍增加(每个RTT)
- CA阶段:线性增加(每个RTT)
TCP拥塞控制与流量控制的联合处理
发送方控制发送但为确认的量,同时也不能超过接收窗口,需要满足流量控制
SendWin=min{CongWin,RcvWin}
- 满足拥塞控制与流量控制
控制策略
慢启动
刚开始,CongWin等于一个MSS,然后从下一次开始,每次发送是之前一次的两倍,相当于指数级增加。
线性增
当出现超时的情况时,将阈值设置为CongWin/2,然后CongWin变成1MSS开始倍增,当倍增到阈值时,就停止倍增,然后以每次增加一个MSS的速率增加,探测更加准确的阈值。
乘性减
一旦出现超时或者冗余ACK,就会将阈值设置为原先的一半,CongWin变成1个MSS,重新倍增。
维持一个变量:Threshold,表示CongWin成倍增加的阈值。出现丢失时,就设置为CongWin/2
TCP的公平性
两个TCP会话,都需要通过一个瓶颈链路,链路带宽为R,两个会话的RTT相等
因为拥塞控制的阈值每次回变为CongWIn的一半,最后回收敛为两个会话各自占用一半的带宽