这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
本堂课重点内容
TCP及其流量控制
详细知识点介绍
TCP
sequnce number
seq表示的是我方(发送方)这边,这个packet的数据部份的第一位应该在整个data stream中所在的位置。
acknowledge number
ack表示的是期望的对方(接收方)的下一次sequence number是多少。注意,SYN/FIN的传输虽然没有data,但是会让下一次传输的packet seq增加一,但是,ACK的传输,不会让下一次的传输packet seq加一。
TCP的有限状态机
TCP流量控制
对于发送端来说 TCP 需要把发送的数据放到发送缓存区, 对于接收端来说 TCP 需要将接收的数据放到接收缓存区。
而流量控制所要做的事情,就是在通过接收缓存区的大小,控制发送端的发送。如果对方的接收缓存区满了,就不能再继续发送了。通过滑动窗口来控制发送的字节数量和接收的字节数量。
TCP 滑动窗口分为两种: 发送窗口和接收窗口。
例子
首先双方三次握手,初始化各自的窗口大小,均为 300 个字节。
假如当前发送端给接收端发送 150 个字节,那么此时对于发送端而言,SND.NXT 当然要右移 150 个字节,也就是说当前的可用窗口减少了 150 个字节。
现在这 150 个到达了接收端,被放到接收端的缓冲队列中。不过此时由于大量负载的原因,接收端处理不了这么多字节,只能处理 100 个字节,剩下的 50 个字节被留在了缓冲队列中。
注意了,此时接收端的情况是处理能力不够用啦,你发送端给我少发点,所以此时接收端的接收窗口应该缩小,具体来说,缩小 50 个字节,由 300 个字节变成了 250 字节,因为缓冲队列还有 50 个字节没被应用拿走(接收窗口300 - 50 = 250)。
因此,接收端会在 ACK 的报文首部带上缩小后的滑动窗口 250 字节,发送端对应地调整发送窗口的大小为 250 个字节。
此时对于发送端而言,已经发送且确认的部分增加 100 字节,也就是 SND.UNA 右移 40 个字节,同时发送窗口缩小为 250 个字节(发送窗口300 - 150 + 100 = 250字节)。
发送窗口本质其实就是接收窗口,两者值在传输数据之前一直保持相同,控制了发送端发送流量的数据量
课后个人总结
TCP许多重要概念比如TCP头部字段中的序列号和确认号流量控制滑动窗口的作用很值得深入研究。