IP4 报文头TOS

来源:互联网 发布:webservice接收json 编辑:程序博客网 时间:2024/06/05 03:50

http://network.51cto.com/art/200901/107005.htm


显式拥塞通告

IP和TCP使用包头中的未使用字段来支持ECN。

在网络层(IP),一个发送主机必须能够表明自身可以进行ECN,路由器在转发时必须能够表明它正在经历拥塞。

在传输层(TCP),TCP端必须对对方表明自身是可以进行ECN操作的。接收端必须能够通知发送端它收到了一个来自路由器的拥塞通告。发送端必须能够通知接收端它受到了来自接收端的通告并且已经降低了发送速率。

图1

IP包头中的8位的服务类型域(TOS)原先在RFC791中被定义为表明包的发送优先级,时延,吞吐量,可靠性和消耗等特征。在RFC2474中被重新定义为包含一个6位的区分服务码点(DSCP)和两个未用的位。DSCP值表明一个在路由器上配置的和队列相关联的发送优先级。IP对ECN的支持使用到了TOS域中剩下的这两位。如图1所示。

在RFC2474中TOS域未使用的两位在RFC3168中被定义为ECN域,包含如下值:

00:发送主机不支持ECN

01或者10:发送主机支持ECN

11:路由器正在经历拥塞

一个支持ECN的主机发送数据包时将ECN设置为01或者10。对于支持ECN的主机发送的包,如果路径上的路由器支持ECN并且经历拥塞,它将ECN域设置为11。如果该数值已经被设置为11,那么下游路径上的路由器不会修改该值。

TCP对ECN的支持

当一个IP包的ECN域被路由器设置为11时,接收端而非发送端被通知路径上发生了拥塞。ECN使用TCP头部来告知发送端网络正在经历拥塞,并且告知接收端发送段已经受到了接收端发来的拥塞通告,已经降低了发送速率。

图2

TCP对ECN的支持使用TCP中预先定义的保留位。ECN定义两个新的标志,如图2所示:

ECE:ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的,并且表明接收到的TCP包的IP头部的ECN被设置为11。更多信息请参考RFC793。

CWR:拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置ECE标志的TCP包。拥塞窗口是被TCP维护的一个内部变量,用来管理发送窗口大小。

当两个支持ECN的TCP端进行TCP连接时,它们交换SYN,SYN-ACK和ACK包。对于支持ECN的TCP端来说,SYN包的ECE和CWR标志都被设置了。SYN-ACK只设置ECE标志。

一个支持ECN的TCP主机在支持ECN的TCP连接上发送设置了IP头部为10或者01的TCP包。支持ECN的路由器在经历拥塞时设置IP头部的ECN域为11。当一个TCP接收端发送针对收到的一个设置ECN位为11的TCP包的响应时,它设置TCP包头中的ECE,并且在接下来的ACK中也做同样设置。

当发送主机接收到设置了ECE标志的ACK时,它就像感知到包丢失一样,开始减少发送窗口,运行慢启动过程和拥塞避免算法。在下一个数据包中,发送者设置CWR标志。在接收到新的设置CWR标志的包时,接受者停止在接下来的ACK中设置ECE标志。

ECN例子

点击放大此图片

图3

图3展示了一个在支持ECN的TCP端节点之间的一个TCP连接的例子,它们之间的一个支持ECN的路由器正在经历拥塞。

在这个例子中,TCP端A发送数据给TCP端B。TCP端A一次性发送5个包。包2通过一个拥塞的支持ECN的路由器转发,将IP包头的ECN位设置为11。当TCP端B接收到这个包,它发送设置了ECE标志的ACK。当TCP端A接收到第一个设置了ECE的ACK以后,它降低发送速率,并且在发送下一个包(6)时设置其CWR标志。通过接收包6,TCP端将不对接下来的ACK包设置ECE标志。详情请参考RFC 3168。

Windows对ECN的支持

Windows Vista支持ECN但是缺省是关闭的。你可以通过netsh interface tcp set global ecncapability=enabled来打开支持。因为ECN使用到了IP和TCP包头中以前未使用或者保留的位,中间的网络设备如路由器和防火墙将会静默地丢弃ECN域设置为非0值的包。为了防止出现这种情况,请对你的网络设备进行适当的配置和升级以支持ECN。