https://www.zhihu.com/question/21128134
TCP 可以通过滑动窗口来灵活调整速度
UDP 速率仅与程序生成数据速率、系统处理速度和传输带宽有关。
路由器会随机丢弃几个数据包,从而发送端会认为出现了拥塞,从而减少发送窗口。这样,通过发送端网卡发出的数据会主动减少。这是针对tcp协议的。
从内核模型说起,tcp/ip协议好像对时间并没有定义,只是一方不停send,一方不停recv。发送时数据放入send buffer,然后再发送出去。如果send buffer已经满了,里边的数据没有发送出去,此时继续调用send会失败或是一直阻塞着,取决于你使用的是同步或是异步模型。recv时道理也相同,recv buffer数据满了时还没有读取就不再接收数据了。所谓的滑动窗口就是这个东西,他通常反映的是对方内核buffer的能力,当对方buffer满了时tcp窗口会通告发送方对方已经无能力接收了,省点力气吧。
http://www.cnblogs.com/btlulu/p/4093436.html
市面上有很多网速调控软件,而其原理不得而知。抓包看了下,记录如下:
限速后抓包发现多了大量的Client向Server发的TCP Zerowindow包和些许Server向Client发的TCP Keep-Alive包,如图:
比对发现,限不限速的滑动窗口大小是一样的,总结原理如下:
1.限速是通过滑动窗口协议控制的,当超过设定的阈值,Client会向Server发TCP Zerowindow包,表示窗口缓冲区已满,此时Server不再向Client传递数据。
2.不传数据时,Server会向Client发TCP Keep-Alive包保持连接。
3.当Client再请求数据时会向Server发TCP Window Update包以更新窗口,Server收到后会向Client继续传数据。
既然没有调控窗口大小,所以如果阈值调得很低,就可能会出现控制连接的数据包比正常业务的数据包还多,如图:
这也解释了为什么限速为某个定值,实时速度却上下波动。网速调控、带宽限制大致应该都是这个原理。