网络层的主要作用
网络层通过路由选择来确定数据包从发送端到接收端的最佳路径,并通过网络地址(如IP地址)来标识和寻址主机和网络。其提供的服务是无连接的,表示数据包的传输不依赖于事先建立的连接。
路由选择
路由选择是确定数据包从源主机到目标主机的最佳路径。通过查找路由表来实现,路由表存储了网络拓扑信息和可达性信息。当数据包到达一个路由器时,路由器会根据目标IP地址和路由表来决定下一跳的地址。路由选择涉及静态和动态路由选择,静态路由选择是由网络管理员手动配置的,而动态路由选择则是由路由器自动执行的,通过交换路由信息并计算最优路径。
路由: 静态路由
动态路由(OSPF、IS-IS)
静态路由:是一种需要管理员手工配置和维护的路由。静态路由比动态路由使用更少的带宽,并且不占用CPU资源来计算和分析路由更新。静态路由有5个主要的参数:目的地址和掩码、出接口和下一跳、优先级。
静态路由是一种简单、高效且易于管理的路由方式,适用于小型、简单或安全要求较高的网络环境。然而,随着网络规模的增大和拓扑结构的复杂化,静态路由的配置和管理可能会变得繁琐和困难。
动态路由:指路由器能够根据当前网络的状态和拓扑结构等信息自动地建立自己的路由表,并根据网络实际变化情况进行适时调整,动态地计算出最优的数据传输路径。与静态路由相比,动态路由的优势在于能够自动更新路由信息,适应网络拓扑的变化,减轻网络管理员的配置和维护负担。
动态路由的工作原理:
- 邻居发现与建立邻接关系:路由器通过发送特定的协议报文(如Hello报文)来发现相邻的路由器,并建立邻接关系。
- 路由信息的交换:路由器向其邻居发送路由更新报文,这些报文包含了路由器已知的网络信息。
- 计算最短路径:路由器根据收到的路由信息和预定的算法(如Dijkstra算法)计算出到各个目的网络的最短路径。
- 构建路由表:根据计算出的最短路径,路由器构建或更新自己的路由表,以指导数据包的转发。
- 周期性更新与变化响应:动态路由协议会定期发送更新报文,以适应网络拓扑的变化
- 链路状态与距离矢量:链路状态协议(如OSPF)维护网络的全视图,而距离矢量协议(如RIP)则只维护到邻居的最短路径信息。
数据封装
数据包封装主要涉及到将传输层传来的数据段(segments)封装成网络层的数据包(packets),也常被称为数据报(datagrams)。每个IP数据包都包含头部信息和数据部分,其中头部信息包括源IP地址、目标IP地址、版本号、头部长度、总长度、生存时间(TTL)、服务类型(ToS)、协议类型(标识上层协议类型,如TCP或UDP)等。
分片与重组
分片是指当网络层的数据包(IP数据报)大小超过了下一跳网络链路的最大传输单元(MTU)时,数据包被分割成多个较小的片段,以便通过该链路进行传输。重组是指当数据报的所有分片都到达目的地时,网络层将它们重新组合成原始的数据包。分片的目的是确保数据包能够适应不同网络链路的MTU限制,从而顺利通过网络中的各个设备和链路。重组的目的是还原数据包的完整性,以便上层协议能够正确处理数据。
当需要分片时,网络层会根据IP数据报的首部信息进行相应的处理。
IP报文格式如下所示:
- 标识符(Identification):确保同一原始数据报的所有分片可以被识别并重新组合。当数据报被分片时,所有分片都会使用相同的标识符。
- 标志(Flags):由3位组成,但通常只有2位有意义。其中,DF位用于指示是否允许分片,MF位用于指示是否还有后续分片。
- DF = 1时,表示禁止分片,如果数据包大小超过了MTU且DF位被设置,那么数据包将被丢弃并返回一个ICMP错误消息给发送方。
- DF = 0时,表示允许分片。
- MF = 1时,表示后面还有分片。
- MF = 0时,表示本分片是该数据报的最后一个分片。
- 片偏移(Fragment Offset):用于指示分片在原始数据报中的相对位置。片偏移的单位通常是8字节,因此除了最后一个分片外,每个分片的长度都是8字节的整数倍。
分片过程大致如下:
- 首先,检查数据报的大小是否超过了下一跳链路的MTU。
- 如果超过了MTU且DF位为0(允许分片),则根据MTU的大小将数据报分割成多个较小的片段。
- 每个片段都会保留原始数据报的IP首部,并添加相应的分片信息(如标识符、标志和片偏移)。
- 分片后的数据报片段将通过网络进行传输。
错误处理
网络层不保证数据包的可靠传输,但会提供一些基本的错误处理机制,来确保网络通信稳定性和可靠性。
错误类型包括:
- 数据包丢失:数据包在传输过程中未能成功到达目的地址。
- 数据包损坏:数据包在传输过程中被篡改或部分内容出错。
- 数据包延迟:数据包因网络拥塞或其他原因未能按时到达目的地址。
- 路由错误:数据包被错误地路由到非目的地址。
错误检测包括:
- 校验和:IP数据报的首部包含一个校验和字段,用于检测数据报在传输过程中是否发生错误。接收方在收到数据报后,会重新计算校验和并与接收到的校验和进行比较,以判断数据报是否损坏。
- ICMP消息:当数据包无法送达目的地址时,中间路由器或目的设备会向发送方发送ICMP消息(如目的不可达、超时等),以通知发送方数据包传输失败的原因。
针对检测到的错误,网络层采取以下处理机制:
- 重传机制:对于因网络拥塞或暂时性问题导致的数据包丢失,发送方可以采用重传机制重新发送数据包。在某些情况下,如TCP协议,这种重传是自动进行的。
- 路由恢复:当发现路由错误时,网络层会尝试重新计算路由或请求路由协议(如RIP、OSPF等)重新分发路由信息,以恢复正确的路由路径。
- 错误报告:通过ICMP消息向发送方报告错误情况,以便发送方采取相应的处理措施(如重传、放弃传输等)。
- 流量控制:网络层还可以通过流量控制机制来防止网络拥塞导致的数据包丢失或延迟。例如,TCP协议中的滑动窗口机制就是一种有效的流量控制手段。
IP地址
IP地址(Internet Protocol Address),即互联网协议地址,它为网络中的每一个设备提供了一个独一无二的标识符。
- 唯一性:每个设备在网络中都具有唯一的IP地址,确保了网络上的设备可以被准确地识别和定位。
- 层级性:IP地址采用分层结构,从大到小依次表示网络、子网和主机地址,有利于网络管理和路由选择。
- 无连接性:IP地址本身并不提供连接状态的维护,每个数据包在传输过程中都是独立的,不保证可靠传输。
IP地址采用32位二进制数来表示。Ip地址在计算机内部以二进制方式被处理,但由于人们习惯了十进制的记忆方式,因此将32位的ip地址以每8位为一组,分成4组并将每组转换成十进制,然后用“.”隔开来表示,通常将这种表示方法称为点分十进制。
IP地址也分为网络地址和主机地址两部分。
- 网络地址:放在前面,表示这个IP地址属于互联网上的哪一个网络;
- 主机地址:放在后面,表示这个IP地址属于某个网络的哪一台设备。两者是主从关系。
子网掩码是一个32位地址,用于屏蔽IP地址的一部分,以区分网络标识(Network ID)和主机标识(Host ID),并说明该IP地址是在局域网上还是在广域网上。
子网掩码通常以点分十进制表示,如255.255.0.0。在二进制形式下,子网掩码由一连串的1和0组成,其中1表示网络部分,0表示主机部分。例如,255.255.0.0在二进制中表示为11111111.11111111.00000000.00000000。
网关:一个网络的出口就称为网关。当一个主机要将数据发送给其他网络的主机时,通常首先将数据发往网关。
IP地址的分类
私网地址
这些地址被设计用于在内部网络中使用,以确保这些网络中的设备能够相互通信,而不需要从互联网服务提供商(ISP)那里获取唯一的IP地址。由于私网地址在全球互联网上不是唯一的,因此它们不能直接在互联网上路由。
常见的私网地址范围包括:
公网地址
公网地址也称为全球唯一地址或外部地址。这些地址是在互联网上全局唯一的,可以从互联网的任何位置访问。每个连接到互联网的设备(如果它需要从外部访问)都需要一个公网地址。公网地址通常由互联网服务提供商(ISP)分配,并且数量有限。
广播地址
也称受限广播地址,指32位全为“1”的IP地址,即255.255.255.255。用于本网广播,即被限制在本网络之中。
多播地址
多播(Multicast)也称为组播,D类的IP地址就属于多播地址。多播通信允许一个或多个发送者(多播源)发送单一数据包到多个接收者(多播组成员),这是一种高效的网络通信方式,尤其适用于需要将数据同时发送给多个目标节点的场景。
环回地址
在A类网络中,当网络号部分为127,主机号为任意值时的地址称为环回地址。它主要用于网络软件测试以及本地进程之间的通信。开发人员可以使用环回地址在同一台机器上测试客户端和服务器的网络通信,从而验证网络应用程序的功能和性能。
0.0.0.0
表示所有不清楚的主机和目的网络。
169.254.*.*
使用DHCP无法自动获取地址时,系统自动分配这个网段的地址
IP报文
IP报文是网络通信的基础单元,它承载着数据在网络间的传输任务。IP报文主要由两部分组成:头部(Header)和数据(Data)。头部包含了路由和传输控制信息,而数据部分则是实际要传输的负载。
IP报文的头部通常有20字节的基本长度,其中包括以下几个重要字段:
- 版本(Version):4位,表明IP协议的版本,通常为4(IPv4)或6(IPv6)。
- 首部长度(IHL):4位,表示IP报头的长度,以32位字(4字节)为单位。
- 服务类型(TOS):8位,用于定义报文的优先级和QoS参数。
- 总长度(Total Length):16位,表示整个IP报文的长度,单位为字节。
- 标识(Identification):16位,用于唯一标识一个IP报文,特别是在分片和重组时。
- 标志(Flags):3位,用于控制和标记分片。
- 片偏移(Fragment Offset):13位,表示当前分片相对于原始报文的偏移量。
- 生存时间(TTL):8位,表示报文在网络中的最大存活时间。
- 协议(Protocol):8位,表示封装在IP报文中的上层协议。
- 头部校验和(Header Checksum):16位,用于检验IP报文头部的完整性。
- 源IP地址(Source Address):32位,表示发送报文的主机IP地址。
- 目的IP地址(Destination Address):32位,表示接收报文的主机IP地址。
网络层协议
ICMP(互联网控制消息协议)
用于在IP网络中发送控制消息,提供可能由网络本身(如网关或路由器)报告的错误信息,以及操作、管理消息。ICMP不是用于传输用户数据,而是用于传递控制消息,比如报告目的地不可达、时间超过、参数问题等错误。
ICMP的主要功能包括:
-
确认IP包的传递和到达:通过ICMP的回声请求和回声应答消息,可以用来测试两台主机之间的IP连通性,即著名的ping命令。
-
报告错误:当路由器或主机不能交付数据报时,它会向原始发送方发送一个ICMP目标不可达消息。此外,还有其他几种ICMP消息用于报告不同类型的错误,如时间超过、源抑制等。
-
路由跟踪:ICMP的时间超过和目的地不可达消息,可以被用来实现traceroute(在Unix/Linux系统中)或tracert(在Windows系统中)等路由跟踪工具,帮助网络管理员诊断网络问题。
ICMP消息被封装在IP包中,IP协议号为1。ICMP消息分为两大类:错误报告消息和信息请求/应答消息。错误报告消息用于报告各种IP层的错误,如目标不可达、时间超过等;信息请求/应答消息则用于网络诊断,如ping操作。
IGMP(互联网组管理协议)
是一个用于IP主机和相邻多播路由器之间交换组成员信息的协议。多播是一种网络传输方式,允许源节点将数据包同时发送给一组特定的目标节点,而不需要为每个目标节点分别发送数据包。IGMP协议的主要目的是让多播路由器知道哪些主机是某个特定多播组的成员,从而能够优化多播数据包的传输。
IGMP协议的作用包括:
-
组成员报告:当主机想要加入某个多播组时,它会通过IGMP报告消息通知其直接连接的多播路由器。多播路由器会维护一个组成员列表,记录哪些主机是哪些多播组的成员。
-
组成员离开:虽然IGMP没有直接的“离开”消息,但多播路由器可以通过监视主机是否继续响应组成员查询来推断主机是否仍然属于某个多播组。如果主机在一段时间内没有对组成员查询做出响应,多播路由器就会认为该主机已经离开了多播组。
-
组成员查询:多播路由器会定期发送组成员查询消息到其直接连接的网络上,以确认哪些主机仍然是多播组的成员。这是为了维护多播组成员列表的准确性和及时性。
IGMP有多个版本,包括IGMPv1、IGMPv2和IGMPv3。每个版本都在前面的基础上进行了改进和扩展,以更好地支持多播通信的需求。
ARP(地址解析协议)
用于将网络层地址(如IPv4地址)解析为链路层地址(如以太网MAC地址),以便在局域网(LAN)内进行通信。
在网络通信中,数据包在发送之前需要知道目标设备的物理地址(MAC地址),因为链路层(如以太网)通信是基于物理地址进行的。然而,网络层(如IP层)通常只知道目标设备的逻辑地址(如IP地址)。因此,需要一种机制来将逻辑地址转换为物理地址,这就是ARP协议的作用。
ARP的工作流程大致如下:
-
ARP请求:当一台设备想要发送数据包给另一台设备时,它首先检查自己的ARP缓存(一个存储IP地址到MAC地址映射的表)。如果缓存中没有目标IP地址对应的MAC地址,设备就会广播一个ARP请求到网络上。这个ARP请求包含了发送方的IP地址和MAC地址,以及目标设备的IP地址,并询问“谁知道这个IP地址对应的MAC地址?”。
-
ARP应答:网络上的其他设备会检查ARP请求中的目标IP地址,如果它们发现这个IP地址不是自己的,就会忽略这个ARP请求。但是,如果某个设备发现目标IP地址是自己的,它就会向发送方发送一个ARP应答,其中包含了自己的MAC地址。
-
更新ARP缓存:发送方收到ARP应答后,会将目标IP地址和对应的MAC地址存储在ARP缓存中,以便将来可以直接使用这个映射发送数据包,而不需要再次发送ARP请求。
-
发送数据包:现在,发送方已经知道了目标设备的MAC地址,它就可以将数据包发送到链路层,链路层会根据MAC地址将数据包发送到目标设备。
ARP协议是局域网内通信的基础,它使得网络层能够利用链路层的特性进行高效的数据传输。然而,ARP协议也存在一些安全风险,如ARP欺骗,攻击者可以通过伪造ARP应答来欺骗目标设备,使其将数据包发送到错误的MAC地址。
RARP(反向地址解析协议)
用于将链路层地址(如以太网MAC地址)解析为网络层地址(如IPv4地址)。与ARP(地址解析协议)相反,ARP是将网络层地址解析为链路层地址,而RARP则是进行反向操作。
在RARP的工作原理中,当一个设备启动时,如果它不知道自己的IP地址,但它知道自己的MAC地址,那么它可以向网络上的RARP服务器发送一个RARP请求。这个请求包含了设备的MAC地址,并询问“我的IP地址是什么?”。RARP服务器会检查其数据库(或通过网络查询),找到与该MAC地址关联的IP地址,并返回给设备。