zoukankan      html  css  js  c++  java
  • 网络通信之校验

    这是一个可选的选项,并不是所有的系统都对UDP数据包加以检验和数据(相对TCP协议的必须来说),但是RFC中标准要求,发送端应该计算检验和。

      UDP检验和 覆盖UDP协议头和数据,这和IP的检验和是不同的,IP协议的检验和只是覆盖IP数据头,并不覆盖所有的数据。

    TCP校验:首部和数据的校验和;

    UDP校验:ipv4中首部和数据的校验和,但是是可选的;ipv6必选;

    IP校验:首部校验和;

    TCP是基于流的;什么是流呢?

    UDP是基于数据包;

    校验方法:二进制求反码相加即得和;

    TCP半关闭;

     Nagle算法:

      由于Tcp中的微小分组(比如:41Byte的分组:20Byte的IP头,20Byte的TCP头和1个Byte的数据)在广域网上回增加拥塞的可能,Nagle算法就是优化该问题的;

    该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组;相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去;

      该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送的越快;

     tcp的成块数据流:

      正常的数据流通常是采用“隔一个报文确认”的策略;就是说:s端收到报文段1,先不进行ack;而是等到收到报文段2之后,再ack回应客户端;

    滑动窗口协议:(窗口的大小是不断变化的; )

      在c端保存,并受s端和c端共同控制;

    假设先将待发送的字节编号:1、2、3、4、5、6、7、8、9、0、10、11、12;由三次握手建立连接之后,得到s端的tcp的buf大小即滑动窗口的初始化大小(假设为6Byte);

    a:此时滑动窗口的左边沿是:1号,右边沿是:6号;此时发送1、2、3、号之后,滑动窗口位置不变,

    b:s端向c端确认ack=4;win=6;此时窗口左边移动到7号处,右边移动到:4+6即10处;

    c:接着:第二段报文发送4、5、6、7号,此时窗口不动,因为只有再收到s端的ack之后才改变位置、大小;

    d:s端确认第二段报文,ack=8,win=3;说明s端的tcp缓存只有一个byte空间;滑动窗口左边移动到8号处,右边移动到3+8即11号处;

    特殊情况:

        1、如果c端收到一个滑动窗口左边沿向左边移动的ack;则认为该ack是一个重复的ack;直接丢弃;(这是因为,滑动窗口的左边是由s端确认收到序号控制,因此不可能向左边移动)

        2、如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据;

    PUSH标志:

        在每一个tcp例子中,我们都看到了PUSH标志,其用途是c方使用该标志通知s方将所有接收到的数据全部提交给接收进程;这里的数据 包括:与PUSH一起传送的数据以及接收方tcp以及为接收进程接收到的其他数据;

      慢启动:(slow start)

        慢启动为c方tcp增加了另一个窗口:拥塞窗口(congestion  window,简写:cwnd);

      1、当与s端建立tcp连接时,cwnd被初始化为1个报文端;此后没收到一个s端的ack,cwnd就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加);

      2、c端取拥塞窗口与通告窗口中的最小值作为发送上限;

        拥塞窗口是c端式用的流量控制,通过窗口是s端的流量控制;

      具体的内容“创建tcp超时和重传机制”

        

  • 相关阅读:
    SmartDb代码修改
    windows下Nginx+RTMP部署
    嵌入式linux下获取flash分区大小
    (转)Qt添加windows开机自启动
    (转)交叉编译lrzsz
    关于海思SDK在Ubuntu下安装错误问题
    电总协议串口调试助手
    使用git将本地仓库上传到远程仓库(转)
    c++中包含string成员的结构体拷贝导致的double free问题
    59. 可变参数
  • 原文地址:https://www.cnblogs.com/chris-cp/p/3888795.html
Copyright © 2011-2022 走看看