最近有空阅读了一些 TCP 窗口相关的内核代码,知识点相对比较琐碎,做一些简单的笔记,本篇主要关于 TCP 接收窗口。 本篇主要基于 Linux v5.2.2 内核,如有不准确之处,会日后修订。 前置知识在 TCP 传输中提到的窗口一般有三个,接收窗口、发送窗口和拥塞窗口: 接收窗口:一般是接收端向发送端通告自己还可以接收和缓冲多少数据, 可在用户态通过设置 SO_RCVBUF 一定程度上调整初始的接受窗口大小。 拥塞窗口:可以理解为拥塞算法定义的逻辑窗口,是有发送端的流控算法,一般是 MSS(最大分段大小)的数倍。在一般意义的拥塞算法中,窗口在慢开始阶段增长,当窗口值到达 ssthresh(慢启动阈值)或数据丢失时,会进行相应调整。总之,这是一个由拥塞算法所控制的窗口。 发送窗口:算是一个综合性的窗口,主要用于调整可发送数据的大小,和发送缓冲区剩余大小,拥塞窗口及发送中的数据包量(pac