深度思考计算机网络面经之三

news/2024/5/20 6:06:47 标签: 计算机网络, 网络, 滑动窗口

# 网络>计算机网络

.1 说说你对tcp滑动窗口的理解

TCP 滑动窗口是 TCP 协议流量控制的一个重要机制。它的主要目的是确保发送方不会因为发送太多数据而使接收方不堪重负。下面我会详细地描述滑动窗口的概念:

  1. 窗口的大小

    • 滑动窗口的大小(以字节为单位)表示发送方在等待确认之前可以发送的最大数据量。
    • 该大小可以是固定的,但在现代的 TCP 实现中,它是动态变化的,这种机制称为拥塞控制。
  2. 发送窗口与接收窗口

    • 发送方维持一个发送窗口,而接收方维持一个接收窗口。
    • 发送窗口大小决定了发送方可以发送多少数据,在接收到确认之前不需要等待。
    • 接收窗口大小告诉发送方接收方还能接受多少数据。
  3. 滑动的概念

    • 当发送方发送了一些数据并收到其确认后,窗口“滑动”前进,使得更多的数据可以被发送。
    • 这个“滑动”的概念意味着,与其说窗口的大小是变化的,不如说窗口的起始和结束点是变化的。
  4. 数据流与确认

    • 当发送方发送了数据包,它会等待接收方的确认。如果在一个特定的超时时间内未收到确认,发送方会重新发送该数据包。
    • 当接收方确认数据包,它实际上是确认了到目前为止已收到的所有连续数据包。
  5. 拥塞控制

    • TCP 使用滑动窗口的概念来处理网络拥塞。
    • 如果网络出现拥塞(例如,由于数据包丢失),发送方将减小其窗口大小,从而减少发送的数据量。当网络条件改善时,窗口大小将逐渐增大。
  6. 窗口大小的通告

    • 在 TCP 头部有一个字段叫做窗口大小(Window Size),接收方用这个字段通告其当前的接收窗口大小。

总的来说,TCP 的滑动窗口协议是一种允许发送方和接收方之间有动态的、自适应的数据流量控制的机制。这种机制确保了高效的数据传输,同时防止了网络的过度拥塞。

.1.1 GBN和SR的区别

对,你指出的确实是对的。我之前的描述更偏向了 Go-Back-N (GBN) 滑动窗口协议的特点。

确实,除了 GBN,还有一个叫做选择重传 (Selective Repeat, SR) 的滑动窗口策略。

  1. Go-Back-N (GBN):

    • 当发送方在等待确认时,它可以连续发送多个数据包,但有一个限制,即这些数据包的数量不超过窗口的大小。
    • 如果发送方没有在超时时间内收到某个数据包的确认,它会重新发送该数据包及其后面的所有数据包,即使它们可能已经被接收方正确接收。
    • 接收方只发送下一个期望的数据包序号作为确认,它不会缓存或确认后面的任何乱序的数据包。
  2. 选择重传 (Selective Repeat, SR):

    • 与 GBN 不同,SR 允许接收方接收乱序的数据包,并缓存它们。
    • 如果接收方没有收到预期的数据包,它会等待,因为它预期可能会迟些时候收到。
    • 发送方为每个发送的数据包设置单独的计时器。如果某个数据包的计时器到期但该数据包还没有被确认,只有该数据包会被重新发送,而不是像 GBN 那样重新发送一系列数据包。
    • 接收方对每个独立接收的数据包都发送确认。

感谢你指出这一点,这两种策略确实在处理数据流与确认方面有所不同。

.1.2 滑动窗口,滑动的是发送方和接收方两方吧?在GBN协议下,发送方的窗口怎么滑,接收方呢?在SR协议下,发送方的窗口怎么滑,接收方呢?

确实,滑动窗口协议在发送方和接收方都有窗口,这两个窗口都会进行“滑动”。以下是详细解释:

  1. Go-Back-N (GBN):

    • 发送方:
      • 当发送方收到数据包的 ACK(确认)时,它知道该数据包及之前的所有数据包都已经被接收方正确接收了。
      • 窗口会根据收到的确认滑动。例如,如果窗口大小是 4,发送方发送了数据包 1、2、3、4,然后收到了数据包 2 的确认,那么窗口会滑动,使得发送方可以发送数据包 5(假设窗口始终为连续的四个数据包,滑动后的窗口现在覆盖数据包 3、4、5、6)。
    • 接收方:
      • 在 GBN 中,接收方的窗口大小通常为 1,这意味着接收方一次只期望接收一个数据包,即当前期望的数据包序号。
      • 如果接收方收到了期望的数据包,它会发送一个确认,并期望下一个数据包。如果收到了乱序的数据包,它通常会丢弃并重新发送上次的确认。
  2. 选择重传 (Selective Repeat, SR):

    • 发送方:
      • 发送方有一个更复杂的滑动窗口。当发送方收到一个特定数据包的确认时,它知道该数据包已被正确接收。
      • 这允许发送方只对尚未被确认的数据包进行超时重传,而不是像 GBN 那样重新发送所有的数据包。
      • 当发送方接收到一个数据包的 ACK 时,它会更新其窗口,但这不像 GBN 中那样总是线性滑动。窗口会根据已确认的数据包进行“滑动”。
    • 接收方:
      • 接收方的窗口与 GBN 不同,因为它可以缓存乱序接收的数据包。
      • 接收方会对每个正确接收的数据包发送确认。
      • 如果接收方的窗口内所有数据包都已接收并确认,那么窗口会滑动到下一个尚未接收的数据包。

总结:在滑动窗口协议中,确实有两个窗口:一个在发送方,一个在接收方。这两个窗口都会“滑动”,但它们的滑动方式和逻辑取决于正在使用的协议版本(GBN 还是 SR)。

.1.3 详细描述一下SR的滑动方式

在 SR 协议中,当发送方收到某个数据包的 ACK 时,窗口的滑动仍然是线性的,但其复杂性来自于如何处理窗口内的数据包。

让我更详细地解释 SR 协议下发送方窗口的滑动方式:

在 SR 协议中,发送方的窗口确实是线性滑动的,但与 GBN 不同的是,SR 的发送方会维护一个缓冲区,记录窗口内每个数据包的状态(是否已确认)。

例如,如果滑动窗口大小为 4,且初始包含数据包序号 1、2、3、4。发送方发送了这四个数据包,但只收到了数据包 2 和 4 的 ACK。

在此情况下,数据包 1 和 3 仍未被确认,但数据包 2 和 4 已被确认。

窗口的滑动将基于最早的、尚未确认的数据包。因此,虽然数据包 2 和 4 已经被确认,但窗口不会滑动,因为数据包 1 尚未得到确认。

只有当数据包 1 和 3 都收到 ACK 时,窗口才会滑动,使下一个未确认的数据包(在此例中为数据包 5)进入窗口。

所以,虽然 SR 的发送方窗口的滑动是线性的,但滑动的时机取决于窗口内最早的、尚未确认的数据包是否已得到确认。

2.1.4 发送方发送数据的时候,会综合考量发送窗口、接收窗口以及拥塞窗口的大小对吧,取其中的最小值

对,你说得对。

在实际的 TCP 流量控制中,发送方会考虑以下三个窗口的大小来决定实际可以发送的数据量:

  1. 发送窗口(Send Window): 这是发送方根据自身的缓冲区和处理能力设定的最大发送数据量。

  2. 接收窗口(Receive Window): 这是接收方告诉发送方的值,表示接收方还能接受多少数据。这个值经常在 TCP 头部的窗口大小字段(Window Size field)中发送给发送方,反映了接收方当前的接收能力和其缓冲区的可用空间。

  3. 拥塞窗口(Congestion Window): 这是发送方根据网络状况(主要是网络拥塞)动态调整的一个值。它表示在当前网络状况下发送方认为可以发送的数据量。

当发送方准备发送数据时,实际可以发送的数据量是上述三个窗口大小中的最小值。

这种机制确保了:

  1. 发送方不会因为发送太多数据而超出自己的处理能力。
  2. 接收方不会因为接收到太多数据而超出其处理能力或缓冲区大小。
  3. 由于网络拥塞,数据不会在网络中积累,导致数据包丢失率增加。

因此,确实是取这三个窗口大小的最小值作为实际可以发送的数据量。

.2 如果没有使用滑动窗口退化成什么了

如果没有使用滑动窗口协议,那么数据通信可能会退化成一个简单的停-等 (Stop-and-Wait) 协议。在这种协议中,以下是典型的数据通信特点:

  1. 单一数据包传输:发送方一次只发送一个数据包,然后停止发送并等待接收方的确认。

  2. 高延迟:因为发送方在发送一个数据包后必须等待确认,所以如果网络的往返时间 (Round-Trip Time, RTT) 很长,那么这种协议的效率会很低。

  3. 低吞吐量:由于同时只有一个数据包在传输,所以网络的带宽利用率通常会很低,尤其是在高带宽或高延迟的网络中。

  4. 简单性:虽然停-等协议效率低,但它相对简单。不需要维护复杂的缓冲区或窗口状态,只需要跟踪最后一个已发送或已确认的数据包。

在实际应用中,尽管停-等协议简单,但其效率问题使得它在许多情境中不适用。滑动窗口协议,如 TCP 中的实现,更能有效地利用网络带宽,提供更好的吞吐量和响应时间。


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

相关文章

【操作系统】聊聊进程间通信方式

作为操作系统软件治理的核心 进程,那么进程间通信的方式就非常重要,常见的比如管道、消息队列、共享内存、信号量、信号、Socket等。本篇主要简单介绍下 我们知道每个进程都有自己独立的用户空间,而内核空间是共享的。 管道 ps -ef | gre…

Shell借助curl调用接口结合Python解析Python案例

需求说明: 实现通过shell调用接口,并实现json的解析。 解决方法: 本案例按照两步来实现: 1、借助curl命令调用接口,上传本地json文件 2、对json文件利用python进行解析,生成结构化文本 Step1&#xff…

STM32 Cubemx 通用定时器 General-Purpose Timers同步

文章目录 前言简介cubemx配置 前言 持续学习stm32中… 简介 通用定时器是一个16位的计数器,支持向上up、向下down与中心对称up-down三种模式。可以用于测量信号脉宽(输入捕捉),输出一定的波形(比较输出与PWM输出&am…

Mysql---第七篇

系列文章目录 文章目录 系列文章目录一、简述MyISAM和InnoDB的区别二、简述mysql中索引类型及对数据库的性能的影响一、简述MyISAM和InnoDB的区别 MyISAM: 不支持事务,但是每次查询都是原子的; 支持表级锁,即每次操作是对整个表加锁; 存储表的总行数; 一个MYISAM表有三个…

Andi:具有酷炫设计和功能的 AI 搜索引擎

【产品介绍】 • 名称 Andi • 具体描述 Andi是一个人工智能搜索聊天机器人,准确,无广告,专注于隐私。它使用一种新型的搜索 引擎,由生成式人工智能结合实时数据和语义搜索技术提供…

【面试刷题】——C++的特点简单说明

C是一种通用的编程语言,具有许多强大的特点,以下是其中一些主要特点的简单说明: 面向对象编程(OOP): C支持面向对象编程,允许将数据和操作封装在类中,提高了代码的可维护性和重用性…

数据结构--------排序方法

数据结构的排序方法有多种,这些方法可以根据不同的性能要求和数据特点选择。 冒泡排序(Bubble Sort):通过比较相邻元素并交换它们,将最大(或最小)的元素逐渐“冒泡”到最后(或最前&a…

简明 SQL 子查询指南:掌握 EXISTS 实现数据筛选

子查询是一种在查询语句内部嵌套另一个完整查询的方式,用于获取更复杂的查询结果或数据过滤。在执行包含子查询的查询时,数据库引擎首先执行子查询,然后将其结果用作外层查询的条件或数据源。 以下两表作为后续SQL语句所用 table1 …