【2024秋招】2023-9-14 最右后端开发线下一面
1 自我介绍
2 计算机网络
2.1 说说你对tcp滑动窗口的理解
TCP 滑动窗口是 TCP 协议流量控制的一个重要机制。它的主要目的是确保发送方不会因为发送太多数据而使接收方不堪重负。下面我会详细地描述滑动窗口的概念:
-
窗口的大小:
- 滑动窗口的大小(以字节为单位)表示发送方在等待确认之前可以发送的最大数据量。
- 该大小可以是固定的,但在现代的 TCP 实现中,它是动态变化的,这种机制称为拥塞控制。
-
发送窗口与接收窗口:
- 发送方维持一个发送窗口,而接收方维持一个接收窗口。
- 发送窗口大小决定了发送方可以发送多少数据,在接收到确认之前不需要等待。
- 接收窗口大小告诉发送方接收方还能接受多少数据。
-
滑动的概念:
- 当发送方发送了一些数据并收到其确认后,窗口“滑动”前进,使得更多的数据可以被发送。
- 这个“滑动”的概念意味着,与其说窗口的大小是变化的,不如说窗口的起始和结束点是变化的。
-
数据流与确认:
- 当发送方发送了数据包,它会等待接收方的确认。如果在一个特定的超时时间内未收到确认,发送方会重新发送该数据包。
- 当接收方确认数据包,它实际上是确认了到目前为止已收到的所有连续数据包。
-
拥塞控制:
- TCP 使用滑动窗口的概念来处理网络拥塞。
- 如果网络出现拥塞(例如,由于数据包丢失),发送方将减小其窗口大小,从而减少发送的数据量。当网络条件改善时,窗口大小将逐渐增大。
-
窗口大小的通告:
- 在 TCP 头部有一个字段叫做窗口大小(Window Size),接收方用这个字段通告其当前的接收窗口大小。
总的来说,TCP 的滑动窗口协议是一种允许发送方和接收方之间有动态的、自适应的数据流量控制的机制。这种机制确保了高效的数据传输,同时防止了网络的过度拥塞。
2.1.1 GBN和SR的区别
对,你指出的确实是对的。我之前的描述更偏向了 Go-Back-N (GBN) 滑动窗口协议的特点。
确实,除了 GBN,还有一个叫做选择重传 (Selective Repeat, SR) 的滑动窗口策略。
-
Go-Back-N (GBN):
- 当发送方在等待确认时,它可以连续发送多个数据包,但有一个限制,即这些数据包的数量不超过窗口的大小。
- 如果发送方没有在超时时间内收到某个数据包的确认,它会重新发送该数据包及其后面的所有数据包,即使它们可能已经被接收方正确接收。
- 接收方只发送下一个期望的数据包序号作为确认,它不会缓存或确认后面的任何乱序的数据包。
-
选择重传 (Selective Repeat, SR):
- 与 GBN 不同,SR 允许接收方接收乱序的数据包,并缓存它们。
- 如果接收方没有收到预期的数据包,它会等待,因为它预期可能会迟些时候收到。
- 发送方为每个发送的数据包设置单独的计时器。如果某个数据包的计时器到期但该数据包还没有被确认,只有该数据包会被重新发送,而不是像 GBN 那样重新发送一系列数据包。
- 接收方对每个独立接收的数据包都发送确认。
感谢你指出这一点,这两种策略确实在处理数据流与确认方面有所不同。
2.1.2 滑动窗口,滑动的是发送方和接收方两方吧?在GBN协议下,发送方的窗口怎么滑,接收方呢?在SR协议下,发送方的窗口怎么滑,接收方呢?
确实,滑动窗口协议在发送方和接收方都有窗口,这两个窗口都会进行“滑动”。以下是详细解释:
-
Go-Back-N (GBN):
- 发送方:
- 当发送方收到数据包的 ACK(确认)时,它知道该数据包及之前的所有数据包都已经被接收方正确接收了。
- 窗口会根据收到的确认滑动。例如,如果窗口大小是 4,发送方发送了数据包 1、2、3、4,然后收到了数据包 2 的确认,那么窗口会滑动,使得发送方可以发送数据包 5(假设窗口始终为连续的四个数据包,滑动后的窗口现在覆盖数据包 3、4、5、6)。
- 接收方:
- 在 GBN 中,接收方的窗口大小通常为 1,这意味着接收方一次只期望接收一个数据包,即当前期望的数据包序号。
- 如果接收方收到了期望的数据包,它会发送一个确认,并期望下一个数据包。如果收到了乱序的数据包,它通常会丢弃并重新发送上次的确认。
- 发送方:
-
选择重传 (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 流量控制中,发送方会考虑以下三个窗口的大小来决定实际可以发送的数据量:
-
发送窗口(Send Window): 这是发送方根据自身的缓冲区和处理能力设定的最大发送数据量。
-
接收窗口(Receive Window): 这是接收方告诉发送方的值,表示接收方还能接受多少数据。这个值经常在 TCP 头部的窗口大小字段(Window Size field)中发送给发送方,反映了接收方当前的接收能力和其缓冲区的可用空间。
-
拥塞窗口(Congestion Window): 这是发送方根据网络状况(主要是网络拥塞)动态调整的一个值。它表示在当前网络状况下发送方认为可以发送的数据量。
当发送方准备发送数据时,实际可以发送的数据量是上述三个窗口大小中的最小值。
这种机制确保了:
- 发送方不会因为发送太多数据而超出自己的处理能力。
- 接收方不会因为接收到太多数据而超出其处理能力或缓冲区大小。
- 由于网络拥塞,数据不会在网络中积累,导致数据包丢失率增加。
因此,确实是取这三个窗口大小的最小值作为实际可以发送的数据量。
2.2 如果没有使用滑动窗口退化成什么了
如果没有使用滑动窗口协议,那么数据通信可能会退化成一个简单的停-等 (Stop-and-Wait) 协议。在这种协议中,以下是典型的数据通信特点:
-
单一数据包传输:发送方一次只发送一个数据包,然后停止发送并等待接收方的确认。
-
高延迟:因为发送方在发送一个数据包后必须等待确认,所以如果网络的往返时间 (Round-Trip Time, RTT) 很长,那么这种协议的效率会很低。
-
低吞吐量:由于同时只有一个数据包在传输,所以网络的带宽利用率通常会很低,尤其是在高带宽或高延迟的网络中。
-
简单性:虽然停-等协议效率低,但它相对简单。不需要维护复杂的缓冲区或窗口状态,只需要跟踪最后一个已发送或已确认的数据包。
在实际应用中,尽管停-等协议简单,但其效率问题使得它在许多情境中不适用。滑动窗口协议,如 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 LT
和 EPOLL ET
中的 LT
和 ET
分别代表 “Level Triggered” 和 “Edge Triggered”,这些名称直接反映了它们的工作方式。
-
Level Triggered (LT) - 水平触发:
- 如其名,这是基于“级别”或者说“状态”的触发模式。
- 只要满足某个条件(例如文件描述符上有数据可读),就会触发通知,无论之前是否已经通知过。
- 因此,在某些情况下,如果应用程序没有完全处理掉事件,
epoll_wait
可能会连续多次返回该事件。这就是为什么它被称为“水平”的原因,因为只要达到某个“水平”或状态,就会触发通知。
-
Edge Triggered (ET) - 边缘触发:
- 这是基于“变化”或“边缘”的触发模式。
- 只有当从上一次事件后文件描述符的状态发生变化(例如从没有数据可读变为有数据可读)时,才会触发通知。
- 这意味着如果你被通知一次,除非状态发生了改变,否则你不会再次被通知。这就是为什么它被称为“边缘”的原因,因为它依赖于状态的“边缘”或变化。
这两种模式的选择取决于应用程序的需求和预期的使用模式。水平触发可能更加直观和易于使用,但可能会导致重复通知。而边缘触发更加高效,但需要应用程序更加小心地确保处理了所有事件。
相关文章:
【2024秋招】2023-9-14 最右后端开发线下一面
1 自我介绍 2 计算机网络 2.1 说说你对tcp滑动窗口的理解 TCP 滑动窗口是 TCP 协议流量控制的一个重要机制。它的主要目的是确保发送方不会因为发送太多数据而使接收方不堪重负。下面我会详细地描述滑动窗口的概念: 窗口的大小: 滑动窗口的大小&#…...

uniapp无感刷新token实现过程
路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token,…...

一步步掌握Java IO的奥秘:深入学习BIO、NIO,实现客户端与服务器通信
众所周知,Java IO是一个庞大的知识体系,很多人在学习的过程中会感到迷茫,甚至学得一头雾水,而我也曾有同样的困惑。因此,本文的目标是帮助大家一步一步深入学习Java IO,从BIO开始,然后引出JDK1.…...

MIT 生物信息课程
youtube链接 Regulatory Genomics (Lecture 07): 这门课程介绍了基因调控的概念,涉及到基因的开启和关闭。这是生物信息学中的一个核心概念,对于理解整个生物网络至关重要。 Deep Learning for Regulatory Genomics (Lecture 08): 在了解了基因调控的基…...

Windows下安装PyTorch(GPU版本)
PyTorch环境配置及安装 初步机器学习,这里记录下一些学习经过,之后以便于自己查看,同时欢迎各位大佬点评,本节是机器计算的一个包的安装和简单验证。 1.流程 确定自己的硬件信息-确定电脑有英伟达(NVIDIAÿ…...
力扣每日一题57:插入区间
题目描述: 给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 示例 1: 输入&#x…...

大河弯弯:CSS 文档流与三大元素显示模式
文章目录 参考环境文档流概念三大显示模式 内联元素概念常见的内联元素宽高由内容决定 块级元素概念常见的块级元素宽度受容器影响,高度受内容影响 内联块级元素概念常见的内联块级元素折中方案 设置元素的显示模式display 属性内联元素与块级元素的切换为什么要通过…...
第六章:函数(中)
函数的参数 1.位置参数 位置参数是指函数调用时,参数的位置与函数定义中参数的位置对应,从而确定参数的值。 def fight(x,y,z):return .join((z,y,x)) fight(八神庵,打败了...

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据
您是否正在寻找最好的 iPad 恢复软件,但不知道哪个选项最好?没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外,前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…...
【C++程序员必修第一课】C++基础课程-14:C++ 函数(上)
1 本课主要内容: 函数是什么?函数的声明、定义和调用;函数返回值,函数参数,参数默认值函数参数不同类型的调用方式:传值、指针、数组、常量引用、引用等 2 主要知识点: 函数是什么? …...

android studio打开flutter项目报红
一、android studio打开flutter项目报红,如下图: 二、解决方法: 2.1 在这个build.gradle添加以下代码,如图: 2.2 在build.gradle最顶部添加如下代码: def localProperties new Properties() def localPr…...

julia笔记:字符和字符串
1 字符 Char类型的值代表单个字符 ca #a: ASCII/Unicode U0061 (category Ll: Letter, lowercase)typeof(c) #Char 将 Char 转换为其对应的整数值,即 Unicode 代码 cInt(c) c #97typeof(c) #Int64 将一个整数值(Unicaode)转回 Char Cha…...
组合数(递推版)的初始化
初始考虑为将第一列数和斜对角线上的数进行初始化。 橙色方块由两个绿色方块相加而来,一个为1,一个为0,所以斜对角线都为1,可以通过计算得来,不需要初始化,需要与码蹄集盒子与球 第二类Stirling数…...

Apache JMeter 安装教程
下载: 注意事项:使用JMeter前需要配置JDK环境 下载地址 下载安装以后,打开安装的bin目录 D:\software\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin,找到jmeter.bat,双击打开 打开后的样子 语言设置: 1…...

【unity小技巧】实现无限滚动视图和类似CSGO的开箱抽奖功能及Content Size Fitter组件的使用介绍
文章目录 一篇一句前言素材一、无限滚动视图1. 绘制视图2. Content Size Fitter是布局控件(1)在文本框中使用(2)控制Scroll View(Scroll Rect组件)控件下Content的大小 3. 控制视图无限滚动4. 向右拉无限滚动5. 修复滚动视图一卡一…...

Mybatis的SqlRunner执行流程
Mybatis的SqlRunner执行流程 SqlRunner exec new SqlRunner(connection); Map<String, Object> row exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID ?", "FI-SW-01");connection.close();assertEquals("FI-SW-01", row.ge…...

Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例
Zookeeper、Kafka集群与FilebeatKafkaELK架构、部署实例 一、Zookeeper1.1、Zookeeper 定义1.2、Zookeeper 工作机制1.3、Zookeeper 特点1.4、Zookeeper 数据结构1.5、Zookeeper 应用场景1.5、Zookeeper 选举机制1.5.1、 第一次启动选举机制1.5.2、 非第一次启动选举机制 二、Z…...
leetcode做题笔记198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的…...
【编解码格式】DV
DV DV是指用于存储数位影片(英语:Digital video)的一种编解码器和录像带格式系列,由索尼和松下为首的摄像机制造商联盟于1995年推出。20世纪90年代末和21世纪初,DV与从模拟到数字的桌面式视频制作的过渡密切相关&…...
Flink之常用处理函数
常用处理函数 处理函数概述 基本处理函数ProcessFunction介绍使用示例 按键分区处理函数KeyedProcessFunction介绍定时器Timer和定时服务TimerService使用示例其他 窗口处理函数ProcessWindowFunction介绍ProcessAllWindowFunction介绍使用示例 流的合并处理函数CoProcessFunct…...
力扣刷题(第四十四天)
灵感来源 - 保持更新,努力学习 - python脚本学习 删除重复的电子邮箱 解题思路 这个问题要求我们删除表中所有重复的电子邮箱,只保留每个唯一电子邮箱对应的最小id记录。解决这个问题的关键在于识别出哪些记录是重复的,并确定需要删除的…...
LLM:decoder-only 思考
文章目录 前言一、KV-cache1、为什么使用KV-cache2、KV-cache的运作原理 二、Decoder-only VS Encoder-Decoder1、Decoder-only2、Encoder-Decoder 三、Causal LM VS PrefixLM总结 前言 decoder-only模型是目前大模型的主流架构,由于OpenAI勇于挖坑踩坑,…...

[GHCTF 2025]SQL???
打开题目在线环境: 先尝试注入: id1;show databases; 发现报错,后来看了wp才知道这个题目是SQLite注入。 我看的是这个师傅的wp: https://blog.csdn.net/2401_86190146/article/details/146164505?ops_request_misc%257B%2522request%255Fid…...
Java并发编程实战 Day 3:volatile关键字与内存可见性
【Java并发编程实战 Day 3】volatile关键字与内存可见性 开篇 欢迎来到《Java并发编程实战》系列的第3天!本系列旨在带领你从基础到高级逐步掌握Java并发编程的核心概念和最佳实践。 今天我们将重点探讨volatile关键字及其在多线程程序中确保内存可见性的作用。我…...
ZYNQ sdk lwip配置UDP组播收发数据
🚀 一、颠覆认知:组播 vs 单播 vs 广播 通信方式目标设备网络负载典型应用场景单播1对1O(n)SSH远程登录广播1对全网O(1)ARP地址解析组播1对N组O(1)视频会议/物联网群控创新价值:在智能工厂中,ZYNQ通过组播同时控制100台AGV小车,比传统单播方案降低92%网络流量! 🔧 二、…...

Qt -使用OpenCV得到SDF
博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 cv::MatdistanceTransform获得SDF 本文的目标, 是简单学习并使用OpenCV的相关函数, 并获得QImage的SDF(Signed Distance Field 有向距离场) 至…...
Linux系统之gettext详解
gettext 是一个用于国际化(i18n)和本地化(l10n)的工具集,旨在帮助开发者创建多语言支持的应用程序。它主要通过提供一系列工具和库来简化文本翻译过程。 gettext 工作流程 标记源代码:在源代码中用 _() 函…...
【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
文章目录 前言一、批量操作(Rang)1.1 AddRange()1.2 UpdateRange()1.3 AttachRange()1.4 RemoveRange() 二、Range操作的底层优化2.1 EF Core 7 前举步维艰2.2 EF Core 7后焕然一新 三、无跟踪的批量更新与删除3.1 ExecuteUpdate3.2 ExecuteDelete3.3 状…...

使用PowerBI个人网关定时刷新数据
使用PowerBI个人网关定时刷新数据 PowerBI desktop连接mysql,可以设置定时刷新数据或在PowerBI服务中手动刷新数据,步骤如下: 第一步: 下载网关。以个人网关为例,如图 第二步: 双击网关,点击下一步&…...
Socket编程之TCP套件字
基于的TCP套件字编程流程 1. Socket套接字 Socket是一个编程接口(网络编程接口),是一种特殊的文件描述符(write/read)。Socket并不 仅限于TCP/IP Socket独立于具体协议的编程接口,这个接口位于TCP/IP四层…...