zoukankan      html  css  js  c++  java
  • TCP的流量控制

    一---导读

       首先我们来看实际生活中这样一个实例,大人喂小孩子吃饭,如果孩子嘴里还有饭,孩子表示不想吃了,但大人还是继续喂。喂多了。这样就会给孩子留下一个完整的不愉快童年。

    那么在使用TCP协议的双方端系统中,发送方就像喂饭的大人,而接收方就是孩子,发送方发送的量应该由接收方来决定或者说来调节。

    二---TCP流量控制(flow control)的产生原因以及控制手段

      让发送方不要太快,以免接收方接收不过来。滑动窗口就是控制手段。

      

    上图即为滑动窗口,图示滑动窗口大小为400,滑动窗口由接收方调节。

    三---实例说明

     

    在看下图之前,我们首先必须搞清楚这样几个专有名词的含义

    1---seq(顺序;序号;初始序号;序列号;排列机):是TCP报文段首部中的序号字段,取值为1则表示TCP报文段数据载荷的第一个字节的序号为1,取值为101表示TCP报文段数据载荷的第一个字节的序号为101;

    2---DATA:表示TCP报文段;

    3---ACK(Acknowledge character 接收字符):表示TCP报文段首部中的标识位,取值为1表示是一个确认报文段,为0表示报文中不包含确认信息,忽略确认号字段。

    4---ack:表示TCP报文段中的确认号字段,取值为x表示发送方发送的x部分的字节已经确认收到;

    5---rwnd(receive window):滑动窗口的英文名;滑动窗口也可理解为接收窗口。

    四---死锁的产生和解决

      思考这样一个问题,当接收方发送给发送方的确认报文段丢失,而它一直傻傻的以为报文段成功被接收方接收,满怀期待的等着接收方发送新的报文段给它。然而另一边,发送方一直等待着接收方发送的确认报文段,好继续发送新的报文段给接收方,然而确认报文段在路上的时候就走丢了。于是双方陷入千年的等待。这就是死锁(死锁在计算机操作系统中也出现了这个概念,思想和计算机网路的大致相同)。这个时候就需要一个来解决问题的调解员。持续计时器就是这样一个调解员,若超时了,发送方发送一个大小为1字节的0窗口探测报文段。如果接收方回答为当前的接收窗口为0,则发送方继续等待,等待一会后,如果接收方的接收缓存有了空闲,则发送能接受多大的接收窗口(rwnd)给发送方,发送方按照接收方回答的值调整滑动窗口继续去发送报文段。

      朋友们可能会有这样一个疑问,既然接收方的接收窗口都为0了,那就应该什么都收不到才对,为什么能收到发送发送的0窗口探测报文段并且返回确认呢? 这是因为TCP规定,即使接收窗口为0,接收方必须无条件的接收0窗口探测报文段,携带紧急数据的报文段,确认报文段。

      继续思考这样一个问题:如果0窗口检测报文段丢失了,会出现什么问题?还能打破死锁的局面吗?回答是肯定的,因为0窗口探测报文段本身带有重传计时器,如果重传计时器超时,则重新发送0窗口探测报文段

  • 相关阅读:
    Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
    开源精神就意味着免费吗?
    是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了。
    springcloud(十五):Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
    写年终总结到底有没有意义?
    培训班出来的怎么了?
    【重磅】Spring Boot 2.1.0 权威发布
    一线大厂逃离或为新常态,大龄程序员改如何选择?
    Elastic 今日在纽交所上市,股价最高暴涨122%。
    技术人如何搭建自己的技术博客
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/14232768.html
Copyright © 2011-2022 走看看