接收窗口/发送窗口
最快的方式是一口气把所有包发送出去, 然后一起确认, 但是存在一些限制:
- 接收方缓存 (接收窗口) 不够大
- 网络带宽不够大, 会丢包
一口气能发送的最大量就是 TCP 发送窗口.
发送窗口的大小对性能的影响:
在真实环境中的抓包:
- 服务器 ip: 10.32.106.73
- 客户端 ip: 10.32.106.103
- 服务器连续发送10个包
- 把客户端的接收窗口调小: win=2920
将自己的发送窗口设置成对方的接收窗口.
常见问题
1. window size 含义?
- 向对方声明自己的接收窗口
- 向对方表示自己的接收缓存大小为0
2. 如何在包里看出发送窗口的大小?
tcp 头不包含发送窗口大小.
3. 发送窗口和 MSS 有什么关系?
- 发送窗口: 一口气能发多少数据 (像是可以缓存多少数据)
- MSS: 决定这些数据要分多少个包
4. 发送方在一个窗口里发出 n 个包, 是不是就能收到 n 个确认包?
不一定, 积累确认.
5. TCP Window Scale 与接收窗口的关系?
- 一开始网络不发达, 接收窗口被定义最大为65535 (16bit)
- 随着网络发展, 该值不够用, 所以增加了 Window Scale 这个 TCP Options
- Window Scale 保存的是 shift count, 用于2的幂
- 真正的接收窗口大小 = win * 2^shift
window scale:
- 需要在三次握手时抓到 window scale
计算:
- 183 * 32 = 5856