【计网】网络层

本文详细介绍了网络层的关键功能,包括数据平面和控制平面的概念,传统路由与SDN路由的区别,以及路由器的工作原理。重点讨论了IP协议,包括数据报格式、分片、IPv4与IPv6的差异。此外,还涵盖了路由选择算法,如距离向量和链路状态算法,以及RIP、OSPF和BGP等路由协议在因特网中的应用。最后提及了SDN的控制平面和广播多播路由选择的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络层的两个重要功能:转发路由选择

1.概述

1.数据平面和控制平面

2.控制平面:传统路由和SDN(软件定义网络)路由

传统路由主要是根据上层传递下来的报文中IP字段与路由表匹配,然后转发数据。路由表由每台路由器生成,是分布式的。

SDN网络中,路由器根据上层传递下来的报文中的IP和其他多个字段与流表进行匹配,然后可以做出多个动作,例如:转发,泛洪,修改字段等。流表是由一台远程的控制器(也就是一台服务器)生成,是集中式的。

3.网络服务模型

网络服务模型定义了分组在发送与接收端系统之间的端到端的运输特性。

4.网络层的连接

网络层的连接与运输层的连接不同,运输层TCP的面向连接只体现的两个端系统上,网络层的连接不仅体现在两个端系统上,还体现在连个端系统之间传输路径中的每个网络交换节点(路由器)上。

2.虚电路和数据报网络

仅在网络层提供连接服务的计算机网络称为虚电路网络,仅在网络层提供无连接的计算机网络称为数据报网络

3.路由器工作原理

1.一台路由器有4个组成部分:a.输入端口;b.交换结构;c.输出端口;d.路由选择处理器

在交换结构中交换方式可以有经内存交换,经总线交换和经互联网络交换。

经内存交换:输入输出端口之间的交换实在CPU(路由选择器)的控制下完成的。分组到达输入端口后,端口向选择处理器发出中断信号,然后分组被复制到处理器的内存中,路由选择处理器为其找到合适的输出端口并将其放到输出端口的缓存中。

但是这种模型的传输效率非常受 CPU 的处理效率影响。

经总线交换:输入端口为分组预先贴上一个输出端口的标签,然后输入端口经一根总线将分组送入每一个输出端口,在每一个输出端口中匹配端口与标签,如果匹配就存进输出端口的内存中,如果不匹配就将分组丢掉。

这种模型的传输效率被总线的传输效率所限制。

经互联网络交换:将交换结构内部构建成一个小型的网络,从而突破传统的 CPU 和 总线的速率上限。一个非常明显的优势就在于,网络可以同时进行多个数据报的转发,而前面两种局限于单个数据报的转发。

输出端口选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。

4.网际协议(IP协议):因特网中的转发和编址

因特网的网络层有三个主要组件:a.IP协议;b.路由选择部分(决定数据报从源到目的地所流经的路径,用于生成转发表);c.报告数据报中的差错和对网络层信息请求进行响应的设施。

网络层分组被称为数据报。

 1.数据报格式

a.版本号:4比特规定数据报的IP协议版本。通过查看版本号,路由器确定如何解释IP数据报的剩余部分,不同的IP版本使用不同的数据报格式。

b.首部长度:4比特IP确定数据报中数据部分实际从哪里开始。大多数数据报不包含选项,所以一般IP数据报有20字节的首部(一个字节8个比特)。

c.服务类型:服务类型(TOS)包含在数据报的首部中,用来区分不同类型的IP数据报。例如:有一些要求低时延,一些要求高吞吐量或者可靠性数据的。

d.数据报长度:16比特,用来记录IP数据报的总长度(首部+数据),以字节计。实际上数据报很少有超过1500字节的。

e.标识、标志、片偏移:与IP分片有关。IPv6不允许在路由器上对分组进行分片。

f.寿命(Time-To-Live,TTL):用来确保数据报不会永远在网络中循环(由于长时间的路由选择环路),每当数据报由一台路由器时,该字段减1,若TTL字段减为0,则该数据报被丢弃。

g.协议:指示IP数据报的数据部分应交给哪个特定的运输层协议,该字段仅在数据报到达最终目的地才使用。

h.首部检验和:用于检测收到的IP数据报中的比特错误。

首部检验和计算过程:将首部中的每2个字节当作一个数,用反码运算求和,将结果存放到检验和字段。需要注意的点是,因为每经一台路由器处理后TTL段就会改变,所以在每台路由器上都要重新计算检验和并存入检验和字段中。

网络层和运输层重复检测的原因:a.IP层只对IP首部计算检验和,TCP/UDP对整个报文段计算检验和;b.TCP/UDP和IP协议不一定属于同一个协议栈。

i.源和目的IP地址

j.选项:该字段允许IP首部被扩展。IPv6首部中去掉了IP选项。选项的存在导致数据报头长度可变,故不能预先确定数据字段从哪里开始,而且有些数据要求处理选项,有些不要求,也会导致一台路由器处理一个IP数据所需的时间变化很大,影响路由器的性能。

k.数据(有效载荷):一般情况下IP数据报中的数据字段包含要交给目的地的运输层报文段,但也可以承载其他类型的数据,如ICMP。

一个IP数据报由总长为20字节的首部(假设无选项),如果数据报承载一个TCP报文段,则每个数据报共承载总长为40字节的首部(20字节的IP首部和20字节的TCP首部)和应用层报文。

2.IP数据报分片

不同的链路层能够承载的网络层分组长度可能不同,一个链路层帧能承载的最大数据量叫做最大传送单元(MTU)

为解决发送方与目的地路径上的每段链路可能使用不同的链路层协议的问题,可以将IP数据报分成更小的,片在到达目的地运输层以前需要重更新组装。IPv4中数据报的重新组装工作在端系统中完成,而不是网络路由器中。

发送方主机会为每个书包贴上标识号,通常是加1,当某路由器需要对一个数据报进行分片时,形成的每个片中有初始数据报的源地址,目的地址和标识号。目的主机通过数据报的标识号确定哪些数据报实际上是同一较大的数据报的片。为了让目的主机知道已经收到了数据报的最后一个片,最后一个片的比特置为0,其他置为1。为了让目的主机确定是否丢失了一个片且能按照正确顺序重新组装片,使用偏移字段指定该片应该放在初始数据报中的哪个位置。

IP分片可以将不同的链路层技术粘合起来,但也使路由器和端系统更复杂且能够被用于生成致命的Dos攻击。

3.IPv4编址

主机或路由器与物理链路之间的边界叫做接口。IP地址技术上是与一个接口相关联,而不是与包括该接口的主机或路由器相关联

IP地址长度为32比特即4字节,通常按点分十进制记法书写

IP子网

多点连接和点到点连接

ABC类网络,内网和外网

无类域间路由和子网掩码(用来标志网络号和主机号)

子网划分和路由聚集

网络地址转换、Upnp协议

5.因特网控制报文协议(ICMP协议)

ICMP协议被用于主机和路由器之间沟通网络层的信息,最典型用途是差错报告。

ICMP的报文是作为IP有效载荷承载的,就像TCP和UDP报文段作为IP有效载荷被承载一样。

ping是因特网包探索器,通过发送ICMP来测试网络连接量的程序。

ICMP报文有一个类型字段和一个编码字段,并包含引起该ICMP报文首次生成的IP数据报的首部和前8字节内容(以便发送方能确定引发该差错的数据报)。

 6.IPv6与IPv4

1.区别

1.IPv4的地址长度为32比特,IPv6的地址长度为128比特。

2.IPv4具有的地址类型为:单播,多播,广播;IPv6具有的地址类型为:单播,多播,任播(在一组主机中选择最具网络条件的一个主机作为目标主机)

3.IPv6首部固定为40字节,在首部中没有选项字段,他并没有消失,他可能出现在IPv6首部中由“下一个首部”指出的位置上。

4.IPv6不允许在中间路由器上进行分片和组装。如果数据报太大无法传输则丢掉数据报,并向发送方发回一个分组太大的差错报文。

5.IPv6中删去了首部检验和

6.IPv6中引入了流标签和优先级。流量类型字段用于给出某些数据报的优先级,指明某些应用的数据报比其他应用的数据报有更高的优先权。

7.数据报中下一个首部字段标识数据报中的数据字段需要交给哪个协议(如TCP或UDP),和IPv4首部中的协议字段值相同。

8.ICMPv6新增了一些新的类型和编码,还将包含了IGMP协议(因特网组管理协议,在IPv4中式一个与ICMP分来的独立协议)。

2.IPv4到IPv6的迁移

有两种方法:双栈建隧道。两种方法可以同时使用也可以分开使用。

双栈方法的核心是使网络中的结点同时具有发送和接受IPv4和IPv6两种数据的能力,这种方法会产生一个问题,就是IPv6数据报转为IPv4数据报时会使IPv6中一些在IPv4中无对应部分的字段信息丢失。

建隧道方法的核心是将IPv6数据报作为IPv4的有效载荷部分放入IPv4数据报中。

7.路由选择算法

默认路由器,第一跳路由器,源路由器,目的路由器

全局路由选择算法---链路状态(LS)算法

分散式路由选择算法---距离向量(DV)算法

1.链路状态路由选择算法(LS)

通过链路状态分组以泛洪的方式让每个节点收到全网图,然后根据dijkstra算法进行计算源节点到其他节点的最有路径。

dijkstra算法

 2.距离向量路由选择算法(DV)

每个结点和它的直接邻居交换距离矢量,然后测到直接邻居的代价值,然后计算最优路径。

毒性逆转(水平分裂) 

3.LS与DV比较

a.报文复杂性:DV优于LS

b.收敛速度:LS优于DV

c.健壮性:LS优于DV。

8.因特网中的路由选择

一个自治系统AS),是一组路由器的集合,他们拥有同样的选路策略(也就是说运行相同的了路由选择协议),被同一技术管理部门管理运行

1.因特网中自治系统内部的路由选择

路由选择信息协议:RIP

使用距离矢量算法

在RIP中,路由选择更新信息在邻居之间通过使用一种RIP响应报文(也称作RIP通告)来交换,大约每30秒相互交换一次,由一台主机或路由器发出的响应报文包含了一个该AS内的最多达25个目的子网的列表(也就是25跳)

开放最短路优先:OSPF

使用链路状态算法

OSPF的优点:

a.安全;b.允许存在多条相同费用的路径:可以起到均衡流量的作用;c.对单播和多播路由选择的综合支持;d.支持在单个路由选择域内的层次结构;e.对于每一个链路,对于不同的TOS有多重代价矩阵

2.因特网中自治系统间的路由选择

边界网关协议:BGP

使用距离矢量算法

BGP为每个AS提供了进行以下工作的手段:

a.从相邻AS处获得子网可达信息;

b.向本AS内部的所有路由器传播这些可达信息;

c.基于可达信息和AS策略,决定可达子网的“好”路由。

BGP会话(TCP连接),BGP对等方,内部BGP会话,外部BGP会话

3.SDN控制平面

4.广播和多播路由选择

以后有时间再补~

### 关于算机网络课程设网络层小游戏实现方案 在网络层的设实践中,可以通过模拟路由选择算法来创建教育性质的小游戏。这类游戏不仅能够帮助学生理解复杂的概念,还能提高学习兴趣。下面是一个基于Dijkstra最短路径算法的游戏设方案。 #### 游戏目标 玩家扮演一名虚拟世界的探险家,在由不同城市组成的地图上旅行。每个城市的距离代表实际网络环境中两台主机之间的延迟时间。玩家的任务是从起点到达终点,并找到一条总耗时最少的路线。 #### 技术细节 为了简化模型并专注于教学目的,假设所有链路都是双向且具有固定的传输成本(即固定延时)。使用Python编程语言作为开发工具,利用`networkx`库构建加权图表示网络拓扑结构[^1]。 ```python import networkx as nx import matplotlib.pyplot as plt def create_network(): G = nx.Graph() # 添加节点和边权重 edges_with_weights = [ ('A', 'B', 7), ('A', 'C', 9), ('A', 'F', 14), ('B', 'C', 10), ('B', 'D', 15), ('C', 'D', 11), ('C', 'F', 2), ('D', 'E', 6), ('E', 'F', 9)] G.add_weighted_edges_from(edges_with_weights) pos = nx.spring_layout(G, seed=7) labels = nx.get_edge_attributes(G,'weight') nx.draw(G, pos, with_labels=True) nx.draw_networkx_edge_labels(G,pos,edge_labels=labels) plt.show() return G if __name__ == "__main__": graph = create_network() ``` 此代码片段展示了如何建立一个简单的无向有权重图用于展示网络布局以及各条线路间的开销情况。接下来就是运用Dijkstra算法算最优路径: ```python from heapq import heappop, heappush def dijkstra(graph, start_node): shortest_paths = {node: float('inf') for node in list(graph)} previous_nodes = {} unvisited_set = [(0, start_node)] while unvisited_set: current_distance, current_vertex = heappop(unvisited_set) if current_distance > shortest_paths[current_vertex]: continue neighbors = graph.neighbors(current_vertex) weights = dict((v, d['weight']) for u,v,d in graph.edges(data=True)) for neighbor in set(neighbors): distance = current_distance + weights[(current_vertex,neighbor)] if distance < shortest_paths[neighbor]: shortest_paths[neighbor] = distance previous_nodes[neighbor] = current_vertex heappush(unvisited_set, (distance, neighbor)) return shortest_paths, previous_nodes start_city = "A" end_city = "E" graph = create_network() shortest_distances, prev_vertices = dijkstra(graph, start_city) path = [] step = end_city while step is not None: path.append(step) step = prev_vertices.get(step) print(f"The best route from city {start_city} to city {end_city}: {' -> '.join(reversed(path))}") print(f"Total travel time: {shortest_distances[end_city]} units.") ``` 这段脚本实现了完整的寻径过程,包括初始化、执行Dijkstra算法求解最小代价路径,并最终输出结果给用户查看。这有助于加深参与者对于动态规划方法的理解及其在网络优化问题上的应用价值[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值