Computer Networking: A Top-Down Approach Eight edition`
计算机网络和因特网
1.1
所有因特网设备被称为主机或端系统
端系统通过通信链路和分组交换机的网络链接到一起
端系统通过因特网服务提供商(ISP)接入因特网
每个ISP自身就是一个由多台分组交换机和多段通信链路组成的网络
因特网标准规定了所有因特网协议的标准,称为请求评论(RFC)
到底什么是因特网?
因特网为应用程序提供服务的基础设施
协议定义了在两个或多个对等通信实体之间交换的报文的格式和顺序,以及报文发送/接受或其他时间所采取的操作
以太网是局域网技术:物理 + 协议
1.3
交换机主要有路由器和链路层交换机
- 存储转发传输:在交换机开始向输出电路传输该分组的第一个比特之前,必须接收到整个分组
- 排队时延和分组丢失:对于每条相连的链路,该分组交换机都有一个输出缓存(输出队列),用于存储路由器准备发往那条链路的分组。
- 转发表和路由协议
- 转发表用于将目的地址映射输出为输出链路
- 转发局部,路由全局
通过网络链路和交换机移动数据有两种方法:电路交换和分组交换
- 电路交换:预留了端系统间沿路径通信所需要的资源(缓存,链路传输速率)
- 频分复用(FDM)
- 时分复用(TDM)
- 波分复用(WDM)
- 码分复用(CDM)
- 分组交换:不预留,因特网尽最大努力以及时交付分组,但它不做任何保证
1.4
分组交换网中的时延:
- 节点处理时延:检查分组字段决定导向何处
- 排队时延:分组在链路上等待传输
- 传输时延:将所有分组的比特推向链路的时间,路由器推出分组的时间
- 传播时延:一个比特从链路起点到下一个节点的时间,分组从一个路由器到下一个路由器的时间
吞吐量:
- 瞬时吞吐量是主机B接收到该文件的速率
1.5 协议分层及其服务模型
协议层 | 传输信息 | 常见协议 |
---|---|---|
应用层 | 报文 | HTTP,FTP,SMTP |
运输层 | 报文段 | TCP,UDP |
网络层 | 数据报 | IP |
链路层 | 帧 | |
物理层 | 比特 |
- 应用层是网络应用程序及他们的应用层协议存留的地方
- 运输层提供流量控制和拥塞控制机制
- 网络层包括了网际协议和一些路由选择协议
- 网际协议(IP)定义了在数据报中的各个字段以及端系统和路由器如何作用与这些字段
- 链路层服务取决于特定的链路层协议,负责将整个帧从当前网络元素移动至路径上的下一个网络元素
- 物理层将链路层帧的一个个比特从一个节点移动到下一个节点
1.6 网络攻击
-
拒绝服务攻击(DOS),分布式拒绝服务攻击(DDOS)
-
弱点攻击
-
带宽洪泛
-
链接洪泛
-
分组嗅探
-
IP哄骗
运输层
-
TCP:
-
传输控制协议
-
报文段
-
UDP:
-
用户数据包协议
-
数据报
-
将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解
-
将运输层报文段中的数据交付道正确的套接字的工作称为多路分解
-
将来自源主机的不同数据块收集起来,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递至网络层称为多路复用
-
多路复用要求:
-
套接字有唯一标识符
-
每个报文段有特殊字段来指示该报文段要交付的套接字
- 源端口号和目的端口号
- 端口号16比特
- 每个运输层报文段最起码包括目的端口号和源端口号
-
多路分解服务:
-
在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,运输层检查目的端口号并将其定位到相应的套接字
-
一个UDP套接字是一个二元组(目的IP,目的端口号);两个UDP报文段有不同的源IP或源端口,指向相同的目的IP和目的端口,那么两个报文段将通过相同的目的套接字被定向到相同的进程。
-
一个TCP套接字是一个四元组(源IP,源端口,目的IP,目的端口);两个TCP报文段有不同的源IP或源端口,指向相同的目的IP和目的端口,那么两个报文段将通过相同的目的套接字被定向到两个不同的进程。
无连接运输:UDP
- UDP只在最基础的运输层需要提供的服务基础之上添加了一点差错检测服务
- 无需连接建立
- 无连接状态
- 分组首部开销小
- 关于发送什么数据以及何时发送控制更精细
- 可以在应用层构建可靠性,从而避免了TCP协议的拥塞控制和流量控制
UDP报文段结构
-
源端口号,目的端口号,长度,校验和分别16比特
-
校验和:发送方UDP报文段中所有16比特字的和进行反码求和时遇到的所有溢出都会回卷,得到的结果。
-
UDP提供差错检测是因为不能保证从源和目的之间的所有链路都有差错检验
可靠数据传输原理
-
发送方需要发送(函数):
-
rdt_send()
-
udt_send()
-
接收方需要(函数):
-
deliver_data()
-
rdt_rcv()
-
rdt的接收方和发送方需要往返交换控制分组,调用
udt_send()
rdt 1.0
- 假设底层信道完全可靠
- 发送方使用rdt_send发送之后只需等待上层调用
- 接收方使用rdt_rcv接受之后只需等待下层调用
rdt 2.0
- 此时分组中的比特可能会受损
- 发送方
- 自动重传请求协议(ARQ)
- 差错检测
- 接收方反馈:ACK和NAK
- 重传
- 发送方并不能从
上层
获取更多的数据,rdt_send不会出现,发送方不会发送新的数据;停等协议 - 接收方
- 接受数据,进行差错检验,根据结果返回ACK或NAK
rdt 2.1
- 传送过程中ACK或者NAK受损
- 当发送方接收到含糊不清的ACK或NAK分组时重传,但是接收方并不知道这次的分组是新的还是一次重传,冗余分组
- 发送方对数据分组进行编号,将数据分组的序号放在该字段
rdt 2.2
- 在
rdt 2.1
的基础上去掉了NAK - 接收方和发送方需要附带分组序号
rdt 3.0(比特交替协议)
- 假设除了比特受损之外,底层信道还会丢包
-
定时重传,设置一个倒数计时器,发送方每发送一个分组就会启动一个倒数计时器
-
数据传输协议的要点:校验和、序号、定时器、肯定与否定确认
流水线协议
- 停等协议浪费了大量资源,所以引入了流水线机制
- 引入流水线机制必须对RDT协议做出改变
- 增加序号范围
- 协议发送方和接收方需要缓存多个分组
- 流水线的差错恢复:回退N步和选择重传
- 回退N步(GBN)
- base:最先发出但是未被确认的分组的序号
- nextseqnum:下一个未被使用的分组的序号
- N最大长度:窗口最大长度
- 一个分组的序号承载在分组首部的一个固定长度的字段重
- GBN发送方必须响应如下几种情况
- 上层的调用:上层调用rdt_send(),GBN检查发送窗口是否已经满了;如果未满则更新变量,否则向上层反馈
- 收到一个ACK:接收方已经正确接收到ACK为n以及之前的所有分组
- 超时重传:一旦出现超时,GBN会重传所有已发送但是未被确认的分组
- 发送方只有一个定时器,每当收到一个ACK并且还有已发送未被确认的分组,重启定时器
- GBN发送方必须维护窗口的上下边界以及nextnum在该窗口中的位置
- GBN的接收方:
- 接收方只需要维护一个下一个按序接受的分组序号,expectnum
- 接收方正确收到一个序号为n的分组
- 累计确认:接收方收到为n的正确按序分组意味着之前的分组也已经按序正确收到
- 按序,接收方为分组n发送ACK,并将该分组中的数据交付到上层
- 乱序,接收方丢弃该分组,并向发送方返回最近按序接受的分组ACK
选择重传
在GBN协议中单个分组的差错就会引起大量GBN协议分组的重传,许多分组没必要重传,因此出现了选择重传(SR)
- 选择重传(SR)让发送方仅重传那些又可能出错的分组
- 这种个别的,按需的重传要求接收方逐个确认正确接收的分组
-
SR接收方也引入了接收窗口,失序的分组将被缓存,直到所有的分组都被接受为止
-
SR发送方:
- 从上层接收到数据
- 超时,每个分组都有自己的逻辑定时器,可以使用单个硬件定时器模拟多个逻辑定时器
- 收到ACK,如果该ACK分组在SR发送窗口内,则标记为已确认分组;如果该ACK对应的是send_base则整个窗口向前移动到具有最小未被确认分组处;如果窗口移动期间有序号落在窗口内的未发送分组,则发送这些分组.
- SR接收方:
- 序号在rcv_base~rcv_base+N-1内的分组被正确接受
- 如果未被接受过,则该分组被缓存,并向发送方返回一个选择ACK
- 如果是起始rcv_base序号,则按序向上层传送以该序号为起始的已经缓存的分组
- 序号在rcv_base - N ~ rcv_base - 1 的序号,必须产生一个ACK,即使接收方之前确认过
- 其余情况,忽略
- 对于SR协议而言,窗口长度必须小于或等于序号空间大小的一半
- 在分组被重新排序的情况下,我们必须确保一个序号不被重新使用,除非发送方确信任何先前发送的序号为x的分组都不在网络中为止,通过假设一个分组在网络中的存活时间不会超过某一个最大量来实现.
有链接运输:TCP
- tcp是面向连接的,三次握手
- TCP运行在端系统中,中间的网络元素不会维持TCP的链接状态,对于他们而言只是数据包
- TCP是全双工服务,Poin2Point
客户端通过socket套接字传递数据
- 客户端通过socket套接字来传递数据流,TCP将数据引导到发送缓存中
- TCP可以从发送缓存中取出并放入报文段的大小取决于
MSS
MSS
通常由本地主机发送的最大链路层帧长度MTU
来设置MSS
保证一个TCP报文段封装在IP
数据报中,加上TCP/IP
首部长度(通常40字节)- MTU一般为1500字节,MSS一般为1460字节
TCP链接的每一端都有各自的发送缓存和接收缓存 TCP链接一般由一台主机的变量,缓存以及套接字和另外一台主机的相应元素组成
TCP报文段结构
- TCP报文段由首部字段和数据字段组成,数据字段大小被MSS限制
- 首部字段包括:
- 源端口号和目的端口号:用于多路复用/多路分解
- 序号和确认号:用于TCP双方实现可靠数据传输
- 序号是该报文段首字节的字节流编号.
- 确认号表明了源主机希望目的主机发送的下一字节的序号
- 首部长度:因为TCP首部字段是变长的(通常选项为空的时候,大小为20字节),该字段指示了以32比特的字为单位的TCP首部的长度
- 保留未用:
- 标志位:
- ACK:用于确认
- RST,SYN,FIN:用于链接建立和拆除
- URG:用于指示报文段存在着"紧急数据",紧急数据由16比特的紧急数据指针指出
- 接受窗口:用于流量控制
- 因特网校验和:检查校验和
- 紧急数据指针:
-
选项:可选与变长,用于发送方和接收方协商最大报文字段长度
-
一条TCP链接的双方均可随机选择序号
- TCP被称为提供累计确认
往返时间的估计与超时
- 样本时间 SampleRTT
- 维护一个均值 SampleRTT,EstimateRTT
- $EstimateRTT=(1-\alpha)EstimateRTT + \alphaSampleRTT$
- 一般$\alpha$的值取0.125
- 这种指数加权移动移动平均(EWMA)
- 测量 EstimateRTT变化
- $DevRTT=(1-\beta)DevRTT+\beta*|SampleRTT-EstimateRTT|$
- $\beta$为0.25
- 如果SampleRTT变化小DevRTT值也小
- 超时间隔TimeoutInterval设置为EstimateRTT加上一点余量
- $TimeoutInterval=EstimateRTT+4*DevRTT$
- 一般初始Time设置为1秒,如果出现超时,Time加倍,直到收到报文段才会使用上述公式再次计算Time
可靠数据传输
TCP主要3个事件有关:从上层应用程序接收数据、定时器超时、收到ACK
- 从上层应用程序接受数据:启动定时器,更新Nextseqnum
- 定时器超时:TCP重传引起超时的报文段,TCP重启定时器
- 收到ACK:TCP是累计确认,收到y代表y之前的所有字节序列都已经正确被接受,如果y大于sendbase,则代表该ACK在确认一个或多个先前未被确认的报文段;如果当前仍有未确认的报文段,TCP还要重启定时器
超时间隔加倍
- TCP重传具有最小序号的还未被确认的报文段
-
每次TCP超时重传的时间间隔是先前的两倍,而不是通过EstimatedRTT个DevRTT推算的值
-
当定时器在另外两个时间触发的时候(收到上层应用数据和收到ACK)TimeoutRTT被更新为推算出来的值
快速重传
- 因为超时重传的时间间隔可能很长,会增加了端到端时延
- 当TCP发送方连续收到三个冗余ACK的时候就会出发快速重传
- 快速重传:在该报文段定时器过期之前,迅速重传之前丢失的报文段
TCP差错恢复机制
- TCP的差错恢复机制为GBN和SR的混合体
- TCP接收方优选择地确认失序报文段,将正确接收但是失序的报文段缓存起来
流量控制
- 经过TCP发送的数据会到达接收方的TCP缓存中等待应用程序调用,但是如果TCP发送的数据速度过大会导致接收方缓存溢出
- 流量控制是一个速度匹配服务,即发送方和接收方应用程序的读取速率相匹配
- 拥塞控制和流量控制都是对发送方的遏制,但是引起二者的原因不同
流量控制的实现
- TCP让发送方维护一个接受窗口来进行流量控制,接收窗口用于给发送方指示接收方还有多少可用的缓存
- 接收缓存大小:RcvBuffer
- LastByteRead:接收方用用程序从数据流中读取的最后一个字节的编号
- LastByteRcvd:接收方缓存的数据流最后一个字节的编号
- LastByteRcvd - LastByteRead <= RcvBuffer
- 接受窗口用rwnd表示
- rwnd = RcvBuffer - [LastByteRcvd - LastByteRead]
- rwnd是动态变化的
- TCP发送方
- LastByteSent:最后一个发送的字节的序号
- LastByteAcked:最后一个被确认的字节的序号
- LastByteSent - LastByteAcked <= rwnd
- 通过将未确认的值控制在
rwnd
之间就可以保证接收方缓存不会溢出 - TCP接收方仅当有数据或有确认要发时才会发送报文段给TCP发送方
- TCP接受缓存满了之后,发送方就不会发送数据,但是此时接收方已经释放了新的缓存,需要告知发送方
- 发送方会继续发送只有一个字节数据的报文段,这些报文段会被接收方接受,开始清理缓存,并且确认报文中含有一个非0 rwnd的值
TCP链接管理
-
三次握手
-
TCP客户端发送不含应用数据的SYN报文段,标志位SYN被置为1
-
服务器接收到该报文,并为这个TCP链接分配缓存和变量,向客户端发送报文,SYN被置为1,确认号为client_server + 1,序号为server_client,这个允许链接的报文段被称为SYNACK报文段
-
客户端收到SYNACK之后,客户为该链接分配缓存和变量,同时向服务器进行了确认,该SYN比特被置为0,此时可以负载客户到服务器的数据
-
关闭释放链接
- 客户端
- 客户端发送报文段,FIN比特位置为1,变为FIN_WAIR_1状态
- 客户端收到服务器ACK之后变为FIN_WAIR_2状态
- 接收到服务器的FIN之后变为TIME_WAIT状态,等待30秒,进入CLOSED状态
-
服务器端
- 服务器接收到客户端的FIN后,向客户端发送ACK
- 服务器向客户端发送FIN,接收到ACK之后关闭链接
-
当端口号或源IP与套接字不匹配的时候,目的主机向源主机发送一个特殊重置报文RST
- 当收到UDP套接字不匹配,发送ICMP数据包
- nmap就是这种方式来扫描端口
- 收到TCPSYNACK报文,则目标主机一个应用程序使用TCP在该端口运行
- 收到TCP RST报文,目标主机该端口没有运行TCP程序,但是没有防火墙等阻挡
- 什么也没收到,证明被防火墙等阻挡
拥塞控制原理
拥塞原因和代价
- 分组的到达速率接近链路容量,分组经历巨大的排队时延
- 发送方必须重发来补偿因为缓存溢出而丢弃的分组
- 发送方因为遇到大时延所进行的不必要重传会引起路由器使用其有限链路带宽来转发不必要的分组
- 竞争路由器R上的优先缓存空间,当载荷过大的时候会导致A-C端吞吐量趋近于0
- 一个分组在一条路径被丢弃时,每个上游路由器用于转发该分组的传输容量都被浪费掉了
拥塞控制方法
- 端到端拥塞控制,网络层没有为运输层提供显式支持
- 网络辅助的拥塞控制,路由器向发送方提供关于网络中拥塞状态的显式反馈信息
- 阻塞分组
- 路由器标记或更新从发送方向接收方的分组中的某个字段,接收方接收后会向发送方通知该网络拥塞指示(该方法至少需要一个RTT)
TCP拥塞控制
经典TCP拥塞控制
-
Tcp所采用的方法是让每一个发送方都能感受到网络拥塞程度来限制其能向链接发送流量的速率
-
怎么感知拥塞程度?
-
如何限制?
-
采用什么算法来改变速率?
-
运行在TCP发送端拥塞控制机制跟踪一个额外变量,拥塞窗口
cwnd
-
LastByteSent - LastByteRead <= min{cwnd,rwnd}
-
通过调节cwnd的值来调整发送方向链接发送数据的速率
-
丢包事件发生代表着拥塞:
-
超时
-
收到三个冗余ACK
-
TCP通过确认来增大拥塞窗口长度,TCP被称为自计时
-
TCP拥塞控制算法:慢启动,拥塞避免,快速恢复
-
慢启动
- cwnd以一个MSS开始启动,每次被确认的时候cwnd加倍
- 遇到超时,cwnd被设置为1个MSS,重启慢启动过程.慢启动阈值ssthresh被设置为cwnd/2
- 到达或超过阈值ssthresh的时候,TCP结束慢启动进入拥塞避免模式
- 遇到3个冗余ACK,TCP执行快速重传,并进入快速恢复状态
- 一般重传只有在定时器超时才会重传
- 快速重传则是不需要等待定时器过期,直接重传丢失的报文段
- 拥塞避免
- 每个RTT,cwnd增加一个MSS
- 遇到超时,与慢启动一样,cwnd被设置为1MSS,ssthresh被设置为cwnd/2
- 遇到3个冗余ACK,cwnd减半(已收到的3个冗余ACK,也需要加3个MSS),ssthresh设置为cwnd/2,进入快速恢复状态
- 快速恢复
- 在快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,每当收到冗余ACK,cwnd就增加一个MSS.最终当对丢失报文的一个ACK到达时,TCP降低cwnd后进入拥塞避免状态.
- 遇到超时,与慢启动和拥塞避免一样,执行相同操作,并进入慢启动状态
#### 网络辅助的拥塞控制
- 明确拥塞通告(ECN)
- ECN明确涉及TCP和IP,有两个比特用于ECN,这两个比特位于IP数据报的服务类型字段中
- 当接收方收到的数据包中包含网络层设置的ECN信号时,在返回TCP ACK报文段的ECE比特置位,发送方收到TCP ACK之后会对ECE指示做出反应,并在下一个发送的报文段中对CWR(拥塞窗口缩减)比特进行置位
- 除了TCP以外的运输层协议也可以利用网络层发送ECN信号
公平性
- UDP流量会压制TCP的流量传送
- 有的应用程序会同时开启多个并行TCP链接,也会占用大量带宽.
运输层功能演化
- 待补充...
网络层:数据平面
- 网络层中的每一台主机和路由器都有一个网络层的部分,网络层可以被分解为两个相互作用的部分:数据平面和控制平面
-
数据平面主要是网络中每台路由器的功能,该数据平面功能决定到达路由器输入链路之一的数据包如何转发到输出链路之一
-
目前的转发主要包括基于数据报目的地址的转发以及通用转发(基于数据报首部不同几个域的值执行转发和其他功能)
网络层概述
- 数据平面主要作用是从其输入链路向其输出链路转发数据报
-
控制平面主要作用是协调这些每本地路由器的转发操作,使数据报沿着源和目的主机之间的路由器路径最终进行端到端传送
-
路由器不运行应用层和运输层协议
转发和路由
- 转发:当一个分组到达路由器的输入端口时,路由器需要选择合适的输出端口将其转发出去,转发是在数据平面唯一实现的功能
- 路由选择:分组从发送方流向接收方,网络层必须决定这些分组所选择的路径或路由,计算这些路径的算法被称为路由选择算法
- 转发通常由硬件实现,是路由器本地操作
- 路由选择通常由软件实现,是网络范围处理过程
- 转发
- 每台路由器都具有转发表,路由器检查到达分组首部的一个或多个字段来在其转发表中进行索引查找输出链路接口
- 路由选择算法决定转发表的值
- 传统方法:每台路由器都有一个与其他路由器进行路由选择通信的路由选择组件,通过路由选择协议交换包含路由选择信息的路由选择报文
- SDN方法:远程控制器进行计算、分发路由表,本地路由器只负责转发。路由器和远程控制器通过交换包含转发表和其他路由选择信息的报文
- 因特网的网络层只提供了尽力而为服务
- 路由器和交换机都属于分组交换机
路由器工作原理
- 路由器基本组件包含:
- 输入端口(硬件实现)
- 与数据链路层进行交互
- 执行查找功能:通过查询转发表决定路由器的输出端口
- 到达的分组经过交换结构发送到输出端口,控制分组从输入端口转发到路由选择处理器
- 输出端口(硬件实现)
- 存储从交换结构接受的分组并执行必要的链路层和物理层功能在输出链路上传输这些分组
- 交换结构(硬件实现)
- 将输入端口连接到输出端口
- 路由选择处理器(CPU)
- 执行控制平面的功能
- 传统路由器中:执行路由选择协议,维护路由选择表和相关链路状态信息,为路由器计算转发表
- SDN路由器中:负责与远程控制器通信,接受远程控制器计算的转发表项,并在路由器输入输出端口安装这些表项
- 输入端口的处理
- 输入端口执行查找转发表功能来决定输出端口
- 转发表是由路由选择处理器计算和更新得出的
- 转发表是由选择处理器经过独立总线复制到线路卡
- 转发决策能在每个输入端口本地做,而无需基于每个分组调用集中式路由选择处理器
- 基于目的转发
- 最长前缀匹配
- 存在默认转发链路接口
- 可能分组被阻塞排队在输入端口
- 交换
- 经内存交换
- 在CPU操作下,使用共享内存交换
- 经总线交换
- 通过共享总线交换,输入端口为分组加上交换机内部标签然后发送给所有的输出端口,输出端口会进行匹配
- 经互联网络交换
- 通过2N条总线来组成互联网络,链接N个输入端口和N个输出端口
- 输出端口
- 取出存放在输出端口内存中的分组并将其发送到输出链路中
- 排队
- 输入排队
- 交换机速度没有达到让所有分组无时延的交换
- 输出排队
- 弃尾:丢弃刚到达的分组或者删除一个或多个已排队的分组
- 在缓存填满前丢弃一个分组或者在首部加上标记来向发送方提供一个拥塞信号
- 吞吐量和最小的时延都很重要
- 分组调度
- 先进先出
- 优先权排队
- 循环排队:按照类别进行传输
- 加权公平排队:根据每个类别等待的分组数量来计算权重
IPv4数据报和寻址
IPv4
-
IPv4数据报格式
-
版本号:4bit,规定了数据报的IP协议版本
- 首部长度:4bit,IPv4数据报包含一些可变数量的选项,通过该字段来确定运输层报文段实际开始的地方,一般具有20字节的首部
- 服务类型:8bit,区分开不同类型的数据报:实时数据报、非实时数据报等
- 数据报长度:16bit,IP数据报总长度(首部+载荷),IP数据报理论最大长度为65535字节
- 标识、标志、片偏移:这三个字段与IP分片有关(IPv6就取消了),一个大的IP数据报被分为几个小的IP数据报然后被发送到目的主机进行重新组装
- 寿命:TTL,每经过一台路由器,TTL-1,TTL为0丢弃该数据包
- 协议:指明了该IP数据报交给哪一个上层运输层协议
- 协议号将网络层和运输层绑定在一起
- 端口号将运输层和应用层绑定到一起
- 首部校验和:16bit
- 用于帮助路由器检测收到的IP数据报中的比特错误
- 根据首部中的字段值来进行计算的,每台路由器都会重新计算,因为TLL字段以及可能的选项字段会改变
- 重复检测是因为可能存在不同的协议搭配
- 源和目的IP地址:都是32bit
- 选项:选项字段允许IP首部被扩展
-
数据(有效载荷):送往运输层的报文段(TCP/UDP,也可以是ICMP)
-
IPv4编址
- 每个接口都具有IP地址
- 路由器具有多个接口
- 每台主机和每个路由器接口都具有各自的IP地址
- 每个IPv4地址长度为32bit(4字节)
- IP地址需要由其链接的子网来决定
- 子网掩码
- 三个主机接口和一个路由器接口形成了一个子网
- 无类别域间路由选择(CIDR编址),a.b.c.d/x
- x高比特构成了IP地址的网络部分
- 路由聚合
- 32-x比特被用于区分组织内部设备
- 分类编制
- IP地址的网络部分被限制为8、16、24比特,分别代表A、B和C网络
- 255.255.255.255为IP广播地址,0.0.0.0为自身的IP地址,用于在一些特殊场合
DHCP(动态主机配置协议)
- DHCP允许主机自动获取一个IP地址(可以配置为相同IP地址或者临时IP地址)
- DHCP还得知其余信息,子网掩码,第一跳路由地址(网关),本地DNS服务器地址等
- 客户-服务器协议:客户通常是新到达的主机,需要获得包括自身IP地址等信息
- 理想情况下每个子网具有一台DHCP服务器或者DHCP中继代理,该代理知道该网络DHCP服务器的地址
- DCHP客户和服务器交互
- DHCP服务器发现:客户机发送DHCP发现报文,UDP,端口号67,广播目的地址255.255.255.255,以及“源主机IP”0.0.0.0
- DHCP服务器提供:服务器发送DHCP提供报文,广播255.255.255.255,报文中包含推荐IP地址、网络掩码、IP地址租用期等
- DHCP请求:客户从一个或多个服务器提供中选择一个,并向其发送DHCP请求报文响应,回显配置的参数
- DHCP ACK:服务器用DHCP ACK 报文对DHCP请求报文进行响应,证实参数
- DHCP还提供了机制来允许客户更新对一个IP地址的租用
NAT(网络地址转换协议)
- NAT(网络地址转换)
- NAT对外界相当于具有单一IP地址的单一设备
- NAT对外界隐藏了子网的细节
- 路由器从ISP的DHCP服务器得到NAT地址
- NAT路由器具有一张NAT转换表,表项中包含了端口号和其IP地址
- 路由器重写数据报的ip地址和端口
- 向外界发送
- 源IP替换为NAT IP地址
- 源端口替换为NAT中空余端口
- 从外界接受
- 目的IP根据NAT转换表通过端口来查询
- 替换目的IP
- NAT属于中间盒
- 中间盒不执行传统的数据报转发,而是执行诸如NAT、流量负载均衡、流量防火墙等功能
IPv6数据报和寻址
- IPv6数据报格式
- 扩大的地址容量:由32比特升为128比特,并引入了除单播和多播之外的任播
- 简化高效的40字节首部:定长40字节首部
- 流标签:给特殊流的分组加上标签(音频视频等)
- IPv6数据报
- 版本:IP版本号
- 流量类型:服务类型,区分不同类型的IP数据报
- 流标签:20bit,对一条流中的某些数据报给出优先级
- 有效载荷字段:40字节首部字段后的数据载荷字节数量
- 下一个首部:标识数据报交付给哪个协议(TCP、UDP)
- 跳限制:约等于TTL
- 源地址和目的地址:128bit
- 数据:数据载荷部分
- 从IPv4到IPv6的迁移
- IPv6兼容IPv4
- IPv4网络设备不支持IPv4
- 解决办法:建隧道
- 两个IPv6节点通过IPv4网络设备传输的时候,将IPv6数据报放到一个IPv4数据报的载荷字段
- IPv6接收端通过观察该IPv4的协议号字段41来判断有效载荷和IPv6数据报
泛化转发和SDN
- 转发可以概括为匹配和操作
- 在泛化转发中,操作可以包括许多不同种操作
- 每台分组交换机中都有匹配加操作表,该表由远程控制器计算、安装和更新
- OpenFlow是泛化转发中一种协议
- 匹配加操作转发表在OpenFlow中称为流表,每个表项包括
- 首部字段值的集合:入分组将与之匹配,基于硬件的匹配执行最为迅速,匹配不上的流表将会被丢弃或发送到远程控制器做更多的处理
- 计数器集合:当分组与流表项匹配时更新计数器
- 操作集合:当分组匹配流表项时所采取的操作集合
- 匹配
- OpenFlow 1.0流表具有11个分组首部字段和入端口ID(最近已经增加到了41个)
- OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配
- 入端口是指分组交换机上接受分组的输入端口
- 流表项也具有通配符
- 操作
- 每个流表项都具有零个或多个操作列表
- 转发
- 丢弃
- 修改字段
- ...
- SDN控制器计算和分发流表,协议用于在分组交换机和它的控制器之间进行通信
- 中间盒
- "在源主机和目的主机之间的数据路径上,执行除了IP路由器的正常标准功能之外的其他功能的任何中间的盒子"
- 大致包括以下三种
- NAT转换
- 安全服务:防火墙基于首部字段值或重定向分组来阻塞流量,从而进行附加处理
- 性能增强
随着中间件的增多,单独的专用硬件、单独的专用软件堆栈等都意味着巨大的成本和投资费用。因此,研究人员正在探索使用商用硬件(网络、计算和服务),并试图在通用软件堆栈上构建专门的软件来实现这些服务,而这就是SDN采用的方法,网络功能虚拟化(NFV);另一种被探索的方法是把中间盒功能外包给云。
- IP沙漏
- 端到端原则
网络层:控制平面
控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理
概述
- 转发表(基于目的地转发的场景)和流表(泛化转发的场景)
- 计算、维护和安装流表以及转发表
- 每路由器控制
- 每台路由器具有一个路由选择组件,用于和其他路由器路由选择组件通信
- 逻辑集中式控制
- 逻辑集中式控制器计算并分发转发表以供每台路由器使用
- 该控制器与每台路由器中的控制代理(CA)进行交互,CA一般只具有与控制器通信并按照控制器命令行事这一种功能
- 与每路由器控制中的CA不同,这些CA之间不能直接相互交互,也不能主动参与计算转发表
路由选择算法介绍以及划分
- 路由选择算法目的是从发送方到接收方的过程中确定一条通过路由器网络的好路径(最低开销的路径)
- 根据集中式和非集中式来划分
- 集中式路由选择算法
- 用完整的、全局的网络知识计算出从源到目的地之间的最低开销路径
- 集中式算法具有关于连通性和链路开销方面的完整信息
- 具有全局状态信息的算法常被称作链路状态(LS)算法,该算法必须知道网络中每条链路的开销
- 分散式路由选择算法
- 路由器以迭代、分布式的方式计算最低开销路径,没有节点拥有关于所有网络链路开销的完整信息
- 每个节点仅有与其直接相连链路的开销知识,然后通过迭代计算过程以及相邻节点的信息交换来确定最低开销路径
- 距离向量(DV)算法,分散式路由选择算法,每个节点维护到网络中所有其他节点的开销(距离)的向量
- 根据静态和动态来划份
- 静态路由选择算法,路由随时间变化非常缓慢,通常是人工进行调整
-
动态路由选择算法,随着网络流量负载或拓扑发生变化而改变路由选择路径
- 易受到诸如路由选择循环、路由振荡之类问题的影响
-
根据负载敏感和负责迟钝来划分
- 负载敏感算法,链路开销会动态地变化以反映出底层链路的当前拥塞水平
- 负载迟钝算法,某条链路的开销不明确反应当前或最近的拥塞水平(主流)
链路状态路由选择算法(LS)
- 通过链路状态广播算法,向每个节点向网路中所有其他节点广播链路状态分组,每个分组包含它所连接的链路的标识和开销
- 每个节点都具有网络的统一、完整视图,然后每个节点都能够运行LS算法并计算出相同的最低开销路径集合
- 链路状态路由选择算法(LS):Dijkstra算法
- Djkstra算法计算出某节点到所有其他节点的最低开销路径
- 当同一链路两个方向负载不同时,会出现振荡情况
- 该情况不仅出现在LS中,它出现在任何使用拥塞或基于时延的链路测度算法中
- 让所有路由器并非同时运行LS算法来解决这种问题
- 为了避免自同步,将通告时间随机化
距离向量算法DV
- 距离向量算法是一种迭代的、异步的和分布式算法
- 分布式:每个节点都要从相邻节点获取信息、计算然后向邻居分发
- 迭代:此算法一直持续到没有信息交换为止
- 异步:不要求所有节点相互之间步伐一致
- Bellman-Ford算法
- 节点唯一具有的信息是它到直接相连邻居的链路开销和它从这些邻居接收到的信息,每个节点具有初始路由选择表
- 从邻居接受更新距离向量、重新计算路由选择表项和通知邻居到目的地的最低开销路径的开销,循环往复直到没有更新,该算法进入静止状态
- 为了避免路由选择环路
- 如果z通过y路由到达x,则z将通告y,z到x的距离是无穷大的即,Dz(x)为无穷
- 只要z经y路由选择到x,z就持续这样做
LS和DV路由选择算法比较
- 报文复杂度:LS每次链路状态发生改变就要向所有节点发送新的链路开销,DV算法仅当新的链路开销导致与该链路相连的最低开销路径发生变化时才传播新的开销
- 收敛速度:DV慢,且在收敛时会遇到路由选择环路以及无穷计数问题
- 健壮性:
- LS,路由计算在某种程度上是分离的,提供了一定的健壮性
- DV,一个不正确值会扩散到整个网络
因特网自治系统内部路由选择:OSPF
- 随着路由器数目变得巨大,成本和规模将会高的不可实现
- 因特网时ISP的网络,每个ISP都有自己的路由器网络
- 引入自治系统(AS)
- 每个AS由一组在相同管理控制下的路由器组成,通常在一个ISP和互联他们的链路构成一个AS
- 一个ISP可以拆分为多个AS
- 每个AS都有唯一的ASN号标识
-
一个自治系统AS内部的路由选择算法叫做自治系统内部路由选择协议
-
开放最短路优先(OSPF)
- OSPF是一种链路状态协议,洪泛链路状态信息和Dijkstra最低开销路径算法,使用OSPF,一台路由器构建了一幅关于整个自治系统的完整拓扑图
- OSPF提供了一种机制来让网络管理员为给定的链路权值集合确定最低开销的路由选择
- 管理员设置不同的权重来实现不同的功能,最少跳等
- OSPF路由器向AS内所有路由器广播路由选择信息,即使状态未发生改变,它也周期性的广播链路状态(增加了健壮性)
- OSPF通告包含在IP报文中,对OSPF其上层协议的值为89,因此OSPF必须自己实现诸如可靠报文传输、链路状态广播等功能
- OSPF的优点:
- 安全:能够鉴别OSPF路由器之间的交换
- 多条相同开销的路径:存在多条相等开销路径时,无需选择单一路径承载所有流量
- 单播和多播路由选择的综合支持
- 支持在单个AS中的层次结构:一个OSPF自治系统能够层次化配置多个区域
- 每个区域,一台或多台区域边界路由器负责为该区域以外的分组提供路由选择
- 每个AS中,只有一个OSPF区域被配置为主干区域,主干区域为该AS中其余区域之间的流量提供路由选择
- 该主干包含所有的区域边界路由器和部分非边界路由器
- AS中的路由选择要求,分组先到达区域边界路由器,然后通过主干区域到达目的区域的区域边界路由器,进而到最终目的地
ISP之间的路由选择:BGP
-
当分组跨越多个AS进行路由时,需要一个自治系统间路由选择协议
-
在因特网中所有的AS运行相同的AS间路由选择协议,称为边界网关协议
- BGP将因特网中数以千计的ISP粘合起来(因特网中协议唯一可能竞争者是IP协议)
- BGP是一种分布式和异步的协议
BGP作用
- 每个路由器具有一台转发表,对于位于相同AS的目的地而言,转发表表项由AS内部路由协议决定,对于AS外部的目的地由AS间协议决定
- BGP中分组路由到一个CIDR化的前缀,其中每个前缀代表一个子网或一个子网的集合
- (x,i)形式
-
x代表前缀(138.16.68/22),i代表路由器的接口之一的接口号
-
BGP需要完成
- 从邻居AS获得前缀的可达性信息,BGP允许每个子网向因特网其余所有部分通告它的存在,BGP确保因特网中过的所有AS知道该子网
-
确定到该前缀的最好的路由,一台路由器可能直到多条通往同一前缀的不同路由,路由器本地运行一个BGP路由选择过程(使用从相邻路由器获得的的前缀可达信息),该最好的路由基于策略以及可达性信息来确定
-
通告BGP路由信息
- 每个AS内部每台路由器要么是一台网关路由器,要么是一台内部路由器
- 网关路由器位于AS边缘,它链接到其他AS的一台或多台路由器
- 内部路由器仅连接在他自己AS中的主机和路由器
- 在BGP中每台路由器使用179端口的半永久TCP链接交换路由选择信息
- 每条直接连接以及所有通过该链接发送的BGP报文称为BGP链接
- 跨越两个AS的BGP链接称为外部BGP链接(eBGP)
- 相同AS内部的BGP链接称为内部BGP链接(iBGP),iBGP不总是与物理链路相对应
- 确定最好的路由
- 路由器通过BGP链接通告前缀时,前缀包括一些BGP属性,前缀及其属性称为路由
- 两个重要的属性是
AS-PATH
和NEXT-HOP
- AS-PATH包含通告已经通过的AS的列表
- BGP路由器还通过该属性检测和防止通告环路(在通告中发现了它自己,拒绝该通告)
- NEXT-HOP是AS-PATH起始的路由器接口的IP地址
- 热土豆路由选择
- 从所有可能的路由中选择到开始该路由的NEXT-HOP路由器具有最小开销的路由
- 相同AS内部的两台路由器到达一个目的地可能具有不同AS路径
- 转发表增加AS向外前缀时,AS间路由选择协议和AS内部路由选择协议都要用到
- 路由器选择算法
- 实际的BGP路由选择算法更为复杂
- 进入BGP路由选择算法的输入是到某前缀的所有路由的集合,该前缀是已被路由器学习和接受的,仅有一条时选择该路由,否则顺序调用以下规则
- 路由被指派一个本地偏好值作为其属性之一,它取决于该AS的网络管理员,最高本地偏好值路由被选择
- 最短AS-PATH路由,如果该规则是唯一规则,BGP将使用距离向量算法决定路径,其中距离测度使用的是AS跳的跳数,而不是路由器跳数
- 使用热土豆路由选择,最靠近NEXT-HOP路由器的路由
- 使用BGP标识符选择路由
- IP任播
- BGP还常被用作实现IP任播服务,DNS常使用该服务
- CDN为他的多台服务器指派相同的IP地址,并使用BGP来通告这些服务器的IP地址,而处于不同的客户访问该IP会被引导至不同的不同的服务器(最近)
- DNS中,根服务器具有13个IP地址,但是每一个IP地址具有多台服务器,这些服务器分布在各地,用户访问这些根服务器时将通过IP任播路由到最近的根服务器
SDN控制平面
- 控制分组在网络的SDN使能设备中转发网络范围逻辑
- SDN四个关键特征
- 基于流的转发:能够基于运输层、网络层或链路层中任意数量的首部字段值进行;SDN控制平面的工作是计算、管理和安装所有网络交换机中的流表项
- 数据平面和控制平面分离
- 数据平面由网络交换机组成,执行”匹配+操作“的规则
- 控制平面由服务器以及决定和管理交换机流表的软件组成
- 网络控制功能:位于数据平面交换机外部,控制平面本身有两个组成
- 一个SDN控制器(网络操作系统)
- 控制器维护准确的网络状态信息,为网络控制应用程序提供这些信息
- 提供方法来让应用程序能够监视、编程和控制下面的网络设备
- 控制器是逻辑上集中,通常由几台服务器实现
- 若干网络控制应用程序:
- 可编程的网络:
- 运行在控制平面上的网路控制应用程序,使用了SDN控制器提供的API来定义和控制网络设备的数据平面
- SDN促进了网络的分类,让计算硬件、系统软件和应用程序的分类,为计算机网络领域的创新提供了丰富、开放的生态系统
SDN控制器
- 通信层:SDN控制器和受控网络设备之间的通信,需要一个协议来传送控制器与这些设备之间的信息(OpenFlow)
- 网络状态管理层:由SDN控制平面所作出的最终控制决定,具有各类最新状态信息
- 对于网络控制应用程序的接口:控制器通过他的”北向“接口和应用程序交互,该API允许应用程序在状态管理层之间读/写网络状态和流表,当状态改变事件出现时,应用程序能够注册进行通告
OpenFlow协议
- OpenFlow协议运行在SDN控制器和SDN控制的交换机或其他实现OpenFlow API的设备之间
- 运行在TCP之上,使用6653默认端口
- 控制器流向受控交换机重要报文:
- 配置:该报文允许控制器查询并设置交换机的配置参数
- 修改状态:该报文由控制器使用,以增加/删除或修改交换机流表中的表项,并设置交换机端口特性
- 读状态:从交换机的流表和端口收集统计数据和计算器的值
- 发送分组:在受控交换机从特定的端口发送一个特定的报文
- 受控交换机流向控制器重要报文:
- 流删除:通知控制器已删除一个流表项
- 端口状态:通知端口状态变化
- 分组入:一个分组不与所有流表项匹配,这个分组被发给控制器进行额外处理
ICMP:因特网控制报文协议
- ICMP被主机和路由器用来彼此沟通网络层的信息
- ICMP的最典型用途是差错报告
- ICMP作为有效载荷承载在IP报文段中
- 指明上层协议为ICMP的IP数据报,分解出该数据报内容给ICMP
- ICMP报文由一个类型字段和一个编码字段,并且包含引起该ICMP报文首次生成的IP数据报的首部和前8个字节(以便发送方能确定引起该差错的数据报)
- ICMPv6还增加了新兴IPv6功能所需的新类型和编码
- 分组太大
- 未被认可的IPv6选项
- 。。。
数据链路层
期末速成
TCP发送方维持拥塞窗口
TCP接收方维持接收窗口
物理层
奈式定律
香浓定律
采样频率为实际频率的2倍以上
码元 = log2比特数
信噪比(db) = 10 log10 S/N
波特率是指单位时间内传送二进制数据的位数,单位用bps(位/秒)*表示,记作*波特
4相位代表两个比特位,2400bps = 1200波特
数据链路层
最长数据帧为1500B
最小数据帧长度 = 2 * 传播时延 * 数据传输速率
以太网中 Hub 传输速率为100Mb/s
以太网最小帧长度 64B
CRC差错检验
交换机表
网络层
RIP协议
- 将传送来的RIP报文中的下一跳替换为发送来的路由器编号,距离加+1
- 如果当前路由器没有该网络直接加1
- 如果有该网络,并且下一跳地址也是发送来的路由器,则直接替换
- 如果有该网络,但是不是该路由,选择较短的路径
- 3分钟未收到,置为不可达(16)
运输层
应用层
@ 考试结束,完结