计算机网络 tcp 阻塞,读书笔记:计算机网络第7章:阻塞控制

这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。

由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了。这门课程在2013年左右录制,知识相对还是比较新的。覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细。学完这门课程之后对计算机网络会有比较深刻的了解。

概述

课程位置

关于传输层和网络层的上半部分

话题

阻塞就类似于显示生活中的堵车

阻塞CONGESTION的本质

路由器或者交换机都有输入输出的缓冲

在一个路由器或者交换机中,如果有很多端口持续地向同一个端口发送数据,缓冲区就会被填满,从而导致大量丢包。这就是阻塞。

阻塞造成的影响

见图

当阻塞发生的时候,发送速度会明显减小。网络延迟会明显增大

带宽分配

就是给发送者分配合理的带宽。这是是一项很重要的任务。

好的分配应该是高效的,公平的。高效意味着没有阻塞发生。公平意味者每个发送者都能享受到带宽。

关键问题:高效的方案需要网络层和传输层共同参与。因为网络层能够察觉到拥塞,而只有传输层才能控制流量

为什么带宽分配很难呢

发送方的负载一直在变化

接收方的承受能力在不同的网络也是不同的

网络是分布式的,没有人知道整个网络的状态

解决方案

发送方根据自己察觉到的情况自动作出相应调整

设计调整策略,从而使得网络的使用率最高效最公平

调整是一直在进行的动作,因为负载每时每刻都在变化

话题

阻塞的本质

公平分配带宽

AIMD控制法则

TCP阻塞控制历史

ACK时钟

TCP慢启动

TCP快速重传

ECN阻塞规避

dd379e9c0c6f5e5aefe07b80ffd941ea.png

带宽公平分配

话题

什么是公平的带宽分配

回忆

好的带宽分配意味着公平和高效

实际应用中,高效比公平更重要

高效和公平的比较

高效和公平不能兼得

举例。假设现在有这样的网络流量:A->B    B->C    A->B->C

先考虑公平。A->B 1/2,B->C 1/2,A-C 1/2,这种情况下网络使用率只能达到 1.5

再考虑高效。A->B 1,B->C 1,A->C 0。这种情况下网络使用率达到2

什么才算公平

公平的目的是避免某些节点没有分配到资源,导致“饥饿”

所以每个数据流分配相同的带宽是最公平的

每个数据流分配相同的带宽

网速的瓶颈在于最慢的链路

瓶颈的存在意味着有些链路速度快,有些链路速度慢。这种情况下平均分配带宽是不可能的。

max-min公平分配

增加一个流量的同时一定会减少另一个流量

网络流量就像水流

步骤

每个数据流的速度都以0起步

逐渐增加数据流的速度直到某个数据流的速度达到了瓶颈

保持达到瓶颈的速度

返回第二步,继续操作剩下的数据流

AIMD算法Additive Increase Multiplicative Decrease

话题

AIMD是一种带宽分配模型

回忆

我们想要给发送者分配带宽,需要既高效又公平

我们应该怎样分配带宽呢?有多种方法

带宽分配模型

带宽分配模型分为多种

开循环:在带宽被使用前就已经事先分配好了。

闭循环:在带宽使用的时候逐渐调整

主机支持或网络支持

基于window或基于速度

TCP是闭循环,主机支持,基于window

本章主要将闭循环、主机支持、基于window的带宽分配模型

网络层会返回信息告诉发送者是否有网络阻塞

传输层负责调整发送者的发送速度

AIMD 线性提速、指数降速

当网络畅通时,传输速度缓慢上升(线性提速);当网络遇到阻塞时,传输速度急速下降(指数降速)

AIMD执行的最终结果就是越来越趋向于即公平又高效的平衡点

AIMD属性

收敛于即高效又公平的平衡点

需要从网络获取反馈

反馈信号

信号有多种,包括:丢包、数据包延迟、路由器指示(阻塞信号)

TCP阻塞控制历史

话题

TCP阻塞控制的历史

1980阻塞塌方

早期TCP使用固定大小的滑动窗口(比如一次发送8个数据包)

但是当ARPANET成长的时候会发生很多奇怪的事情

由于网络组件中的消息队列太长,重发的数据包充斥着整个网络,造成有效传输速度减少了很多

Van Jacobson

发明了阻塞控制的方法

还有traceroute tcpdump pathchar, IP header compression, multicast tools

TCP tahoe/reno

在不改变路由器的情况下,避免网络阻塞

主要的办法是滑动超时时间,引入阻塞窗口的概念,类似滑动窗口

TCP tahoe/reno使用网络反馈的丢包信号来调整阻塞窗口

我们将研究TCP的以下行为:ACK始终、自适应超时、慢开始、快速重传、快速恢复

TCP发展历史

1974 TCP论文

1975 三次握手协议

1981 TCP 和 IP

1983 TCP/IP

1986 第一次发现网络阻塞

1988 TCP Tahoe

1990 TCP Reno

1993 TCP Vegas

1994 ECN

1995 TCP New Reno

1996 TCP SACK

2004 FAST TCP

2004 TCP BIC

2006 TCP CUBIC

2007 Compound TCP

2008 TCP LEDBAT

最近几年出现了很多阻塞控制的方法,但是课程内容只讲解传统的阻塞控制方法

ACK时钟

话题

滑动窗口使用了内置的时钟

滑动窗口的 ACK 时钟

根据滑动窗口协议,只有当发送方接收到ACK后,才会发送新的数据包

请思考一种情况,发送方在刚开始时数据包发送很快,比如5包/秒。但是由于中途遇到低速网络,对方接收数据的时候变成了1包/秒。那么ACK信号的速度也是1个/秒。这样,发送方接收ACK的速度也是1秒1个。根据滑动窗口协议,接收到ACK后才能发送新的数据。所以发送方的发送速度从原来的5包/秒变成了1包/秒。这就是ACK时钟。

它能让发送者保持最高效的发送速率,同时缩短了沿途路由器的消息队列,从而减少了丢包率和网络延迟。

TCP和ACK时钟

TCP通过滑动窗口使用了ACK时钟

滑动窗口控制了网络中流通的数据包数量(也称为阻塞窗口)

TCP一次发送很少的数据包,来保持网络流量的平滑

TCP慢启动

话题

TCP如何实现AIMD

回忆

我们想要通过AIMD实现TCP的带宽分配

发送方使用阻塞窗口来设置传输速度

发送方根据丢包情况调整传输速度

需要TCP适应大幅度的速度变化

TCP启动问题

我们想要快速接近最合适的速率。但是在刚开始的时候很难刚好适应

启动速度太快会导致丢包,启动速度太慢会花费很长的时间才能达到刚好适应

慢启动方案

启动速度呈指数上升

随着速度的提升,最终会由于网络阻塞发生丢包。之后,将指数提速切换成线性提速。这就是慢启动

慢启动时,也就是指数提速时,每收到1个ACK,就增加1个滑动窗口。这样传输速度就能呈现指数上升了

线性提速时,每滑动窗口个ACK之后增加1个滑动窗口

TCP tahoe

第一阶段是慢启动阶段,滑动窗口cwnd=1。每个ACK之后cwnd增加1

第二阶段是线性增长阶段,每接到一个ACK,滑动窗口cwnd增加1/cwnd。大概每个RTT之后增加一个cwnd

之后是切换threshold,初始threshold为无穷大。当cwnd > ssthresh时,切换到线性增长模式。当发生丢包之后设置ssthresh为cwnd/2。超时之后使用慢启动

timeout misfortunes

为什么要在超时之后才使用慢启动呢

超时给ACK时钟足够的时间来发挥作用

我们需要在丢包超时前就检测到丢包,这样才能更好地执行AIMD

TCP快速重发、快速恢复

话题

TCP如何实现AIMD

回忆

我们想要TCP通过AIMD法则来实现合理的网速分配

发送方通过阻塞窗口(滑动窗口)来设置速度

发送放使用慢启动来实现ACK时钟

在超时之后发送方将滑动窗口设为1,然后重新开始慢启动

通过ACK推断丢包情况

TCP使用累加型的ACK

重复的数据给我们提示哪些数据没被对方收到。出现重复ACK是因为ACK时钟

快速重发

将三个重复的ACK视为丢包,此时立即重发。三个重复的ACK来自ACK时钟

快速重发可以快速修复丢失的数据包,特别是还没超时的时候就能检测到丢包并迅速修复

但是在等ACK变化的时候有一段时间是没有传输数据的

所以我们仍然需要指数减速的方法

根据ACK推断哪些包是没有丢的

每个新的重复的ACK意味着有数据已经被对方收到了

快速恢复

在快速重传之后,有一段时间是浪费掉的。所以,在快速重传之后,需要进行“指数减速”。并且在之后的一小段时间内需要将重复的ACK视为正常的ACK。并且在这段时间内,ACK需要仍然没有递增,此时还是要继续发送后续的数据包。这就是快速恢复。

在ACK需要增加之后就退出快速恢复。

快速重发可以修复一小段丢包,使得ACK时钟持续运行

我们需要重新认识AIMD,在丢包之后不会发生超时或者TCP慢启动。而是减少滑动窗口后继续发送数据

TCP Reno实现了慢启动、快速重发、快速恢复,指数减速是指将滑动窗口减速到原来的一半

TCP Reno, NewReno, SACK

Reno一次只能恢复一个丢包,多次丢包最终会超时然后重发

NewReno加强了ACK推断的过程,一次能修复多个丢包并且不会发生超时重发

SACK是一个更好的方法,接收方可以发送一个范围的ACK,这样发送方就不需要猜测哪些数据包丢失了

阻塞信号

话题

路由器如何帮助主机避免阻塞

阻塞控制与避免阻塞

传统的TCP到最后会让网络进入阻塞状态然后恢复

所以我们需要好的方法来避免阻塞,而不是进行阻塞控制,碰到阻塞后重发

反馈信号

延迟和路由器信号可以让我们避免阻塞

丢包、数据包延迟、路由器信号丢可以帮助我们避免阻塞

ECN 显式阻塞信号

当路由器检测到网络阻塞时,它会在受影响的数据包的IP头中增加标记。在数据包到达接收方之后,接收方会将数据包丢掉。这样接收方就能知道网络已经发生阻塞了。然后接受方向发送方发送阻塞信号。

优点

路由器向主机发送清楚的信息

阻塞能提早检测到,避免了丢包的发生

不需要发送额外的数据包

缺点

路由器和主机需要升级才能支持ECN

我个人的观点

为什么发生阻塞的时候信号要先传递给接收方呢?然后再由接收放传递给发送方。这样不是浪费了很多时间吗?我觉得可以在发生阻塞的时候将信号直接从路由器发送到发送方,可以通过ICMP协议发送阻塞信号。这样发送方就能更早地检测到网络阻塞了。

ACK序号=数据包序号+payload长度。所以对方发送seq=10,length=5的数据包时,接收方应该回应ack seq=15,而不是14

?

原文:http://blog.csdn.net/caipeichao2/article/details/26283067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值