• TCP和UDP TCP如何保证可靠数据传输的


    TCP和UDP

    网络层解决了计算机到计算机之间的通信问题,传输层协议通过加入端口号,来实现每台机器上的不同进程之间的通信。

    TCP的可靠数据传输

    TCP 的可靠数据传输服务确保数据在传输中是完整且按序的

    需要解决的问题

    • 乱序 序号seq
      接收方接收到多个报文后,可以基于seq多数据包进行升序排序,并且通过检查seq的值,可以判断接收的数据是否有间隔,以及数据是否是有序的。
      接收方可以根据seq判断出该数据包是不是已经被接收了,这样顺带还解决了数据冗余的问题
    • 丢包
      • 确认号ack+超时/重传
      • 拥塞控制 解决网络延时突然增加,触发大量的数据重传,导致网络负担加重问题
      • 流量控制 当接收方来不及处理发送方数据时,提示发送方降低发送的速率,防止包丢失

    序号 和 确认号

    TCP协议面向字节流,为每个字节都编上序号。在发送时多个字节组成报文段发送。
    序号seq字段 指的是一个报文段第一个子节的序号
    确认号ack字段 指的是希望收到的下一个报文段的第一个字节的序号
    在这里插入图片描述

    TCP提供全双工通信:

    • 发送缓存: 准备发送的数据&已经发送但没有收到确认的数据
    • 接受缓存:按序到达但没有被应用程序读取的数据 & 没有按需到达的数据

    TCP默认使用累计确认
    只会返回应该按序接受的报文段第一个字节的序号
    在这里插入图片描述
    累计确认可以让我们同时对多个接受的报文进行一次确认
    在这里插入图片描述

    重传

    超时+重传
    发送方发送一个未被确认的数据包后就启动一个计时器,如果在指定时间内没有收到ACK, 发送方可以重传该报文

    存在问题:等待时间太长

    冗余确认(冗余ACK) 提前知道数据丢失-快速重传

    每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号。

    TCP发送方一次性可以发送多个报文段,接收方使用累计确认
    在这里插入图片描述

    TCP流量控制

    流量控制:让发送方慢点,要让接收方来得及接受
    TCP利用滑动窗口机制实现流量控制

    控制方:接收方
    被控制方:发送方

    原理
    在通信过程中,接收方根据自己接受缓存的大小,通过设置确认报文段的窗口字段来将rwnd(接受窗口)通知给发送方,发送方的发送窗口取接受窗口rwnd和拥塞窗口cwnd的最小值

    • 接受窗口:接收方根据接受缓存设置的指,并告知给发送方,反映接收方容量
    • 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前的容量

    TCP拥塞控制

    拥塞控制的目的:防止过多的数据注入到网络中,全局性。

    四种算法

    • 慢开始+拥塞避免
    • 快重传 + 快恢复

    慢开始 + 拥塞避免

    假定
    1.数据单方向传送,而另一个方向只传送确认
    2.接收方总是有足够大的缓存空间,发送窗口 = Min(接收窗口rwnd,拥塞窗口cwnd),所以发送窗口的大小取决于拥塞程度

    一个传输轮次:发送一批报文段并收到他们的确认时间 = 一个往返时延RTT
    在这里插入图片描述
    1.先试探网络情况,拥塞窗口/发送窗口指数增加。
    2.到了初始的阈值后,发现网络有点堵,为了避免拥塞,拥塞窗口/发送窗口加法增加。
    3.出现丢包现象,发现网络堵塞,新阈值 = 当前的拥塞窗口值/2,然后将当前的拥塞窗口值改为初始值1,重复步骤1、2

    快重传 + 快恢复

    假定
    1.数据单方向传送,而另一个方向只传送确认
    2.接收方总是有足够大的缓存空间,发送窗口 = Min(接收窗口rwnd,拥塞窗口cwnd),所以发送窗口的大小取决于拥塞程度

    在这里插入图片描述

    快重传:收到3个重复的确认执行快重传算法
    快恢复:在步骤3,将当前窗口值改成新阈值,然后直接加法增大

    UDP如何改进实现可靠传输

    这个问题是我在面经上看见的,很少考,感觉能说上几句就行了

    UDP本身是无法确保数据的可靠传输的,所以不能在传输层进行改进。
    实现的方式可以参考HTTP3的QUIC(快速UDP互联网连接)协议,该协议在 UDP 的基础之上增加了一层来保证数据可靠性传输,它提供了数据包重传拥塞控制以及其他一些 TCP 中存在的特性。

    UDP和TCP的区别

    区别TCPUDP
    首部开销20B8B
    传输TCP协议面向字节流,为每个字节都编上序号
    在发送时多个子节组成报文段发送。
    面向报文,不对报文拆分,加入UDP首部直接传输
    连接面向连接无连接
    是否可靠传输是,提供流量控制和拥塞控制否,不使用流量控制和拥塞控制
    速度
    通信双方单播传输可以单播,多播,广播
    使用场景适合于要求可靠传输的应用,比如文件传输适用于实时应用,比如IP电话、视频会议等

    UDP与TCP的首部格式
    UDP的首部格式
    在这里插入图片描述
    TCP的首部格式
    在这里插入图片描述

    紧急位URG:URG=1,标明此报文段中有紧急数据,是高优先级的数据,应该尽快传送,不用在缓存里排队,配合紧急指针字段使用。
    确认位ACK:ACK=1时确认号有效,在连接建立后所有的传输的报文段都必须把ACK置为1
    同步位SYN:SYN=1时,表明是一个连接请求/请求接受报文
    终止位FIN:FIN=1时表明此报文段发送方数据已发送完,要求释放连接。

  • 相关阅读:
    Spring Cloud Gateway快速入门(一)——网关简介
    C Primer Plus(6) 中文版 第6章 C控制语句:循环 6.2 while语句
    除六价铬工艺
    工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计
    前端canvas项目实战——在线图文编辑器(九):逻辑画布
    OpenCL专题04:ViennaCL与Eigen双剑合璧
    基于thinkphp校园二手交易网站#毕业设计
    物联网AI MicroPython传感器学习 之 TEA5767 FM收音机模块
    Python 中的 round() 函数:实现精确的数值舍入操作
    华为云云耀云服务器L实例评测|基于宝塔部署SpringBoot后端+前端工程
  • 原文地址:https://blog.csdn.net/qq_41370833/article/details/125416487