接收窗口/发送窗口

最快的方式是一口气把所有包发送出去, 然后一起确认, 但是存在一些限制:

  • 接收方缓存 (接收窗口) 不够大
  • 网络带宽不够大, 会丢包

一口气能发送的最大量就是 TCP 发送窗口.

发送窗口的大小对性能的影响:

image.png

在真实环境中的抓包:

  • 服务器 ip: 10.32.106.73
  • 客户端 ip: 10.32.106.103
  • 服务器连续发送10个包

image.png

  • 把客户端的接收窗口调小: win=2920

image.png

将自己的发送窗口设置成对方的接收窗口.

常见问题

1. window size 含义?

  • 向对方声明自己的接收窗口

image.png

  • 向对方表示自己的接收缓存大小为0

image.png

2. 如何在包里看出发送窗口的大小?

tcp 头不包含发送窗口大小.

3. 发送窗口和 MSS 有什么关系?

  • 发送窗口: 一口气能发多少数据 (像是可以缓存多少数据)
  • MSS: 决定这些数据要分多少个包

4. 发送方在一个窗口里发出 n 个包, 是不是就能收到 n 个确认包?

不一定, 积累确认.

5. TCP Window Scale 与接收窗口的关系?

  1. 一开始网络不发达, 接收窗口被定义最大为65535 (16bit)
  2. 随着网络发展, 该值不够用, 所以增加了 Window Scale 这个 TCP Options
  3. Window Scale 保存的是 shift count, 用于2的幂
  4. 真正的接收窗口大小 = win * 2^shift

window scale:

  • 需要在三次握手时抓到 window scale

image.png

计算:

  • 183 * 32 = 5856

image.png