突破编程_C++_网络编程(OSI 七层模型(网络层))

1 网络层的功能与作用

1.1 功能与作用详解

OSI 网络层是 OSI 参考模型中的第三层,位于数据链路层和应用层之间,其主要功能与作用涉及到网络中的数据通信和端到端的连接服务。其详细的功能与作用如下:

  • 路由选择与分组交换:网络层负责根据目标地址和网络拓扑结构,选择最佳的路径将数据从源主机传输到目标主机。在这个过程中,它会把从传输层接收到的数据报文封装成分组,并在网络中进行转发。路由选择通常通过一定的算法实现,以确保数据包能够高效地到达目的地。
  • 网络连接复用:为分组在通信子网中节点之间的传输创建逻辑链路,并在一条数据链路上复用多条网络连接。这通常通过时分复用技术实现,提高了网络资源的利用效率。
  • 流量控制:网络层通过一系列机制,控制网络中数据的传输速度,以避免网络拥塞。流量控制是确保网络稳定、高效运行的关键环节。
  • 拥塞控制:当网络中出现拥塞时,网络层能够检测到这种情况,并采取相应的措施来缓解拥塞,比如丢弃部分数据包或通知发送方降低发送速率。
  • 网络互连:网络层还负责处理不同网络之间的互连问题,确保数据包能够跨越不同的网络进行传输。
  • 差错检测与恢复:在数据传输过程中,网络层能够检测数据包的错误,并尝试进行恢复或通知发送方重新发送。
  • 服务选择:网络层为传输层提供数据报和虚电路两种服务,但 Internet 的网络层仅为传输层提供数据报一种服务。

总体来说,网络层在 OSI 参考模型中起到了承上启下的作用,它接收来自传输层的数据,通过路由选择、分组转发等机制,将数据高效地传输到目标主机,为传输层提供最基本的端到端的数据传送服务。同时,网络层还负责处理网络中的拥塞、差错等问题,确保网络的稳定、高效运行。

1.2 网络层的流量控制与数据链路层的流量控制对比

网络层的流量控制与数据链路层的流量控制都是确保网络数据稳定、高效传输的重要机制,但它们之间在控制范围、实现方式和目标上存在明显的差异。

首先,网络层的流量控制关注的是整个网络范围内的数据传输。它负责根据网络的当前状态和拥塞情况,调整发送方的发送速率,确保数据在网络中的传输不会造成拥塞。这种控制是全局性的,需要考虑整个网络拓扑结构、节点间的连接关系以及网络流量的分布情况。

相比之下,数据链路层的流量控制更侧重于在特定的发送方和接收方之间控制数据流量。它主要关注如何确保发送方的发送速率与接收方的处理能力相匹配,避免接收方缓冲区溢出或数据丢失。这种控制是点对点的,针对的是相邻节点间的数据传输。

在实现方式上,网络层的流量控制通常依赖于路由算法、流量整形和队列管理等技术。这些技术可以根据网络的实时状态调整数据包的转发策略,以实现流量的均衡和拥塞的避免。而数据链路层的流量控制则主要依赖于一些具体的协议和机制,如滑动窗口协议和停止等待协议等。这些协议通过调整发送方的发送窗口大小或接收方的确认机制,来控制数据的发送速率。

最后,从目标来看,网络层的流量控制旨在实现全局的流量均衡和拥塞避免,确保网络的整体性能。而数据链路层的流量控制则更注重确保数据在相邻节点间的正确、可靠传输,避免数据的丢失和乱序。

综上所述,网络层的流量控制与数据链路层的流量控制在控制范围、实现方式和目标上各有侧重,但两者共同协作,确保网络数据的稳定、高效传输。

2 IP 地址与子网掩码

IP地址和子网掩码是计算机网络中非常重要的两个概念,它们共同决定了网络中的设备如何相互通信和识别。

2.1 IP地址

IP 地址(Internet Protocol Address)是分配给网络设备上的一个数字标签,用于在计算机网络中唯一标识一台设备。它采用 32 位二进制数表示,通常被划分为四个 8 位的字节,并以点分十进制形式表示,如 “192.168.1.1”。

IP 地址可以分为两个部分:网络部分和主机部分。网络部分用于标识设备所属的网络,而主机部分用于标识网络中的具体设备。这种划分方式使得网络中的设备可以根据 IP 地址进行分组和识别。

IP 地址分为 IPv4 和 IPv6 两种版本。IPv4 是目前广泛使用的版本,但由于其地址空间有限,已经面临耗尽的问题。为了解决这个问题,引入了 IPv6,它采用 128 位二进制数表示 IP 地址,极大地扩展了地址空间。

2.2 子网掩码

子网掩码是一个与 IP 地址相关联的 32 位地址掩码,用于将 IP 地址划分为网络部分和主机部分。子网掩码的作用是确定 IP 地址中哪些位是网络部分,哪些位是主机部分。

子网掩码通常也采用点分十进制形式表示,如 “255.255.255.0”。在子网掩码中,对应于网络部分的位被设置为 1,而对应于主机部分的位被设置为 0。通过子网掩码与 IP 地址进行按位与运算,可以得到网络地址。

子网掩码的主要作用是帮助网络设备识别数据包的目标网络。当设备收到一个数据包时,它会使用子网掩码来确定数据包的目标 IP 地址中的网络部分,从而判断该数据包是否属于本地网络或需要转发到其他网络。

2.3 IP 地址与子网掩码的关系

IP 地址和子网掩码是密切相关的。在配置网络设备时,通常需要同时设置 IP 地址和子网掩码。通过子网掩码,网络设备可以确定 IP 地址中的网络部分和主机部分,从而实现网络设备的正确通信和分组。

如下是一个获取 IP 地址中的网络部分和主机部分的示例:

#include <iostream>  
#include <string>  
#include <sstream>  
#include <vector>  
#include <bitset>  

// 函数用于将点分十进制的IP地址或子网掩码转换为32位整数  
uint32_t ipToInteger(const std::string& dotDecimal) {
	std::istringstream stream(dotDecimal);
	std::vector<uint8_t> bytes(4); // 存储四个字节  
	std::string byteStr;
	size_t byteIndex = 0;

	// 逐个读取点分十进制字符串中的部分,并转换为uint8_t  
	while (std::getline(stream, byteStr, '.') && byteIndex < 4) {
		bytes[byteIndex++] = static_cast<uint8_t>(std::stoi(byteStr));
	}

	// 确保读取了四个部分
	if (byteIndex != 4) {
		throw std::invalid_argument("Invalid dot-decimal format");
	}

	// 将四个字节组合成32位整数  
	return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
}

// 函数用于将32位整数转换回点分十进制的IP地址格式  
std::string integerToIp(uint32_t ip) {
	std::ostringstream stream;
	stream << ((ip >> 24) & 0xFF) << ".";
	stream << ((ip >> 16) & 0xFF) << ".";
	stream << ((ip >> 8) & 0xFF) << ".";
	stream << (ip & 0xFF);
	return stream.str();
}

// 主函数,用于确定IP地址中的网络部分和主机部分  
void determineNetworkAndHost(const std::string& ip, const std::string& subnetMask) {
	uint32_t ipInt = ipToInteger(ip);
	uint32_t maskInt = ipToInteger(subnetMask);

	// 通过按位与操作得到网络部分  
	uint32_t networkPart = ipInt & maskInt;
	std::cout << "Network Part: " << integerToIp(networkPart) << std::endl;

	// 主机部分则是IP地址与网络部分的差  
	uint32_t hostPart = ipInt & (~maskInt);
	std::cout << "Host Part: " << integerToIp(hostPart) << std::endl;
}

int main() {
	std::string ip = "192.168.1.1";
	std::string subnetMask = "255.255.255.0";
	try {
		determineNetworkAndHost(ip, subnetMask);
	}
	catch (const std::exception& e) {
		std::cerr << "Error: " << e.what() << std::endl;
		return 1;
	}
	return 0;
}

上面代码的输出为:

Network Part: 192.168.1.0
Host Part: 0.0.0.1

此代码首先定义了两个辅助函数,ipToInteger 和 integerToIp,用于将点分十进制的 IP 地址或子网掩码转换为 32 位整数,以及将 32 位整数转换回点分十进制的格式。然后,主函数 determineNetworkAndHost 接收 IP 地址和子网掩码作为输入,将它们转换为整数,并通过按位与操作计算网络部分。主机部分则是 IP 地址与网络部分的差(通过取子网掩码的反码然后与 IP 地址进行按位与操作得到)。最后,主函数打印出网络部分和主机部分。

在实际应用中,根据网络规模和需求的不同,可以灵活配置子网掩码来划分网络。较大的子网掩码值意味着网络部分占用的位数较多,可以容纳的主机数量较少;而较小的子网掩码值则意味着网络部分占用的位数较少,可以容纳的主机数量较多。通过合理配置子网掩码,可以实现网络资源的有效利用和管理的灵活性。

总结来说,IP 地址和子网掩码是计算机网络中用于标识设备和划分网络的重要概念。它们共同决定了网络中的设备如何相互通信和识别,是构建稳定、高效网络的基础。

3 路由选择与路由算法

网络层的路由选择与路由算法是计算机网络中至关重要的部分,它们决定了数据包在网络中如何被有效地转发和传递。

一、路由选择

路由选择是网络层的核心功能之一,它负责确定数据包从源主机到目标主机所经过的最佳路径。在网络中,可能存在多条路径可以连接源主机和目标主机,路由选择的任务就是根据一定的策略从这些路径中选择一条最优的。

路由选择的过程通常包括以下几个步骤:

  • 收集路由信息:路由器通过与其他路由器交换路由信息来了解网络拓扑结构。这些信息可能包括网络中的节点、链路状态、可达性等。
  • 计算路由表:路由器根据收集到的路由信息,使用特定的路由算法计算出到达各个目的地的最佳路径,并将这些路径信息存储在路由表中。
  • 转发数据包:当路由器收到一个数据包时,它会根据路由表查找最佳路径,并将数据包沿着该路径转发出去。

二、路由算法

路由算法是路由选择的核心,它决定了如何根据网络状态计算出最佳路径。常见的路由算法主要包括静态路由算法和动态路由算法两类。

(1)静态路由算法:

静态路由算法是一种预先配置好的路由算法,它不会根据网络状态的变化而自动调整路由表。在静态路由算法中,管理员需要手动配置路由表,指定每个目的地的最佳路径。这种算法的优点是简单、易于管理,但缺点是缺乏灵活性,无法适应网络状态的变化。

(2)动态路由算法:

动态路由算法则能够根据网络状态的变化自动调整路由表。它通过与其他路由器交换路由信息来实时了解网络状态,并使用特定的算法计算出最佳路径。常见的动态路由算法包括距离向量路由算法(如 RIP)和链路状态路由算法(如 OSPF)。

  • 距离向量路由算法:这种算法基于距离向量(通常是跳数)来选择最佳路径。每个路由器维护一个距离向量表,表中记录了到达各个目的地的最佳路径和对应的距离。路由器通过定期交换距离向量信息来更新自己的路由表。这种算法的优点是实现简单,但缺点是可能存在路由环路问题。
  • 链路状态路由算法:这种算法基于链路状态信息来选择最佳路径。每个路由器收集并广播其所知链路的状态信息(如链路带宽、延迟等),然后所有路由器使用这些信息构建网络拓扑图,并计算最短路径树。这种算法的优点是能够准确反映网络状态,避免路由环路问题,但缺点是计算复杂度较高。

4 网络层的协议与服务

网络层的协议定义了数据在网络层中的传输规则和方式,如下是主要的网络层协议:

(1)IP 协议

IP协议,即 Internet Protocol,是互联网中用于数据传输的基本协议之一。它工作在网络层,负责将数据包从源主机传输到目标主机。以下是 IP 协议的主要特性:

  • IP地址与唯一性:

IP协议为每个主机分配一个唯一的IP地址,以确保每台设备在互联网中的唯一性,从而实现设备之间的通信和数据传输。
IP地址由网络部分和主机部分组成,用于标识网络中的特定设备。

  • 路由选择:

在数据传输过程中,数据包需要经过多个网络设备和路由器才能到达目的地。IP协议通过路由选择的机制,确定了数据包从发送端到接收端的最佳路径。
路由器根据路由表中的信息来选择转发数据包的下一跳,确保数据能够高效、准确地到达目标主机。

  • 数据分包与重组:

由于网络传输速度和设备处理能力的限制,大数据包往往需要被分割成多个小的数据包进行传输。IP协议负责将原始数据包分段,并在每个数据报中添加必要的信息,如源IP地址、目标IP地址、数据长度等。
在接收端,IP协议负责将这些分段的数据包重新组合成原始的数据信息,确保数据的完整性和正确性。

  • 错误检测与纠正:

在数据传输过程中,由于网络设备故障或传输介质的干扰,数据包可能会出现错误。IP 协议通过校验和等机制,能够对数据包进行错误检测。
如果发现数据包存在错误,IP 协议会采取适当的措施,如请求重新发送或丢弃错误的数据包,以保证数据传输的可靠性和正确性。

此外,IP 协议还有 IPv4 和 IPv6 等不同版本。IPv4 使用 32 位地址,而 IPv6 则使用 128 位地址,提供了更大的地址空间,以支持更多的设备和网络。这些不同版本的 IP 协议不仅连接了计算机、服务器、智能手机等终端设备,还将物联网设备、智能家居等融入了网络生态。

(2)ARP 协议

ARP 协议,全称地址解析协议(Address Resolution Protocol),它主要用于解决 IP 地址到 MAC 地址的映射问题。在以太网等局域网中,数据包在传输时需要使用 MAC 地址进行通信,而 ARP 协议则提供了一种动态映射机制,使得主机可以根据 IP 地址获取对应的 MAC 地址。

ARP 协议的工作原理如下:

当源主机需要发送数据包到目标主机时,它首先检查自己的 ARP 缓存表中是否已有目标主机的 MAC 地址。如果缓存中存在目标主机的 MAC 地址,则源主机直接使用这个 MAC 地址进行数据包的封装和发送。如果 ARP 缓存中没有目标主机的 MAC 地址,源主机会发送一个 ARP 请求广播包到局域网内的所有主机。ARP 请求广播包中包含源主机的 IP 地址和 MAC 地址,以及目标主机的 IP 地址。局域网内的所有主机都会收到这个 ARP 请求广播包,但只有目标主机会对这个请求作出响应。目标主机收到 ARP 请求后,会将自己的 MAC 地址封装在 ARP 响应包中,并发送给源主机。源主机收到 ARP 响应包后,将目标主机的 MAC 地址存入自己的 ARP 缓存中,并用于数据包的发送。

ARP协议的工作流程可以分为以下几个步骤:

  • 源主机发送ARP请求广播包:当源主机需要获取目标主机的MAC地址时,它会发送一个ARP请求广播包到局域网内。
  • 目标主机响应ARP请求:目标主机收到ARP请求广播包后,检查请求中的目标IP地址是否与自己匹配,如果匹配则发送ARP响应包给源主机。
  • 源主机接收ARP响应并更新ARP缓存:源主机收到ARP响应包后,从响应中提取目标主机的MAC地址,并将其存入ARP缓存中。

ARP 协议在局域网中扮演着重要的角色,它使得主机之间可以根据IP地址进行通信,而无需关心底层的物理地址。同时,ARP协议也提供了一种动态映射机制,使得主机可以在需要时获取目标主机的 MAC 地址,从而保证了通信的灵活性和高效性。

需要注意的是,ARP 协议是一个动态协议,它会不断更新 ARP 缓存表中的数据,以保证数据的准确性。同时,由于 ARP 协议是建立在网络中各个主机互相信任的基础上的,因此也存在 ARP 欺骗等安全风险。为了防止 ARP 欺骗攻击,可以采取一些安全措施,如使用静态 ARP 映射、部署 ARP 防火墙等。

总的来说,ARP 协议解决了 IP 地址到 MAC 地址的映射问题,为局域网内的主机通信提供了可靠的支持。

(3)ICMP 协议

ICMP(Internet Control Message Protocol)协议,即互联网控制报文协议,是网络层的一个关键协议。它主要用于在 IP 主机、路由器之间传递控制消息,这些控制消息涉及网络连通性、主机可达性、路由可用性等方面的信息。虽然这些控制消息并不传输用户数据,但对于用户数据的传递却起着至关重要的作用。

ICMP 协议的主要功能包括:

  • 确认 IP 包是否成功到达目标地址:当数据包在网络中传输时,ICMP 协议负责监控其状态。如果数据包成功到达目标地址,ICMP 会发送相应的确认消息。
  • 通知在发送过程中 IP 包被丢弃的原因:如果数据包在传输过程中被丢弃,ICMP 会向发送方发送一个错误报告,告知数据包被丢弃的原因。这些原因可能包括目标不可达、超时、参数错误等。

ICMP 报文通常包含在 IP 数据报中,其结构包括 IP 报头、ICMP 报头和 ICMP 报文数据部分。当 IP 报头中的协议字段值为1时,说明这是一个 ICMP 报文。

ICMP 的工作机理相对简单,当数据包处理过程出现差错时,ICMP 会向数据包的源端设备报告这个差错。然而,ICMP 并不会纠正这个差错,也不会通知中间的网络设备。因为 ICMP 报文是封装在 IP 数据包内部作为数据部分进行传递的,它并不记录报文在网络传递中的全部路径,因此无法通知中间的网络设备。

源端设备在收到 ICMP 差错报告后,虽然不能确定差错是由哪个中间网络设备引起的,但可以根据 ICMP 报文确定错误的类型,并决定如何更好地重发传递失败的数据包。

ICMP 协议与其他协议,特别是 IP 协议、TCP 协议和 UDP 协议,有着密切的关系。ICMP 协议建立在 IP 协议之上,利用IP协议的封装和传输机制进行消息的传递。当TCP 或 UDP 协议传输的数据包在网络中遇到问题时,ICMP 协议会向发送者发送特定的错误报告,以便及时处理。

总的来说,ICMP 协议通过发送和接收控制消息来维护网络的稳定性和数据的可靠传输。虽然它不直接处理用户数据,但对于确保网络的连通性和数据的正确传递起着至关重要的作用。

(4)IGMP 协议

IGMP(Internet Group Management Protocol),即互联网组管理协议,主要用于支持组播功能,允许主机通知路由器它们希望接收或离开某个特定的组播组,而路由器则负责维护这些组播组的成员列表,并将相应的组播数据转发给这些成员。

IGMP 协议的主要功能和工作原理如下:

  • 成员关系管理:主机通过发送 IGMP 报文来告知路由器其希望加入或离开某个组播组。当主机想要接收发往某一特定组播地址的数据时,它会发送一个 IGMP 加入报文给直接相邻的组播路由器,请求加入该组播组。同样,当主机不再需要接收该组播组的数据时,它会发送一个 IGMP 离开报文,通知路由器从组播组中删除自己。
  • 路由器维护组播组成员列表:路由器根据接收到的 IGMP 报文来更新其维护的组播组成员列表。这个列表记录了哪些主机是当前活跃在特定组播组中的成员。
  • 组播数据转发:一旦路由器知道了哪些主机是某个组播组的成员,它就会将这些组播数据只转发给这些成员,而不是广播到整个网络。这大大提高了网络资源的利用率和传输效率。

IGMP协议还包含一些重要的机制,如响应抑制机制,用于避免在多个主机同时发送成员报告报文时产生冲突和冗余。此外,IGMP 还定义了主机收到普遍组查询报文和特定组查询报文时的最大响应时间,以确保主机能够及时响应路由器的查询。

IGMP 协议的优点在于它能够有效地管理和控制组播组成员关系,提高网络资源的利用率和传输效率。然而,需要注意的是,IGMP 仅适用于 IPv4 网络,对于 IPv6 网络,则需要使用其他协议(如 MLD,Multicast Listener Discovery)来进行组播成员管理。

总的来说,IGMP 协议用于确保路由器能够准确地将组播数据转发给正确的接收者。

基于上述协议,网络层可以提供如下服务,确保了数据在网络中的高效、可靠传输:

  • 数据分割与封装:网络层协议将上层传输的数据分割成适当大小的数据包,并为每个数据包添加必要的头部信息,如源 IP 地址、目标 IP 地址等。这样,数据包就可以在网络中进行传输和路由。
  • 数据包转发与路由选择:网络层协议通过路由器将数据包从源计算机转发到目标计算机。路由器根据路由表中的信息选择最佳路径,并将数据包发送到下一跳路由器,直到数据包到达目标计算机。
  • 路由器间的通信:网络层协议还负责路由器间的通信,包括路由器之间的路由信息交换、路由表的更新等。这有助于确保网络中的路由信息始终是最新的,从而确保数据包能够选择最佳路径进行传输。

总的来说,网络层的协议与服务共同确保了数据在网络中的高效、可靠传输。这些协议和服务不仅定义了数据传输的规则和方式,还提供了数据包转发、路由选择以及路由器间通信等功能。这使得不同计算机之间的通信成为可能,为各种互联网应用提供了基础支持。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值