TCP可靠传输
    停止等待ARQ协议
    ARQ(Automatic Repeat-reQuest),自动重传请求
    image.png

    无差错情况下照常传输
    超时情况下:
    及当客服端发一个a数据到服务器,但是中途丢包了,然后服务器没有
    收到数据包,迟迟没有响应回来,则超出一段时间过后,就会判断为丢
    包,客服端将会再次自动发送a数据给服务器。

    image.png

    确认丢失:
    服务器已经收到数据包了,但是在响应回去的时候丢包了,然后客服端迟迟没有收到数据包,于是就超时重传,然后服务器就把之前传的数据包丢掉,接受重新传的这个数据包,并重新响应给客服端。

    确认迟到:
    网络不好的情况下,客服端发送了一个数据包给服务器,服务器也返回了响应,没有丢包,但是因为网络原因没有及时的传送到客服端,于是客服端超时重传了,但是当传了并响应回来之后之前传的数据包因为网络原因也响应回来了,于是服务器就得丢掉重复的数据包。

    若有个包重传了N次还是失败,会一直持续重传到成功为止么?
    这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接
    image.png
    **

    连续ARQ协议 + 滑动窗口协议
    **
    image.png
    如图所示,连续ARQ协议 + 滑动窗口协议一次发送一堆数据,然后返回确认一次。

    如果接收窗口最多能接收4个包
    但发送方只发了2个包
    接收方如何确定后面还有没有2个包?
    等待一定时间后没有第3个包
    就会返回确认收到2个包给发送方

    SACK—选择性确认

    在TCP通信的过程中,如果发送序列中的某个数据包丢失了,比如(1、2、3、4、5)中的3丢失了
    TCP会重传最后确认的分组后续的分组,比如这儿最后的是3、4、5,这样已经正确传输了的4、5又会重复传送,降低了TCP的性能。
    SACK选择性确认就是告诉发送方是哪些数据丢失了,哪些数据已经收到了
    比如上面的例子,TCP在SACK选择性传输下就只需要重新发送丢失的包—3,而3后面的4、5就不用重新发送了。

    为什么在传输层就将数据“大卸八块”分成多段,而不是等到网络层在分片传递给数据链路层?
    因为可以提高性能
    可靠传输是在传输层进行控制的
    如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
    如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段就行.
    **

    TCP流量控制
    **
    如果接收方的缓存区满了,发送方还在疯狂着发送数据
    接收方只能把收到的数据包丢掉,
    大量的丢包会极大着浪费网络资源
    所以要进行流量控制。

    流量控制就是让发送方的发送速率不要太快,让接收方来得及处理

    原理
    通过确认报文接口中窗口字段来控制发送方的发送速率
    发送方的发送窗口大小不能超过接收方的窗口大小
    当发送方收到接收方的窗口大小为0时,发送方就会停止发送数据.

    流量控制的特殊情况
    一开始,接收方给发送方发送了0窗口的报文段
    然后发送方就停止发送数据了
    但是后面,接收方有了一些存储空间后,又向发送方发送了非0的窗口报文段,但是这个报文段丢失了
    发送方这时的发送窗口一直为零,双方就陷入了僵局

    解决方法;
    当发送方接收到接收方发送的0窗口通知时,发送方就停止发送报文
    并且同时开启一个定时器,隔一段时间就发个测试报文去询问接收方最新的窗口大小
    如果接收到的窗口还是为0的话,则发送方就重新刷新定时器

    TCP拥塞控制
    **
    拥塞控制就是防止过多的数据注入到网络中
    避免网络中的链路或者路由器过载

    拥塞控制是一个全局性的过程
    涉及到所有的主机、路由器
    以及与降低网络传输性能有关的所有因素
    是大家共同努力的结果

    相比而言,流量控制事点对点通信的控制

    拥塞控制的方法
    慢开始(slow start, 慢启动)
    拥塞避免(congestion avoidance)
    快速重传(fast retransmit)
    快速恢复(fast recovery)

    几个缩写
    MSS(Maximum Segment Size) : 每个段最大的数据部分大小(在建立连接时确定)

    cwnd (congestion window):拥塞窗口

    rwnd(receive window) : 接受窗口

    swnd (send window) : 发送窗口

    swnd = min(cwnd , rwnd)

    慢开始:
    **
    image.png

    cwnd(拥塞窗口)的初始值比较小,然后随着数据包被接收方确认(收到一个ACK)
    cwnd就成被增长(指数级)

    拥塞避免:
    image.png

    ssthresh(slow start threshold): 慢开始阈值,cwnd达到阈值后,以线下方式增加
    拥塞避免(加法增大) : 拥塞窗口缓慢增大,以防止网络过早出现拥塞
    乘法减小: 只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)
    当网络出现频繁拥塞时,ssthresh值就下降的很快

    快速重传

    接收方
    每收到一个失序的分组后就立即发出重复确认
    使发送方及时知道有分组没有到达
    而不是自己等待超时发送数据时才确认

    发送方
    只要连续收到三个重复确认(总共四个相同的确认),就应当立即重传对方尚未收到的报文段
    而不必继续等待重传计时器到期后再重传

    image.png

    快速恢复:
    **
    当发送方连续接收到三个重复确认,说明网络出现拥塞
    就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半

    与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值
    而是把cwnd值设置为新的ssthresh值(减小后的值)
    然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大

    image.png
    上图为快重传+快恢复

    拥塞控制发送窗口的最大值
    发送窗口的最大值:swnd = min(cwnd, rwnd)
    当rwnd < cwnd时,是接收方的接收能力限制发送窗口 的最大值
    当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值

    **