背景
TCP/IP
协议是当前网络时代的基础,所有的网络产品,或者是开发语言、开发框架都是基于tcp/ip
协议的,所以说,学好tcp/ip
对个人以后从事互联网行业会有巨大的帮助。
但是这是一个基础理论课程,就像操作系统这门课一样,学完之后可能不会对你产生太大的影响,不会让你立马拥有能够投入工作中的技能。但正是因为这是一个基础理论课,所有的互联网技术都是基于它的。所以如果你了解tcp/ip
协议,将会对你未来发展或者在工作中排查问题产生积极的作用。
流量控制
对于发送端和接收端而言,tcp
需要把发送的数据放到发送缓冲区,将接收的数据放到接收缓冲区。而流量控制要做的事情,就是通过控制接收缓冲区的大小来控制发送端的发送速度。
tcp
的滑动窗口分为两种:发送窗口、接收窗口
发送窗口
其中包含四大部分:
- 已发送,已确认
- 已发送,但未确认
- 未发送,但可发送
- 未发送,且不可发送
发送窗口的部分如下:
SND
:即send
,表示已发送,但未接收的位置WND
:即window
,表示窗口大小UNA
:即unacknowledged
,表示未被确认NXT
:即next
,表示下一个发送的位置
接收窗口
接收端的窗口结构如下:
REV
:即Receive
,表示待接收的位置NXT
:即next
,表示下一个接收的位置WND
:即window
,表示窗口大小
流量控制的过程
假设双方已经建立三次握手,初始化窗口大小均为200
字节
- S给C发送了
100
字节,那么此时对于S而言,SND.NXT
要右移100
字节,也就是当前可用的窗口减小了100
。这很好理解 - C收到
100
字节大小的数据之后,将其放入了缓冲区队列中。不过由于C大量负载原因,C处理不了这么多的数据,只能处理40
字节,REV.NXT
右移40
,剩下的60
字节被留在了缓冲队列里面 - 注意了,此时由于C的处理能力不够,希望S每次能少发送一些数据,所以此时C的接收端窗口应该缩小。缩小
60
字节,由原来的200
变为140
。因为缓冲区里面还有60
字节未取走。因此,C会在ACK
报文首部带上缩小后的窗口大小,即140
。这很好理解 - S收到C的回复,知道C将接收窗口大小缩小到了
140
。对于S而言,接收且确认的部分增加40
字节,也就是SND.UNA
右移40
,同时也将发送窗口缩小为140
这就是流量控制的详细过程,尽管回合再多,整个控制过程和原理都是一样!!
注意
- 流量控制是为了防止发送方发的太快,从而耗尽接收方的资源,从而使接收方来不及处理。
总结
这是tcp/ip系列的第八篇,主要详细介绍了tcp
中的接收窗口和发送窗口,记住,流量控制是通过控制接收窗口的大小从而达到控制发送端的发送速度。后面还有更深入、更多使用的场景讲解,这个系列的文章会很长。
开始下一篇吧。