计网—TCP重传、滑动窗口

news/2024/5/18 13:01:24 标签: tcp/ip, 网络, udp

一、TCP如何保证可靠传输

  • 确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。
  • 序号机制(序号、确认号):确保了数据是按序、完整到达。
  • 数据校验:TCP报文头有校验和,用于校验报文是否损坏。
  • 数据合理分片和排序tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报(可以延伸到IP层的路径MTU发现)。
  • 流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。
  • 拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。

二、TCP重传

首先说下常见的四种重传机制

超时重传        快速重传        SACK        D-SACK

1、超时重传

        在发送数据时,设一个定时器,超过一定时间未收到确认,就重发该数据,这就是超时重传 

        有两种情况会发生超时重传,分别是发送的数据包的丢失和确认报文丢失

        超时重传(RTO)是有讲究的,RTT是报文往返时间,首先RTO毋庸置疑一定要大于RTT,具体这两个是什么关系呢,可以自行搜搜,按照比例来计算。

2、快速重传

        超时重传是以时间为标准,而快速重传是以数据为标准。快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。一般来说连续收到三个相同的ACK的时间还是比RTO少的,所以相对超时重传,这完全可以称得上快速重传哈哈。

        但是这种快速重传的方式还是有问题的,连续收到三次相同ACK,是重传一个,还是重传所有的问题。

3、SACK(Selective Acknowledgment)

        TCP 头部选项字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。

4、Duplicate SACK

         主要使用了 SACK 来告诉发送方有哪些数据被重复接收了

三、滑动窗口

1、滑动窗口介绍       

        TCP为每个数据包都单独设置确认应答的话,包往返时间越长,网络的吞吐量就越小,网路利用率就越低。

        为解决这个问题,故TCP引入窗口这个概念。(其实跟http1.1的pipeline技术某种层面上差不多,都是为了提高效率,把一个个单独的确认应答,换成一连串的发送与应答)。

        滑动窗口的大小就是就是指无需等待确认应答,而可以继续发送数据的最大值。

通常窗口的大小由接受端确定,每次接收端发送ACK报文,会在TCP报文的窗口字段上填入自己的接收窗口值,然后发送端会取min(拥塞窗口,接收端窗口)作为自己的窗口大小。 

 2、发送端与接收端的滑动窗口构成

发送端滑动窗口  

        已发送且被确认部分 | 已发送未被确认部分 | 未发送但可发送部分 | 不可发送部分

        其中发送窗 = 已发送未确认部分 + 未发但可发送部分。

        

//具体深入到Linux,参数意义
SND.WND:表示发送窗口的大小(大小是由接收方指定的);

SND.UNA(Send Unacknoleged):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。

SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号。

接受端滑动窗口       

        已接收 | 未接收但准备接收 | 未接收不准备接收

        接收窗 = 未接收但准备接收部分。

//参数意义
RCV.WND:表示接收窗口的大小,它会通告给发送方。
RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号。

       发送窗内数据只有当接收到接收端某段发送数据的ACK响应时才移动发送窗,左边缘紧贴刚被确认的数据。接收窗也只有接收到数据且最左侧连续时才移动接收窗口。


http://www.niftyadmin.cn/n/259298.html

相关文章

BCSP-玄子前端开发之JavaScript+jQuery入门CH05_DOM应用

BCSP-玄子前端开发之JavaScriptjQuery入门CH05_DOM应用 4.5 操作节点 4.5.1 操作节点的属性 获取节点属性 节点元素.getAttribute("属性名")设置节点属性 节点元素.setAttribute("属性名", "属性值")使用getAttribute()方法获取属性值时&am…

【马蹄集】第八周作业

第八周作业 目录 MT2016 数据流的中位数MT2017 连续的串MT2027 一秒成零MT2033 碰碰车MT2036 移水造海 MT2016 数据流的中位数 难度:黄金  时间限制:1秒  占用内存:128M 题目描述 对于数据流问题,小码哥需要设计一个在线系统&…

搜索引擎找外贸客户

说起搜索引擎,我们每个人都不陌生,也许第一时间就能想到平日经常使用的“百度一下”和凭借强大算法及丰富功能占据近85%市场份额的谷歌搜索(Statista 2023年1月数据)这些耳熟能详的搜索引擎。对于外贸人而言搜索引擎也是非常实用的…

Linux command(chmod)

命令说明 "chmod"是一个Linux/Unix操作系统中常用的命令,用于更改文件或目录的访问权限。它允许用户设置哪些用户可以读取、写入和执行特定文件或目录。"chmod"命令可以通过数字或符号来表示权限,数字表示法使用3个数字位来表示所有…

Unity设计模式—命令队列

Unity设计模式—命令队列 概要 本篇将介绍命令队列并用命令队列模式实现一个Unity里的WindowManager。 命令队列是一个按照FIFO顺序存储一系列通知或请求的队列。发出通知时系统会将请求置入队列并立即返回,请求处理器随后从命令队列中获取并处理这些请求。请求可由…

可视化电子标签在仓储管理上的应用

随着经济快速增长和激烈的国内外市场竞争,要求企业运作的每个环节反应要迅速,经济转型要求更趋向改善工作流程、提高作业效率、减低运作成本、增加企业效益成为当务之急。虽然许多企业都有实施库存管理系统,但系统主要以人工盘点和走单据流程…

详解C语言string.h中常用的14个库函数(二)

本篇博客继续讲解string.h中的库函数。在上一篇博客中,我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数,本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。 strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数&a…

Linux网络——NFS共享服务

Linux网络——NFS共享服务 一、NFS共享服务1.NFS网络文件系统2.NFS 架构3.NFS 工作原理4.NFS相关配置文件及其配置作用 二、搭建NFS服务1.服务器安装 nfs-utils、rpcbind 软件包2.服务器启动nfs-utils、rpcbind服务,并设置共享目录3.服务端更改NFS配置,对…