【2024秋招】2023-9-14 最右后端开发线下一面

1 自我介绍

2 计算机网络

2.1 说说你对tcp滑动窗口的理解

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

  1. 窗口的大小

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

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

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

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

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

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

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

2.1.1 GBN和SR的区别

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

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

  1. Go-Back-N (GBN):

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

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

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

2.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)。

2.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.2 如果没有使用滑动窗口退化成什么了

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

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

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

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

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

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

3 mysql

3.1 select * from user where name=“XXX” and age > 10会怎么走联合索引(name,age)

4 数据结构

4.1 lc 三数之和等于0

5 操作系统

5.1 select,poll和epoll的区别你了解吗?

一文搞懂select、poll和epoll区别

5.2 LT和ET的特点决定了他们的名字嘛?为什么这么叫?

确实,EPOLL LTEPOLL ET 中的 LTET 分别代表 “Level Triggered” 和 “Edge Triggered”,这些名称直接反映了它们的工作方式。

  1. Level Triggered (LT) - 水平触发:

    • 如其名,这是基于“级别”或者说“状态”的触发模式。
    • 只要满足某个条件(例如文件描述符上有数据可读),就会触发通知,无论之前是否已经通知过。
    • 因此,在某些情况下,如果应用程序没有完全处理掉事件,epoll_wait 可能会连续多次返回该事件。这就是为什么它被称为“水平”的原因,因为只要达到某个“水平”或状态,就会触发通知。
  2. Edge Triggered (ET) - 边缘触发:

    • 这是基于“变化”或“边缘”的触发模式。
    • 只有当从上一次事件后文件描述符的状态发生变化(例如从没有数据可读变为有数据可读)时,才会触发通知。
    • 这意味着如果你被通知一次,除非状态发生了改变,否则你不会再次被通知。这就是为什么它被称为“边缘”的原因,因为它依赖于状态的“边缘”或变化。

这两种模式的选择取决于应用程序的需求和预期的使用模式。水平触发可能更加直观和易于使用,但可能会导致重复通知。而边缘触发更加高效,但需要应用程序更加小心地确保处理了所有事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/115915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node编写用户登录接口

目录 前言 服务器 编写登录接口API 使用sql语句查询数据库中是否有该用户 判断密码是否正确 生成JWT的Token字符串 配置解析token的中间件 配置捕获错误中间件 完整的登录接口代码 前言 本文介绍如何使用node编写登录接口以及解密生成token,如何编写注册接…

关于 硬盘

关于 硬盘 1. 机械硬盘1.1 基本概念1.2 工作原理1.3 寻址方式1.4 磁盘磁记录方式 2. 固态硬盘2.1 基本概念2.2 工作原理 1. 机械硬盘 1.1 基本概念 机械硬盘即是传统普通硬盘,硬盘的物理结构一般由磁头与盘片、电动机、主控芯片与排线等部件组成。 所有的数据都是…

利用dns协议发起ddos反射攻击

利用DNS服务器发起反射型DDOS,攻击带宽 基本思路: 1、利用any类型的dns查询,可完成发送少量请求数据,获得大量返回数据。 2、将原请求地址改为受害者地址,则dns会向受害者返回大量数据,占用带宽 警告&…

c# ManualResetEvent WaitHandle 实现同步

//本文演示了ManualResetEvent 类的非静态set()、Reset()、WaitOne()和 //WaitHandle类的静态方法WaitAllWaitAll() //它们用于线程间的同步控制。 //实现了如下功能:线程1(定时控制)通知线程2和线程3采集数据 //线程2和3数据采集完了&am…

QCC 音频输入输出

QCC 音频输入输出 QCC蓝牙芯片(QCC3040 QCC3083 QCC3084 QCC5181 等等)支持DAC、I2S、SPDIF输出,AUX、I2S、SPDIF、A2DP 输入 蓝牙音频输入,模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 输入方式切换参考 sta…

POJ 3470 Walls 树上分桶

今天太晚了&#xff0c;代码先发上&#xff0c;思路明天说吧。 陌上花开&#xff0c;树上分桶 #include <iostream> #include <algorithm> #include <vector> using namespace std; /*** 对于y1不等于y2的&#xff0c;可以用datC求解&#xff0c;对于x1不等…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (一)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 梳理 AD9371 时钟&#xff0c;理解采样率和各个时钟之间的关系 …

linux nginx1.24.0安装

nginx高性能web服务器&#xff0c;可作为一般http应用转发&#xff0c;也可以做mySql、redis、zk、rabbit MQ等tcp数据流转发。 常用Linux服务系统centos和ububtu 只是安装命令不同 yum/apt-get&#xff0c;流程和依赖包是一样的安装方式 1、下载nginx安装包tar.gz官方下载地…

RabbitMQ基础篇 笔记

RabbitMQ 余额支付 同步调用 一步一步的来&#xff0c;支付业务写完后&#xff0c;如果之后加需求&#xff0c;还需要增加代码&#xff0c;不符合开闭原则。 性能上也有问题&#xff0c;openfeign是同步调用&#xff0c;性能太差。 同步调用耦合太多。 同步的优势是可以立…

网站、小程序常见布局样式记录

文章目录 &#x1f380;前言&#xff1a;&#x1f415;网页样式展示小程序&#xff1a;《携程网》&#x1f380;持续更新... &#x1f380;前言&#xff1a; 本篇博客会收藏一些作者见到的网页、小程序页面&#xff0c;目的是用来寻找制作项目网页页面的灵感&#xff0c;有需要…

mysql第一篇---索引

文章目录 mysql第一篇---索引索引的数据结构为什么使用索引&#xff1f;索引的及其优缺点InnoDB中索引的推演常见的索引概念InnoDB的B树索引的注意事项MyISAM中索引方案索引的代价MySQL数据结构选择的合理性 mysql第一篇—索引 索引的数据结构 为什么使用索引&#xff1f; 索…

修炼k8s+flink+hdfs+dlink(六:学习k8s-pod)

一&#xff1a;增&#xff08;创建&#xff09;。 直接进行创建。 kubectl run nginx --imagenginx使用yaml清单方式进行创建。 直接创建方式&#xff0c;并建立pod。 kubectl create deployment my-nginx-deployment --imagenginx:latest 先创建employment&#xff0c;不…

华为OD 高效的任务规划(200分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…

紫光展锐携中国联通完成RedCap芯片V517孵化测试

近日&#xff0c;紫光展锐携手中国联通5G物联网OPENLAB开放实验室&#xff08;简称“OPENLAB实验室”&#xff09;共同完成RedCap芯片V517创新孵化&#xff0c;并实现在联通5G全频段3.5GHz、2.1GHz、900MHz下的端到端业务验证测试。 V517是一款基于紫光展锐5G成熟平台设计与研发…

oninput和onchange事件有什么区别以及使用场景

oninput和onchange都是常见的表单元素的事件&#xff0c;它们的区别在于触发的时机不同。 oninput事件会在表单元素的值发生变化时立刻触发&#xff0c;无论是通过键盘输入、粘贴、剪切、拖拽等方式&#xff0c;都能实时响应。比如&#xff1a; <input type"text&quo…

Java反射实体组装SQL

之前在LIS.Core定义了实体特性&#xff0c;在LIS.Model给实体类加了表特性&#xff0c;属性特性&#xff0c;外键特性等。ORM要实现增删改查和查带外键的父表信息就需要解析Model的特性和实体信息组装SQL来供数据库驱动实现增删改查功能。 实现实体得到SQL的工具类&#xff0c…

DOS攻击-ftp_fuzz.py

搭建FTP 使用AlphaFuzzer的FTPFUSS进行攻击 挖掘漏洞&#xff0c;自动用特殊字符看能不能把服务器崩掉 这些都是测试的目录 不能随意使用&#xff0c;可能会把C盘内容清掉 也可以自己写脚本测试下

二叉排序树(BST)

二叉排序树 基本介绍 二叉排序树创建和遍历 class Node:"""创建 Node 节点"""value: int 0left Noneright Nonedef __init__(self, value: int):self.value valuedef add(self, node):"""添加节点node 表示要添加的节点&quo…

使用CMakeLists.txt简化项目构建过程

在软件开发过程中&#xff0c;项目的构建是一个不可避免的环节。而随着项目规模的增大&#xff0c;手动管理编译过程变得越来越繁琐。为了简化构建流程并实现跨平台支持&#xff0c;CMake作为一种流行的构建系统被广泛采用。本文将介绍CMakeLists.txt文件的结构&#xff0c;以及…

读书笔记:Effective C++ 2.0 版,条款28(namespace )

条款28: 划分全局名字空间 namespace 作为前缀&#xff0c;防止不同名字域的类型、常量等互相污染。 没命名的名字空间一般用于限制名字空间内部元素的可见性。 namespace sdm {const double book_version 2.0;class handle { ... };handle& gethandle(); }早期用struct模…