• TCP滑动控制


    TCP并不是么一个窗口都会回复ACK的,可能会对俩个报文段发送一个ACK,也可能会对多个报文段发送1个ACK,比如说,发送方有1/2/3/4个报文段,先发送2,3俩个报文段,但是接收方期望收到1报文段,这个时候,2,3报文段就只能放在缓存中等待报文1的空洞被天上,如果报文1一直不来,报文2,3也将被丢弃,如果报文1来了,那么会发送一个ACK对这三个报文进行一次确认。

    举一个列子来说明一下,活动窗口的原理:

    1、假设32-45这些数据,是上层application发送给TCP的,TCP将其分成四个segment来发往internet

    2、seg1 32-34 seg3 35-36 seg3 37-41 seg4 42-45这四个片段,依次发送出去,此时假设接收端只接收到了seg1 seg2 seg4

    3、此时接收端的行为时回复一个ACK包说明已经收到了32-36的数据,并将seg4 进行缓存(保证顺序,产生一个保存seg3 的hole)

    4、发送端收到ACK之后,就会将32-36的数据包从发送并没有确认切到发送已经确认提出窗口,这个时候窗口向右移动。

    5、假设接收端通告的window size任然不变,此时候,窗口右移,产生一些新的空位,这些是接收端允许发送的范畴。

    6、对于丢失的seg3 ,如果超过一定时间,TCP就会重新传送(重传机制),重传会成功seg3 sseg4 一块呗确认,不成功,seg也将被丢弃。

    就是不断重复着上述的过程,随着窗口不断滑动,将整个数据流发送到接收端,实际上接收端的windowsize通告也是会变化的,接收端根据这个值来确定何时及发送多少数据,从对数据流进行流控。

    滑动窗口动态调整:

    主要是根据接收端的接受情况,动态的去调整window size,然后来控制发送端的数据流量。

    1、客户端的不断快速发送数据,服务器接受相对较慢,看下实验结果。

    a.包 175,发送ACK携带win = 384,告知客户端,现在只能接受384个字节。

    b.包176,客户端果真只发送了384个字节,wireshark也比较智能,也宣告了TCP window full

    c.包177,服务器回复一个ACK,并告知窗口为0,说明接收方已经收到礼物所有数据,并保存到缓冲区,但是这个时候应用程序并没有接受这些数据,导致缓冲区没有更多的空间,故告知窗口为0,这就是所谓的0窗口,零窗口发生期间,发送方停止发送数据。

    d.包客户端察觉到窗口为0,则不再发送任何数据给接收方。

    e.包178,接收方发送一个窗口通告,告知发送方已经有接收数据的能力了,可以发送数据包了。

    f.包179,收到窗口通告之后,就发送缓冲区内的数据了。

    总结一点,就是接收端可以根据自己的状况通告窗口的大小,从而控制发送端的接收,进行流量控制。

     TCP协议是面向可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制由窗口结合一系列的控制算法实现。

    一、滑动窗口协议:

    关于这部分自己不晓得怎么叙述才好的,因为理解部分更多,下面就用自己的理解来介绍TCP的精髓;滑动控制窗口协议;

  • 相关阅读:
    收到Google Wave要求,想要的留下信箱。
    [集成IronPython] 添加方法到运行环境
    [集成IronPython] 集成IronPython系列
    智能播放器,也许有商业价值。
    [集成IronPython] 使CLR对象对动态语言更友好(二)—— 支持切片
    [集成IronPython] 使CLR对象对动态语言更友好(一)—— 支持运行时添加删除属性
    2012新年愿望
    使用SvrAny和InstSvr将应用程序作为Window服务启动
    谁来代替博客园 —— C社区
    谁来代替博客园——寄生博客
  • 原文地址:https://www.cnblogs.com/yjds/p/8745517.html
Copyright © 2020-2023  润新知