zoukankan      html  css  js  c++  java
  • TCP如何保证传输可靠性

    数据传输的可靠性主要可以分为以下几个方面:

    • 数据内容不出错
    • 不乱序
    • 不重复
    • 不丢包

    如何保证不出错

    校验和

    将数据段分为多个16位的整数,进行相加

    前面的进位补在后面,最后取反,得到校验和

    发送方在发送数据前计算校验和,接收方收到数据后以同样的方式计算

    若校验和不一致,则数据传输一定有误

    如何保证不乱序、不重复、不丢包

    累积确认(ACK)和序列号(seq)

    在进行TCP传输时,根据字节对报文段进行编号,作为头部seq字段的值

    每次接收方收到数据后,都会返回确认应答,若返回ACK(n),则说明序列号小于n的报文段都已经被成功接收,并表示期望下一个报文段的序列号为n

    同时,接收方可以根据序列号对报文段进行排序,去除具有相同序列号的数据

    超时重传

    发送方在发送完数据后,若在设定的时间内没有收到ACK应答,就重新发送刚刚的数据

    (若发送方收到的ACK最大值为n,则从序列号为n的数据开始 进行重新传输)

    流量控制

    如果发送方的发送速度太快,可能会导致接收方的接收缓冲区很快被填满

    之后到达接收方的数据都会丢包,这样就会引起大量的超时重传

    因此,在TCP报文段的头部维护一个名为“Receive Window”的字段

    用于表示接收方的接收缓冲区的剩余大小

    接收方在返回ACK应答时,将自己的即时窗口大小填入,连同ACK报文一起发送过去

    发送方根据窗口大小的值,调整自己的发送速度

    如果发送方收到ACK后,发现Receive Window值为0,就会停止发送数据

    并定期向接收方发送窗口探测数据段,询问接收方的窗口大小

    拥塞控制

    如果在网络拥堵的情况下,发送方仍然发送大量数据,就会加剧网络的拥堵,造成大量的丢包

    因此,TCP引入了慢启动的机制

    发送方维护一个拥塞窗口(cwnd),用于限制发送速率(cwnd越大,每次可发送的数据量越大)

    刚开始传输时,让cwnd从1个MSS开始,以指数级的速度增长

    同时设定一个阈值,当cwnd超过阈值时,转变为线性增长

    还有以下2种情况会马上调整cwnd的大小

    1. 发送方接收到3个冗余的ACK(n):设定阈值为当前cwnd的一半,进入快速恢复模式(快速重传序列号大于等于n的数据)
    2. 发送方等待ACK超时:说明网络严重拥堵,设定阈值为当前cwnd的一半,并重新开始慢启动
  • 相关阅读:
    Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是不可缺少的!
    java基础——static keyword小节
    iOS UI08_UITableView
    Android 6.0 开发人员对系统权限的使用与练习(Permissions Best Practices)
    Android简单实现BroadCastReceiver广播机制
    UI组件之TextView及其子类(一)TextView和EditText
    BZOJ 3112 [Zjoi2013]防守战线 线性规划
    反射 + 配置文件 实现IOC容器
    android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
    【LeetCode-面试算法经典-Java实现】【058-Length of Last Word (最后一个单词的长度)】
  • 原文地址:https://www.cnblogs.com/baebae996/p/13936590.html
Copyright © 2011-2022 走看看