zhpisnotphz

网络层详解

一、概述

  • Forwarding and Routing:

    • 路由是利用各种路由算法,获取到目的节点(或目的网络)的路径,生成路由表。

    转发是路由器收到一个包之后,根据路由表的内容,将包发送出去。

    • Forwarding refers to the router-local action of transferring a packet from an input link interface to the appropriate output link interface.
      Forwarding takes place at very short timescales (typically a few nanoseconds), and thus is typically implemented in hardware.
      • 更短的时间(相较于routing)
      • 主要是在硬件上实现
    • Routing refers to the network-wide process that determines the end-to-end
      paths that packets take from source to destination. Routing takes place on much longer timescales(typically seconds), and as we will see is often implemented in software
      • 更长的时间
      • 在软件层面实现
  • Control Plane

    • 传统网络和SDN网络的辨析
  • 网络层模型应该具备的:

    • Guaranteed delivery
    • Guaranteed delivery with bounded delay.
    • In-order packet delivery.
    • Guaranteed minimal bandwidth
    • Security

二、路由器

### Input Ports
  • 三个box从左到右分别是,处理物理层、链路层和网络层
  • 最重要的look up function在第三个box
  • 控制包将从input ports被发送到 routing processor

  • 上图体现了输入端口更详细的内容
  • 在许多路由器中,都是在input port来确定一个到达的分组经交换结构转发给哪个输出端口
  • 输出端口的选择是通过转发表
  • 转发表是通过选路处理器计算的,但是通常一份转发表的影子拷贝会被存放在每个输入端口
  • 这样是为了能够在输入端口本地做出转发决策,而无需调用中央选路处理器
  • 分散式的转发能够避免在路由器中的某个单点产生转发处理的瓶颈。
  • 输入接口的查询:
    • 采用 longest prefix matching rule的方式

Switching fabric

  • The switching fabric connects the router’s input ports to its output ports. This

    switching fabric is completely contained within the router—a network inside of a network router!

  • 交换的方式:

    • Switching via memory

      若内存带宽为每秒可写进或读出B个分组,则总的转发吞吐量必然小于B/2

    • Switching via a bus

      带宽受到总线速率的限制

    • Switching via an interconnection network.

      现在的发展趋势,

      但是,如果来自两个不同输入端口的两个包被发送到同一个输出端口,那么其中一个将不得不在输入端等待

Output ports

从switch fabric接收数据之后再以与input port相反的顺序发送出去

Routing Processor

  • The routing processor performs control-plane functions

  • 传统路由器中:

    • 执行路由协议
    • 维护路由表
    • 附加链路状态信息
    • 为路由器计算转发表( computes the forwarding table for the router)
  • 在SDN路由器中?可恶,为什么又是SDN

其他

  • 路由器的输入端口,输出端口以及交换组织都是用硬件实现

    至于为什么,我也没看懂

  • control plane则是用软件实现

    我也没看懂为什么

排队、阻塞

三、IP协议:IPv4 、地址、IPv6等

IPv4

  • Version number:(4bits) IP协议版本号

  • Header length:(4 bits) 头部长度,需要这4位来确定负载在IP数据报中的位置(例如,传输层段封装在该数据报中)固定部分是20字节

  • Type of service

  • Datagram length (16位长),IP数据报最长为65535字节

    这是包括头部的吗?????????

  • Identifier, flags, fragmentation offset. These three fields have to do with so-called IP fragmentation, a topic we will consider shortly. Interestingly, the new version of IP, IPv6, does not allow for fragmentation.

  • Time-to-live (TLL) 确保数据报不会一直在网络中存在,每当数据报经过一台路由器时,该字段的值减一,若TTL字段减为0 ,则该数据报必须丢弃

  • Protocol:表明上层协议

  • Header Checksum

    • 计算方法同UDP
    • TCP/UDP 检验和是对整个TCP/UDP报文段进行的
    • 而IP层则只是对IP首部进行了校验
  • Source and destination IP addresses

  • Data (payload)

Ipv4的分片

背景

  • 不是所有的网络层包大小都是一样的,以太网的包大小上限大概在1500bytes左右,广域网则不能超过576 bytes
  • 链路层帧能够携带的最大数据量称为最大传输单元(MTU)。
  • IPv4的设计者认为,在路由器中重新组装数据报会给协议带来显著的复杂性,所以,最后是reassembly in the end systems rather than in network routers

分片标志+偏移量

  • ip头每一个片都应该要有的
length ID fragflag offset
4000 x 0 0

分片得到:

length ID fragflag offset
1500 x 1 0
length ID fragflag offset
1500 x 1 185
length ID fragflag offset
1040 x 0 370
  • length 是整个diagram的大小,包括了20bytes的头部,所以总的数据部分是4000-20=3980bytes

  • 第一个分片的data field是1480bytes

  • offset=data field的偏移量/8

    • 如第一个分片: 0÷ 8=0
    • 第二个分片: 1480 ÷ 8 =185
    • 第三个分片:(1480+1480)÷ 8=370
  • 第三个分片的长度计算:

    (4000-20)-(1500-20)-(1500-20)+20=1040

IPv4地址

  • 每个IPv4地址为32bits 即4 bytes

  • 网络接口:(interface)The boundary between the host and the physical link is called an interface

  • 子网(subnet)

    • 主机和路由器=>网络节点
  • CIDR:Classless InterDomain Routing

    • a.b.c.d/x:其中x是子网的位数(读作slash-x)

  • 没有子网掩码:

    • 提取出自己的子网掩码

    • 把自己的子网掩码和对应的IP地址按位与操作

    • 如果同一子网,则操作网络号应该和自己是一样的。

    • 如:问题:A主机的IP地址为192.168.1.100/24,B主机的IP地址为192.168.2.100/16,请问两个主机可以相互通信吗?

      【答】:在通讯之前,主机首先需要判断目标IP是不是跟自己在一个网段中(因为源主机只知道目标主机的IP地址,并不知道他的子网掩码,所以,源主机会将目标IP与自己的子网掩码进行比较,得出一个网络ID)。

      A主机发起通讯:A经过计算,会得出B主机跟自己不在一个网段中,会将将ping包发送给网关(路由器):目标主机不可到达。

      B主机发起通讯:B经过计算,会得出A主机跟自己在一个网段中,B发出ping包,A可以收到,但是A找不到B:超时。

    • 答: 三个直接相连的子网,三个链路上的子网
  • 发展历史:

    • 一开始是采用的IP地址分类的方式,用前三位来区分不同的IP地址类型,不同的IP地址类型有着自己不同的网络号位数

    • 之后因为这样会对IP地址有很大的浪费,就改成了Classless InterDomain Routing,采用子网掩码来确定IP地址的网络号和主机号位数。这样,网络号的个数可以任意指定,网段的划分更加灵活

      CIDR技术用子网掩码中连续的1部份表示网络ID,连续的0部份表示主机ID。比如,网络中包含2000台计算机,只需要用11位表示 主机ID,用21位表网络ID,则子网掩码表示为11111111.11111111.11111000.00000000,转换为十进制则为 255.255.248.0。此时,该网络将包含2046台计算机,既不会造成IP地址的浪费,也不会利用路由器连接网络,增加额外的管理维护量。

  • 路由聚合(address aggregation)

    • Address aggregation works extremely well when addresses are allocated in blocks to ISPs and then from ISPs to client organizations

    • 在路由的时候,数据包是投递给200.23.16.0的,再由ISP分配

    • 当要替换网段的时候:

      直接替换下来即可,因为最长匹配原则,所以依然会走下面。

  • DHCP:Dynamic Host Configuration Protocol

    • 网络中的client主机会向网络中的DHCP server发送一个请求来获取IP地址

      • client先会发送请求(采用的是广播的方式,需要判断端口67是否有运行DHCP服务器,否则就会丢弃)
      • 接着DHCP会返回分配的IP
      • 为了避免网段中有多个DHCP服务器,所以client还要再将得到的IP地址广播出去
      • DHCP返回一个ACK消息。
  • Obtaining a Block of Addresses

    如图,将大的一个网络划分成8个等大的子网络

  • NAT:就是公有地址和私有地址转换。

    • 解决内网穿透的方式:
      • 一是在NAT路由器上写死
      • 二是采用IDG协议,先去注册一个地址,写入NAT路由器转发表
  • ICMP:Inernet Control Mes4sage Protocol

  • IPv6

    Tunneling: IPv6 carried as payload in Ipv4 datagram among Ipv4 routers

    将IPv6封装到IPv4中传输

四、路由算法

背景

链路状态算法

就当是复习算法咯

​ 建议改为: 最 短 路 复 制 粘 贴

  • Dijkstra 算法

    Dijstra算法是在Floyd上的一种优化,动归=>贪心,基于一个最朴素的考虑:

    到一个节点的最短路径必然会经过比它离起点更近的节点,而如果一个节点的当前距离值比任何剩余节点都小,那么当前的距离值一定是最小的。

    具体实现上,链式向前星存图+优先队列,算法部分的博客有,就不抄了

    上课的时候讲到了负权的问题,关键就在于,Dijstra是贪心,如果有负权,那么“而如果一个节点的当前距离值比任何剩余节点都小,那么当前的距离值一定是最小的”将不再成立

    处理负权的话可以采用Bellman-Ford算法,也就是后面讲到DV选路的具体实现算法。队列优化版本为spfa算法。DV和Dijstra实际上就是贪心和动归的一个区别。

    还需要注意的是,我看到班上有些同学说的意思是,问题出在了负权环上,实际上负权环是怎么都没有最短路径的,这里说的是,存在负权边,无负权环下的最短路径计算

    Bellman-Ford算法是为了实现动归,将所有节点,都进行了一次松弛操作,

    而spfa算法则是做了些许优化,那些已经确定了最短路径的点所连出去的边才是有效

    • 有意思的是,Dijstra和Spfa的实现,几乎一模一样,但是效果却大相径庭。

      还是用链式向前星+stl队列实现,简述一下

      • Dijstra算法:

        需要的数据结构有:存下每一条边的图Edge[],存下到每个点最短路径的数组d[],一个优先队列Q,用来存储每一次松弛后的距离向量,这些距离向量,都有可能成为下一个确定了最短距离的点,而根据之前的贪心策略,我们每一次操作都是在这些点的基础上操作

        起点入队

        循环出队,如果该节点能够更新d数组,就遍历该节点所有伸出去的边,做松弛操作

        循环

      • Spfa算法:

        为了应对负权的问题,Spfa对所有已知点连出去的边都进行了松弛。

        为什么这样能够处理负权呢?dijstra当遇到负权时,你优先队列出队的那个就不一定是最短距离了,所以会出问题,但是如果是spfa的话,对所有的已知点连出去的边都进行了松弛,这样能够保证每更新一次都能确定一个节点的最短路,但与dijkstra不同的是,并不知道是那个节点的最短路被确定了,只是知道比上次多确定一个,这样进行n-1次更新后所有节点的最短路都确定了(源点的距离本来就是确定的)

        具体实现上

        就是不用优先队列,不再跳过不符合松弛的点。

        写出来是真的像。不是传统的dp的写法。

      • Bellman-Ford 判断负环:

        如果循环执行了n-1次,那就说明有负环,因为没有负环的话,对每个点都松弛了,
        一定能够有最小值

        bool find_negative_loop()
        {
        	memset(d, 0, sizeof(d));
        	for(int i = 0; i < n; i++)
        		for(int j = 0; j < m; j++)
        		{
        			int u = e[j].u, v = e[j].v, w = e[j].w;
        			if(d[u] + w < d[v])
        			{
        				d[v] = d[u] + w;
        				if(i == n-1)
        				return true;
        			}
        		}
        	return false;
        } 
        

链路权值变化

Distance-Vector Algorithm: Link-Cost Changes and Link Failure

  • good news

    • At time t1 , y detects the link-cost change (the cost has changed from 4 to 1), updates its distance vector, and informs its neighbors of this change since its distance vector has changed.
    • At time t2 , z receives the update from y and updates its table. It computes a new least cost to x (it has decreased from a cost of 5 to a cost of 2) and sends its new distance vector to its neighbors.
    • At time t3 , y receives z\'s update and updates its distance table. y’s least costs do not change and hence y does not send any message to z. The algorithm comes to a quiescent state.

    只需要两次迭代即可

  • bad news

    如图,

关键在于,y会误认为能够以1+5=6的代价到x,坏消息需要很多次迭代才能收敛。

  • 解决方案:Poisoned reverse
z告诉y自己到x的距离是无穷的。(不能完全解决)

* Start with DV table building

  当z知道自己是经过y到x的时候,就告诉y,自己到x的距离是无穷的

* Triggle by link cost increase

  即y上升的话,先告诉z,z把自己到x置为无穷,再广播给y,强行让y不选自己
  • 练习

路由分级Hierarchical Routing

总览

forwarding table configured by both intra-and inter-AS routing algorithm

  • intra-AS sets entries for internal dests
  • inter-AS & intra-AS sets entries for external dests

举例:

在上图中,自治系统间选路协议(inter-AS)需要负责:知道x是AS3可达还是AS2可达

同时也要告知,1d应该是选择1c还是1b

  • learn from inter-AS protocol that subnet x is reachable via multiple gateways
  • Use routing info from intra-AS protocol to determine costs of least-cost paths to each of the gateways
  • hot potato routing: choose the gateway that has the smallest least cost (当自治系统间选路无法解决时)
  • Determine from forwarding table the interface I that leads to least-cost gateway. Enter (x,l)in the forwarding table

往往一个ISP就是一个AS

当然ISP也可能会自己下分AS

自治系统内部选路:Intra-AS Routing

主要有:

RIP: Routing Information Protocol

OSPF: Open Shortest Path First

IGRP: Interior Gateway Routing Protocol

  • RIP:

    • 采用DV算法
    • 采用跳数作为权值,最大为15跳
    • 每30秒更新一次DV表
    • 每一个通告可列出至多25个子网
    • 如果180秒没有收到通告,则将该路由器标记为故障
    • 通告是采用UDP通信的

  • OSPF (Open Shortest Path First)

    • 路由比较大的链路系统
    • 采用Dijstra算法,所以每一个路由拥有全部的路由信息
    • 每隔30分钟,周期性的广播状态
    • 特点:
      • 安全性
      • 支持多条相同代价的路径保留下来(RIP是随机选一条)

自治系统间选路:Inter-AS Routing

  • BGP(Border Gateway Protocol)

  • BGP provides each AS a means to

    • eBGP: obtain subnet reachability information from neighboring ASs
    • iBGP: propagate rachability information to all AS-internal routers
  • BGP的前缀属性:
    prefix+attribute="route"

    • 属性:
      • AS-PATH:每个AS自己的全网唯一的一个Number
      • NEXT-HOP:没搞懂...应该是和自治系统中的谁连接?
  • BGP的选路:

    概述:

    • local preference value attribute :policy decision
    • shortest AS-PATH
    • chosest NEXT-HP router :hot potato routing
    • additional criteria

    具体的routing policy

    • 在上图中,A,B,C是provider networks

      x w y是provider network的客户

      X是dual-homed(双宿主机,即则是连接了两个网络)

      显然,X不想做B到C的路由,所以X不会给B通告自己有去C的路

    • 同样的

      A 通告B 路由Aw

      B 通告X 路由BAw

      但是B不会通告路由BAW给C

      B想让C自己去找A,

      that is, B wants to route ONLY TO/FROM ITS CUSTOMERS!

单词

  • deceptively simple

    • deceptive /dɪˈseptɪvli/adv. 看似;不像看上去那么;比实际
  • transaction /trænˈzækʃn/n. 交易;事务;办理;会报,学报

  • decentralized /di\'sɛntrəl,aɪz/

    adj. 分散管理的

    vt. 使分散;使分权(decentralize的过去分词)

  • quiescent /kwiˈesnt/adj. 静止的;不活动的;沉寂的

  • converged /kən\'və:dʒd/

    v. 聚集,使会聚(converge的过去式)

    adj. 收敛的;聚合的

  • autonomous/ɔːˈtɒnəməs/adj. 自治的;自主的;自发的

  • inter-AS:自治系统间

  • intra-AS:自治系统内

  • criteria /kraɪ\'tɪərɪə/n. 标准,条件(criterion 的复数)

分类:

技术点:

相关文章: