TCP 滑动窗口
滑动窗口分为接受窗口和发送窗口
滑动窗口协议是传输层进行流控的一种措施,接收方告诉发送方自己窗口的大小,从而控制发送方的发送速度,
ACK是收到数据后,接收方给发送方的一个确认ACK,它包含了两个重要的信息;
- 期望接受到的下一个字节的序号n,代表接收方已经接受到n-1字节的数据,如果之后发送方发送的不是序号为n的字节数据,接收方不会返回后续的序号的。
- 当前窗口的大小m,通过这两个数据,发送方就能计算出还可以发送多少数据给对方,假设当前发送第X字节:
x-n。窗口中已经有的
m-(x-n) 还能发送的字节数
因此:
y = m - ( x - n )
在一个TCP的段中,可以看到如下信息
window字段就是窗口字段,是一个16bit的字段,代表窗口字节容量,也就是说窗口最大数据为2^16 - 1 = 65535
滑动窗口原理
在发送方,所有发送缓存内数据可以分为以下4种:
- 已经发送并且得到对面ACK的(send and acknowledged)
- 已经发送并且未得到对面ACK的 (send but not acknowledged)
- 未发送但是得到对面允许的(not send recipient ready to receive)
- 为发送并且对方不允许的 (not sent recipient not ready to receive