这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。
由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了。这门课程在2013年左右录制,知识相对还是比较新的。覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细。学完这门课程之后对计算机网络会有比较深刻的了解。
-
概述
-
课程位置
-
关于传输层和网络层的上半部分
-
-
话题
-
阻塞就类似于显示生活中的堵车
-
-
阻塞CONGESTION的本质
-
路由器或者交换机都有输入输出的缓冲
-
在一个路由器或者交换机中,如果有很多端口持续地向同一个端口发送数据,缓冲区就会被填满,从而导致大量丢包。这就是阻塞。
-
-
阻塞造成的影响
-
见图
-
当阻塞发生的时候,发送速度会明显减小。网络延迟会明显增大
-
-
带宽分配
-
就是给发送者分配合理的带宽。这是是一项很重要的任务。
-
好的分配应该是高效的,公平的。高效意味着没有阻塞发生。公平意味者每个发送者都能享受到带宽。
-
关键问题:高效的方案需要网络层和传输层共同参与。因为网络层能够察觉到拥塞,而只有传输层才能控制流量
-
为什么带宽分配很难呢
-
发送方的负载一直在变化
-
接收方的承受能力在不同的网络也是不同的
-
网络是分布式的,没有人知道整个网络的状态
-
-
解决方案
-
发送方根据自己察觉到的情况自动作出相应调整
-
设计调整策略,从而使得网络的使用率最高效最公平
-
调整是一直在进行的动作,因为负载每时每刻都在变化
-
-
-
话题
-
阻塞的本质
-
公平分配带宽
-
AIMD控制法则
-
TCP阻塞控制历史
-
ACK时钟
-
TCP慢启动
-
TCP快速重传
-
ECN阻塞规避
-
-
-
带宽公平分配
-
话题
-
什么是公平的带宽分配
-
-
回忆
-
好的带宽分配意味着公平和高效
-
实际应用中,高效比公平更重要
-
-
高效和公平的比较
-
高效和公平不能兼得
-
举例。假设现在有这样的网络流量: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