Switch-Router

Recent Posts

  • 2020-03-11

    Linux内核协议栈中一些关于 TCP MSS 的细节

    为什么会有 MSS (Maximum Segment Size) 这种东西呢?我们知道网络报文在线缆中以是有长度限制的,比如标准的以太网接口能允许通过的以太帧长度上限是 1518 字节。超过了这个长度的数据必然会被分成多个报文发送,这个工作 IP 层可以做,也就是熟知的 IP 分片(Fragment)过程。但如果是承载 TCP 数据的 IP 报文分片后,某个分片在传输路径上丢失了,则会引起整个 TCP 报文的重传。因此,TCP 会在自己这一层就将用户数据按一定长度’切割’好之后再递交给 I...

  • 2020-02-11

    win-minmax(窗口中的最值)算法

    一个问题如果让你设计这样一个信号峰值采集系统,你会如何设计呢? 系统每 1s 都可能接收到外界发送的一定强度的一个信号,且信号的强度在 [1,100] 范围内 你需要提供一个查询服务,向调用者返回在过去 30s 内信号强度的最大值最朴素暴力的办法是使用一个能容量为 30 的环形数组,将每秒收到的信号的强度值记录在里面(如果没收到就视为 0),当有人查询时,遍历整个数组,找到最大的值然后返回,如 Figure-1 所示.WRITE表示新收到的值写入的位置。Figure.1这样的系统能用肯...

  • 2020-01-13

    TCP拥塞控制之ABC(Appropriate Byte Counting)

    ABC 的来源我们知道,TCP 发送端的数据发送速度受到本端拥塞窗口(cwnd)和对端通告的接收窗口(rwnd)的限制,只有同时在这两个窗口内的待发送数据才允许被发送到网络中。其中对端接收窗口是由对端接收缓冲区确定的,由于本文主要关注拥塞窗口,因此不考虑接收窗口的影响(视为接收窗口很大很大)。而拥塞窗口的大小则是由不停的拥塞控制算法计算而来。经典的拥塞控制算法都至少包含慢启动(Slow Start)和拥塞避免(Congestion Avoid)两个阶段。通常我们这样描述这两个阶段的窗口增加...

  • 2020-01-01

    一个 TCP 接收缓冲区问题的解析

    本文是作为一个 TCP 发送缓冲区问题的解析的姊妹篇存在的,在 TCP 中,接收缓冲区比发送缓冲区更为重要和复杂,原因就是,接收缓冲区和 TCP 通告的窗口也息息相关。问题模型Clinet 与 Server 之间建立一条 TCP 连接,Server 通过 SO_RCVBUF 选项设置连接的接收缓冲区为 2048 字节。Clinet 每隔 100 ms 通过 send() 一个载荷长度很小(2 字节)的 TCP 报文,但 Server 端不调用 recv(),这意味着 Server 收到的 ...

  • 2019-12-20

    一个 TCP 发送缓冲区问题的解析

    最近遇到一个问题,简化模型如下:Client 创建一个 TCP 的 socket,并通过 SO_SNDBUF 选项设置它的发送缓冲区大小为 4096 字节,连接到 Server 后,每 1 秒发送一个 TCP 数据段长度为 1024 的报文。Server 端不调用 recv()。预期的结果分为以下几个阶段:Phase 1. Server 端的 socket 接收缓冲区未满,所以尽管 Server 不会 recv(),但依然能对 Client 发出的报文回复 ACK;Phase 2. Ser...