当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的“黑盒”。TCP 包进入和流出这个盒子。有些时候进入盒子的包被丢失了。因为今天的数字和光媒体上出现比特级错误的机会非常少,TCP 的设计者们就假设包的丢失很大程度上是因为路由器的拥塞,也即是路由器用来容纳进入包的缓冲已经被填满了,这样路由器会静默地丢弃接下来进入的包。
   
    尽管TCP可以检测到TCP包的丢失并且进行重传,但是从TCP处理过程,重传过程和吞吐率下降这些方面看,这个重传过程将会耗费很大。
  当一个发送的TCP端节点检测倒一个包丢失时,可以进行快速重传或者包的重传计时器超时而重传。然后该TCP端节点减小发送窗口(在等待响应之前可以发送的包数量),进行慢启动和拥塞避免算法(RFC 2001)。这会立刻降低发送端的发送速率,以便路由器来减轻拥塞。发送端会逐渐将发送窗口恢复倒拥塞发生前的大小。
  尽管因为路由器拥塞而产生的包丢失是偶然发生的事件,它们并不会负面地影响块数据传输,只是会增加一些重传数据包和恢复发送速率的时间。慢启动和拥塞避免算法对于时间敏感的,成块数据流的控制效果非常好。然而,TCP处理丢包的方法对于交互式的,丢失敏感和时间敏感的流量来说效果不是很好。
  另外一个关于路由器拥塞的问题是拥塞对于多个数据流的影响。当路由器开始丢弃进入的数据包时,它一般并不区分数据流的不同。当多个TCP数据流都产生包丢失时,所有的数据流都要减少自身的发送速率。根据路由器拥塞减轻的程度,多个TCP数据流将会逐渐恢复自身的发送速率。这会降低路由器及相关链路的使用率,直到所有的TCP数据流恢复到以拥塞之前的速率进行发送。路由器从拥塞状态又进入到了低使用状态。
  这种拥塞后因为重传和低链路使用而带来的吞吐量问题,是仅仅通过发送端来管理拥塞的结果。为了避免因为路由器拥塞而带来的丢包而产生的一系列问题,TCP/IP的设计者们创建了一些用于主机和路由器的标准。这些标准描述了在IP路由器上进行的主动队列管理算法(AQM)(RFC 2309),使得路由器能够监控转发队列的状态,以提供一个路由器向发送端报告发生拥塞的机制,让发送端在路由器开始丢包前降低发送速率。这种路由器报告和主机响应机制被称为显式拥塞通告(ECN)(RFC 3168)。
  当拥塞发生时,发送主机必须仍然在降低它们的发送速率。然而,通过避免包的丢失,发送主机无需进入重传过程,丢失敏感的数据包流也不会因为拥塞而受到很大影响。
  显式拥塞通告
  IP和TCP使用包头中的未使用字段来支持ECN。
  在网络层(IP),一个发送主机必须能够表明自身可以进行ECN,路由器在转发时必须能够表明它正在经历拥塞。
  在传输层(TCP),TCP端必须对对方表明自身是可以进行ECN操作的。接收端必须能够通知发送端它收到了一个来自路由器的拥塞通告。发送端必须能够通知接收端它受到了来自接收端的通告并且已经降低了发送速率。
    
    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头部来告知发送端网络正在经历拥塞,并且告知接收端发送段已经受到了接收端发来的拥塞通告,已经降低了发送速率。
    
    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标志。
    
    图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的支持
  Vista支持ECN但是缺省是关闭的。你可以通过netsh interface tcp set global ecncapability=enabled来打开支持。因为ECN使用到了IP和TCP包头中以前未使用或者保留的位,中间的网络设备如路由器和防火墙将会静默地丢弃ECN域设置为非0值的包。为了防止出现这种情况,请对你的网络设备进行适当的配置和升级以支持ECN。

TCP/IP网络中的显式拥塞通告(ECN)的更多相关文章

  1. 显式拥塞通告(ECN)及其在Linux上的实现

    1 ECN简介 首先看看ECN握手报文的特点,根据RFC3168,ECN握手报文IP头部不能够设置ECT和CE位的 SYN报文TCP标志字段的CWR和ECE位被置1 SYN-ACK报文的CWR位被置0 ...

  2. TCP/IP网络编程中socket的行为

    一. read/write的语义:为什么会阻塞? 先从write说起: #include <unistd.h>ssize_t write(int fd, const void *buf, ...

  3. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  4. 协议分析中的TCP/IP网络协议

    - 链路层 第一层包含源mac及目的mac,随着传输路径的变化会发生变化,在mac之后,是下层网络协议的类型,图中,下层为IP协议. 在协议解析中,需要关注的是图中type这个字段的内容. - 网络层 ...

  5. TCP/IP网络知识点总结

    学完了计算机网络是时候整理一篇总结了,温故知新.注意:这篇博客很长长长(2.5万字+50图). TCP/IP网络知识点总结 一.总述 1.定义:计算机网络是一些互相连接的.自治的计算机的集合.因特网是 ...

  6. TCP/IP网络协议基础

    实验楼学习网络协议传送门 一.TCP/IP简介 TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电 ...

  7. TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口

    TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过 ...

  8. TCP/IP具体解释--TCP/IP可靠的原理 滑动窗体 拥塞窗体

    TCP和UDP处在同一层---运输层,可是TCP和UDP最不同的地方是,TCP提供了一种可靠的数据传输服务,TCP是面向连接的,也就是说,利用TCP通信的两台主机首先要经历一个"拨打电话&q ...

  9. TCP/IP网络协议

    OSI七层模型 OSI采用了分层的结构化技术,共分七层,物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP模型 OSI模型比较复杂且学术化,所以我们实际使用的TCP/IP模型, ...

随机推荐

  1. arp欺骗(理论)

    ARP(地址解析协议)在IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址. 一.ARP通讯协议过程 局域网的通信不是根据IP地址进行,计算机是根据mac地址来识别一台机器. 每 ...

  2. 关于STM32的CAN的过滤器

    关于STM32的CAN的过滤器STM32普通型芯片的CAN有14组过滤器组,互联型有28组过滤器组.一般我们用的都是普通型的,所以在本文中可以说STM32有14组过滤器组.根据配置,每1组过滤器组可以 ...

  3. Python & Matplotlib: Monte Carlos Method

    Hey! 这里是Lindy:) Hope you guys are doing well! 今天想记录的概念叫做 蒙特·卡罗 方法,是今年在cs课上老师做的扩展延伸.其实我在初次接触这个概念时觉得很新 ...

  4. Linux 时间同步 03 ntpdate时间同步

    Linux 时间同步 03 ntpdate时间同步 目录 Linux 时间同步 03 ntpdate时间同步 安装ntpdate 修改/etc/sysconfig/ntpdate 使用ntpdate手 ...

  5. Hadoop伪分布式模式

    搭建在单一服务器 基于官方文档 http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster ...

  6. 【C++】《C++ Primer 》第十五章

    第十五章 面向对象程序设计 一.OOP:概述 面向对象程序设计(OOP)的核心思想是数据抽象.继承和动态绑定. 通过使用数据抽象,可以将类的接口和实现分离. 使用继承,可以定义相似的类型并对其相似关系 ...

  7. 简要MR与Spark在Shuffle区别

    一.区别 ①本质上相同,都是把Map端数据分类处理后交由Reduce的过程. ②数据流有所区别,MR按map, spill, merge, shuffle, sort, r educe等各阶段逐一实现 ...

  8. docker 创建数据卷容器

    数据卷容器 --volumes-from 容器名/id 先起一个容器 docker run -it --name docker01 centos 然后同步 docker01 的数据卷 --volume ...

  9. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  10. 内存性能测试 Memtester+mbw

    Memtester简单介绍 Memtester主要是捕获内存错误和一直处于很高或者很低的坏位, 其测试的主要项目有随机值,异或比较,减法,乘法,除法,与或运算等等. 通过给定测试内存的大小和次数, 可 ...