本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严
禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
1. 前言
普通防火墙限制流量方法是一旦流量超过限制值就丢包,所丢弃的包由连接双方重新发包来恢复,这样的缺点就是流量带宽仍然被浪费了一部分,也浪费了防火墙的一部分处理能力,对于非TCP流量,基本只能用此方法,但对于TCP流量,可以找到更好的流量限制方法,让TCP通信双方自动降低通信速度。
2. 基本原理
在TCP包头中有一个16位的window字段,用来表示接收方的接收缓冲区能接收多少数据,发送方一次不能发送超过该值的数据,这样起到控制流量的作用。
本文提出的TCP流量控制方法就是根据此window值处理,一旦防火墙发现TCP连接的流量超过限值,并不丢包,正常转发,但向发送方发送一个ACK包,不带任何数据,因此不影响正常通信,此ACK包中window值为0,表示接收方已经不能接收数据,发送方TCP收到此包后,会自动降低发送速度,这样防火墙上就不用丢掉本来就是合法的包,因而没有带宽浪费。
对于TCP通信双方本身,如果防火墙采用丢包方法来限制,丢包较多时发送方也会采用诸如slow start等算法来减少发送速度以适应限制值,但不论如何防火墙也要丢不少包,浪费了一些处理能力和网络的带宽。
3. 实验结果
测试用HTTP下载一个大约1M字节的文件,限制下载流量为10Kbytes,用超量丢包的方法,所丢包累计超过490K字节,相当于通信双方所传输数据几乎有1/3被丢弃;而使用调整window值的方法,没有丢包,防火墙构造的ACK包自动降低了发送方发送速度,但限制的流量速度虽然设的是 10K,但实际大约只是6K左右。通过抓包分析,当防火墙发出window为0的ACK包后,发送方停顿了好几秒钟才重新发送新包。
4. 结论
通过发送0窗口值的TCP确认包的方法来限制TCP流量是可行的,减少了防火墙的丢包,本质上节约了带宽,缺点是流量限制值不如丢包方式准确,但可以保证肯定不超过限值,可以通过实验找一个平均因子来修正流量设定值来达到期望的带宽限制值。
发表于: 2006-07-26,修改于: 2006-07-26 08:44,已浏览2980次,有评论7条 推荐 投诉
网友: skipjack 时间:2006-07-26 17:06:10 IP地址:218.247.216.★
两个疑问:
1)防火墙发了一个win=0的ack包,那么真实的目的地发送的ack包,防火墙如果处理?
2)这个win=0的ack包,他的ack_seq值是多少?是数据包数据首部序号,还是尾部序号?如果是尾部序号,那么这个原先的数据包在防火墙转发后通住目的地过程中丢失了,发送方将不会再重传了呀?
网友: yfydz 时间:2006-07-26 17:09:42 IP地址:218.247.216.★
1. 纯粹的ACK不占用序列号,接收方后续的ACK防火墙同样转发就行
2. 取接收方最后一个通过防火墙的包的ACK
网友: 本站网友 时间:2006-08-05 20:14:01 IP地址:221.194.171.★
在linux上怎么具体实现,原理都是明白的。
网友: yfydz 时间:2006-08-07 08:41:00 IP地址:218.247.216.★
怎么实现那就是看每个人的水平了,又没有现成的
网友: skipjack 时间:2006-08-22 15:52:02 IP地址:218.247.216.★
很简单
1)抓包发现应该做流量限制
2)反转这个数据包的源和目的IP地址与端口
3)设置win为0,设置ack_seq值,并重新计算校验和
4)返弹回这个数据包
5)OK~
网友: yfydz 时间:2006-08-22 16:34:33 IP地址:218.247.216.★
FT,嘴那么不严,:)
网友: 本站网友 时间:2007-09-18 17:23:23 IP地址:220.248.75.★
更好的实现还是进行流量限制。
不过Drop Tail的方法显然不合适,已经给出了结果了。
合适的方法是,RED。