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的区别你了解吗?
5.2 LT和ET的特点决定了他们的名字嘛?为什么这么叫?
确实,EPOLL LT
和 EPOLL ET
中的 LT
和 ET
分别代表 "Level Triggered" 和 "Edge Triggered",这些名称直接反映了它们的工作方式。
-
Level Triggered (LT) - 水平触发:
- 如其名,这是基于"级别"或者说"状态"的触发模式。
- 只要满足某个条件(例如文件描述符上有数据可读),就会触发通知,无论之前是否已经通知过。
- 因此,在某些情况下,如果应用程序没有完全处理掉事件,
epoll_wait
可能会连续多次返回该事件。这就是为什么它被称为"水平"的原因,因为只要达到某个"水平"或状态,就会触发通知。
-
Edge Triggered (ET) - 边缘触发:
- 这是基于"变化"或"边缘"的触发模式。
- 只有当从上一次事件后文件描述符的状态发生变化(例如从没有数据可读变为有数据可读)时,才会触发通知。
- 这意味着如果你被通知一次,除非状态发生了改变,否则你不会再次被通知。这就是为什么它被称为"边缘"的原因,因为它依赖于状态的"边缘"或变化。
这两种模式的选择取决于应用程序的需求和预期的使用模式。水平触发可能更加直观和易于使用,但可能会导致重复通知。而边缘触发更加高效,但需要应用程序更加小心地确保处理了所有事件。