TCP零基础入门(三)

TCP保证可靠连接,用到了确认,重传,检验和,序号等手段。

确认用来确认接收方是否接收到了分组

检验和检测位错

序号用来检测分组是重发的分组还是新的分组

重传用来防止丢包

重传一是针对ACK或者NAK分组丢失,进行重传,还有一个冗余ACK,当发送方收到的分组,其确认号都是一样的,且确认号小于序号,则进行一次快重传。比如发送方每次发送一个字节,序号分别为1,2,3,4,5,其中2分组在路上丢失。接收方发送的确认序列分别如下:(我们不关注发送方的确认号和接收方的序号,因为先不考虑接收方向发送方发送应用数据)

通过增大重传等待的时间,就可以显示的进行拥塞控制,这个叫超时间隔加倍,第一次重传1秒,又丢失分组后进行第二次重传,等2秒再重传,第三次等4秒。

发送方的序号     接收方发送的确认号

1                           2

2丢失

3                          2

4                          2

这时发送方已经收到三个确认号都为2的分组了,于是进行一次快重传,其序号为2。

(不过为什么第三次不发送2而要发送3呢,还要等三次,可以这么理解,发送方是流水发送的,可能还没有收到回复,发送方已经把发送窗口的12345678都发送过去了)

那么为什么要流量控制和拥塞呢,是因为,假如不控制发送方的发送速率,接收方会丢弃大量的无法处理的分组,这些分组接收方无法处理,但是发送方由于重传机制,会不断的发,就好比下雨天,我中的庄家只要那么多水,可天老在下雨,我的抽水机要不断的把多余的水给抽出去。流量控制和拥塞控制都是限制发送方的发送速率完成的。

先看流量控制

上图(图要是没有看TCP零基础入门(一))

 

可以看到,第四行窗口字段,指的就是接收窗口,当A发送给B,B收到分组,对A发送回应分组的时候,B还能接收的分组的的大小,就放在接收窗口里,单位为字节,可以看出窗口为16位,那么窗口大小最多为64KB(计算方法2^16B=2^6KB=64KB)

对于发送方,向接收方发送一个文件的情况,接收方在连接建立的时候,会建立一个缓存,分组从网络层拿过来,先放到缓存里,缓存满了,再把数据移交给 上层,并清空缓存。好比打井水,水满了就把桶里的水倒到缸里,空桶继续打水,那么在建立连接的第二次握手的时候,接收窗口的大小就是缓存的大小(因为缓存里什么都没有),这时把窗口的大小维护到TCP首部的窗口字段里,同理第三次握手就是发送方发送接收窗口大小(或者是第一次握手,书上没有这么详细,但是TCP是双工的,发送方同时也是接收方,所以两方各自维护自己的接收窗口),那么发送方知道了接收方的接收窗口,在发送分组的时候,就要发送小于接收窗口的分组。因为接收窗口是动态变换的,当接收窗口为0的时候,发送方告知接收方这一消息,然后自己把数据转移给应用层,同时缓存清空,这时接收窗口又变成最大了,但是发送方不知道这个消息,发送方只能等接收方主动告知发送方,但是接收方说:你不问我就不回答,

    发送方说:你窗口是0,我说不出话来,

接收方:我现在窗口最大啦,你问我一句我就告诉你可以继续发了,

    发送方:我现在就只知道你窗口是0,你窗口是0由于流量控制,我不能发送消息

接收方:你发送消息给我,我才能回复你,我又不能主动给你发消息,我很传统的,你就说一句话,随便说什么,我马上就告诉你我窗口是空的。

    发送方:……

不是说好的窗口为0不能发消息吗,算了,我不要面子了,我发

于是当发送方收到接收窗口为0的分组时,他只好再发送一个分组给接收方,用来问接收方清空缓存后的接收窗口。

这就是流量控制的全内容。

我们在前面学习可靠传输协议的时候讲到了GBN和SR协议(忘记了自己回去看)其中TCP协议是用的哪种呢,SR协议看起来更好,因为信道里的冗余分组会很少,但是GBN也有优点,那就是接收方不用维护那么多变量,实现起来简单,我只管收,你乱序了我都不要,对接收方的压力会很小,所以接收方作为服务器有大量请求的时候,GBN协议似乎对接收方更优。我们看到上面TCP首部有一个选项字段,里面就有选择确认这个东西。

 

接下来讲拥塞控制,他和流量控制有什么区别呢,流量控制通过接收窗口,显示的知道并控制是发送方速率太快,限制发送方。而拥塞时,发送方和接收方只知道信道堵了,就比如我们塞车,最前面的车撞了,把高速堵了,我们才上高速,只知道很堵,在哪里堵的,谁堵的,不知道。通过超时或者三次冗余ACK(前面讲的序号2丢失,于是三次发送方接收的确认号都是2)这两个事件判断出网络拥塞。除了接收窗口rwnd,发送方需要维护一个拥塞窗口cwnd,发送速率要小于min(rwnd,cwnd),来处理拥塞。具体拥塞控制策略有三种,慢启动,拥塞避免,快恢复(还有说法是拥塞控制第四种是快重传,但快重传应该是提高发送速率而不是减小发送速率的,快重传是什么上文有)

先上图:(网上找的图)

拥塞控制主要关注三个变量

cwnd拥塞窗口

ssthresh慢启动阈值

传输轮次

cwnd从1个mss(最大报文段长度,也就是一个报文段能携带的最大应用数据长度)开始,每一次开始收到ACK后,指数增加,2,4,8,16,32,当cwnd=32的时候,超时发生了,这时设置ssthresh等于当前cwnd的一半,也就是16。这一部分的内容就是慢启动。慢就是起点低,启动就是开始增长cwnd,对应的发送速率开始增加。

然后进入拥塞避免,cwnd开始线性增长17,18……24。为什么到24就结束了?因为到24后又出现了丢包,可以猜测当前网络能允许发送方发送的拥塞窗口或者发送速率就是24。我们可以看到到24之后,cwnd又降低到1,然后指数增长到最大cwnd的一半,就是12,新的值赋给ssthresh。那为什么不一直以24的速率发送数据呢,还要从1开始,因为最大cwnd是一个动态变化的值,整个网络的拥堵情况也是实时变化的,考虑到极端情况,该网络所有其它的连接都退出了,这时cwnd的最大值肯定远远大于24。

那么什么是快恢复呢,cwnd降为1以及ssthresh设置为当前最大cwnd的一半,这两个动作是检测到丢包的情况,那么没有丢包,而是接收到三个冗余ACK呢,就变成快恢复,如下图(网上找的图)

检测到三次冗余ACK后,cwnd不是从1开始而是从新ssthresh开始增加。那为什么cwnd又不从1开始而是从ssthresh开始,核心是丢包和三次冗余ACK产生的原理不一样,丢包超时很大可能就是网络不堪重负了,必须缓缓,缓到最低限度1开始(为什么不是0,是0什么都发不出去了,这给接收方搞了一个主动超时),而你都接收到三次冗余ACK了,说明这个网络还是可以的嘛,只是丢了一个包,那我没必要从1开始增加。从ssthresh开始,让你等这个丢的包不会等太久(等太久了接收方就容易急,一急就给你发确认ACK,要这个2号包)

这就是所有的拥塞控制的内容,我们需要注意的是,这种指数增长又线性增长,是要干嘛,指数增长可以快速找到cwnd的最合适范围,比如上图的,只需要5轮,我就知道最合适的cmwd在16-32之间,你说找到了这个区间范围,它不能像我们数据结构一样,折半查找嘛,16-24,24发现快了,然后调整到20,发现慢了,然后调整到18。但是问题是,网络对于超时是代价敏感的,一旦cmwd增加的过多,拥塞会更加严重,所以需要线性增长。那这么就好记忆了,我们先指数增长,找到最合适的范围后线性增长,ssthresh就是最合适范围的下界,那我们从1开始,怎么快速到达我们找到的ssthresh,那就是指数增长嘛。而快恢复,我们已经有最合适范围下界了,也就是ssthresh,那么我们就从ssthresh开始恢复不就行了嘛。

以上就是流量控制和拥塞控制的全部内容。TCP协议到此全部结束,下一次我们来说说IP层是个啥。

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值