网络层详解
一、概述
-
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
二、路由器
- 三个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 的复数)