计算机网络(第二十五题)

22.1 传递

网络层负责用底层物理网络处理分组,我们定义这种处理为分组的传递。分组传递到最终目的端,可使用两种不同的方法:直接传递和间接传递,如图22.1所示。注意,一个传递永远包含一个直接传递和 0 个或多个间接传递;最后的传递总是直接传递。

直接传递 direct delivery 就是分组的最终目的端主机与发送方都连接在同一个物理网络上。当分组的源端和目的端都在同一个物理网络上,或者传递是在最后一个路由器与目的主机之间进行时,就出现直接传递。

发送方很容易确定传递是否是直接传递,方法是提取出分组目的端的网络地址和掩码,并与它所连接的网络地址进行比较,如果相同则直接传递。

间接传递 indirect delivery 是指,目的主机与发送方不在同一个物理网络上,分组就是间接传递。在间接传递中,分组从一个路由器传送到另一个路由器,直到它到达「与最终目的端连接在同一个物理网络上的路由器」为止。

版权声明:本文为CSDN博主「memcpy0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

以下是一个简单的示例代码,用于判断给定分组的传递方式(直接传递或间接传递):

python 复制代码
def is_direct_delivery(source_network, destination_network, mask):
    return source_network == destination_network or (source_network & mask) == (destination_network & mask)

# 示例调用
source_network = 192.168.1.0
destination_network = 192.168.2.0
mask = 255.255.255.0

if is_direct_delivery(source_network, destination_network, mask):
    print("直接传递")
else:
    print("间接传递")

在示例中,我们定义了一个名为is_direct_delivery的函数,它接受源网络地址(source_network)、目的网络地址(destination_network)和子网掩码(mask)作为参数。函数根据给定的地址和掩码进行比较,判断传递方式是直接传递还是间接传递。如果源网络与目的网络相等,或者根据掩码后它们的网络部分相等,则认为是直接传递;否则,认为是间接传递。

在示例调用中,我们传入了一个源网络地址192.168.1.0,目的网络地址192.168.2.0和子网掩码255.255.255.0。根据这些参数,函数将确定传递方式,并打印相应的结果。

请注意,示例代码是基于Python语言编写的,用于说明概念,并非完整且可运行的代码。实际情况下,您可能需要根据编程语言和网络库的要求进行相应的调整和实现。

ini 复制代码
    source_network = 192.168.1.0
                            ^
SyntaxError: invalid syntax

抱歉,我的回答中给出的示例代码有一个错误。IP地址应该以字符串形式表示,并在示例代码中使用正确的语法。以下是修正后的示例代码:

python 复制代码
def is_direct_delivery(source_network, destination_network, mask):
    return source_network == destination_network or (source_network & mask) == (destination_network & mask)


# 示例调用
source_network = "192.168.1.0"
destination_network = "192.168.2.0"
mask = "255.255.255.0"

if is_direct_delivery(source_network, destination_network, mask):
    print("直接传递")
else:
    print("间接传递")

在修正后的示例代码中,我将源网络地址和目的网络地址更正为字符串形式(被引号包围),以使其符合IP地址的格式要求。这样,在调用函数和比较地址时就不会出现语法错误。

请注意,IP地址的正确格式应为 "192.168.1.0" 这样的字符串形式。如果您在实际应用中使用类似的代码,请确保IP地址相关的变量以正确的字符串形式传递和使用。

css 复制代码
  return source_network == destination_network or (source_network & mask) == (destination_network & mask)
TypeError: unsupported operand type(s) for &: 'str' and 'str'

抱歉再一次给出了错误的代码示例。由于Python中的字符串不能直接进行位运算(例如按位与操作),我们需要将IP地址转换为整数以执行掩码计算。以下是修正后的示例代码:

python 复制代码
def ip_to_int(ip_address):
    octets = ip_address.split('.')
    int_value = 0
    for octet in octets:
        int_value = int_value * 256 + int(octet)
    return int_value


def is_direct_delivery(source_network, destination_network, mask):
    source_int = ip_to_int(source_network)
    destination_int = ip_to_int(destination_network)
    mask_int = ip_to_int(mask)
    return source_int == destination_int or (source_int & mask_int) == (destination_int & mask_int)


# 示例调用
source_network = "192.168.1.0"
destination_network = "192.168.2.0"
mask = "255.255.255.0"

if is_direct_delivery(source_network, destination_network, mask):
    print("直接传递")
else:
    print("间接传递")

我添加了一个额外的函数 ip_to_int,它将IP地址转换为整数表示形式。这样,我们可以使用按位运算符(例如按位与操作符 &)来处理IP地址和掩码。

通过使用 ip_to_int 函数,我们在 is_direct_delivery 函数中将源网络地址、目的网络地址和子网掩码转换为整数。然后,我们可以执行位运算并进行比较来确定传递方式。

请注意,更新后的示例代码需要使用到 ip_to_int 函数,请确保将其包含在代码中以确保正确运行。

ini 复制代码
def ip_to_int(ip_address):
    octets = ip_address.split('.')
    int_value = 0
    for octet in octets:
        int_value = int_value * 256 + int(octet)
    return int_value 
这段代码是什么意思呢?

这段代码用于将IPv4地址转换为对应的整数表示形式。

函数ip_to_int(ip_address)接受一个IPv4地址作为参数,并将其拆分成四个十进制数(即四个八位的字节)。然后,通过迭代处理每个八位的字节,将其转换为对应的整数,并将它们组合起来形成一个整数表示。

具体来说,以下是代码的逐行解释:

python 复制代码
def ip_to_int(ip_address):
    octets = ip_address.split('.')  # 将IP地址按照小数点进行拆分,得到四个十进制数的列表
    int_value = 0  # 初始化整数表示为0
    for octet in octets:
        int_value = int_value * 256 + int(octet)  # 将之前的结果左移8位并加上新的十进制数值
    return int_value  # 返回最终的整数表示

例如,对于IPv4地址192.168.1.0,函数将对其进行拆分,得到四个十进制数 19216810。然后,根据每个十进制数的值,将其转换为二进制并左移相应的位数。最后,将这四个二进制数合并为一个整数值。在这种情况下,最终的整数表示为3232235776

这种将IPv4地址转换为整数的表示形式在网络编程和计算机网络中经常用到,可以便于比较和处理IP地址。

ini 复制代码
def is_direct_delivery(source_network, destination_network, mask):  
    source_int = ip_to_int(source_network)  
    destination_int = ip_to_int(destination_network)  
    mask_int = ip_to_int(mask)  
    return source_int == destination_int or (source_int & mask_int) == (destination_int & mask_int) 

这段代码是什么意思呢?

这段代码定义了一个函数is_direct_delivery(source_network, destination_network, mask),用于判断两个网络地址是否可以通过直接传递来进行通信,还是需要通过间接传递。

函数首先调用之前定义的ip_to_int函数,将源网络地址、目的网络地址和子网掩码转换为对应的整数表示形式。然后,函数执行以下逻辑判断:

  • 如果源网络地址和目的网络地址相同(整数表示相等),则返回True,表示可以通过直接传递进行通信。
  • 否则,将源网络地址和目的网络地址与子网掩码进行按位与操作(&)。如果按位与结果相等,说明源网络地址和目的网络地址处于相同的子网中,也可以通过直接传递进行通信,返回True
  • 在其他情况下,源网络地址和目的网络地址不相同,并且它们也没有相同的子网掩码。这意味着它们需要通过间接传递来进行通信,返回False

这段代码的作用是判断两个网络地址是否可以直接传递进行通信,或者需要通过间接传递来实现。它使用了整数表示形式和按位运算来处理IP地址和子网掩码,并根据不同的情况做出相应的判断和返回结果。

octet 是什么意思呢?

在计算机网络领域中,"octet" 是一个术语,指的是由8个二进制位(bit)组成的字节(byte)。"Octet" 一词源自 "oct",表示 "八",强调了一个字节通常由8个二进制位组成的事实。

在IPv4地址的上下文中,一个IPv4地址由四个八位的字节组成,每个字节范围从0到255。每个字节使用十进制表示,例如:192.168.1.0 中的 19216810 就是四个 octet(字节)。

所以,当我们在代码中使用 octet 变量时,通常是指代表示IPv4地址中的一个八位字节。在给定的代码示例中,octet 是在遍历 octets 列表时使用的临时变量,用于表示每个 IPv4 地址中的一个 octet(即一个字节)。通过遍历每个 octet,我们可以将它们转换为整数并进行相应的处理。

相关推荐
程序员大阳33 分钟前
闲谭Scala(1)--简介
开发语言·后端·scala·特点·简介
直裾34 分钟前
scala图书借阅系统完整代码
开发语言·后端·scala
大大怪将军~~~~1 小时前
SpringBoot 入门
java·spring boot·后端
凡人的AI工具箱2 小时前
每天40分玩转Django:Django缓存
数据库·人工智能·后端·python·缓存·django
安然望川海2 小时前
springboot 使用注解设置缓存时效
spring boot·后端·缓存
Hello.Reader2 小时前
GraphQL 全景攻略:从基础概念到生产落地的技术指南
后端·graphql
溟洵2 小时前
【C++】异步(并发)实现 线程池 ---附源码+实现步骤(future、async、promise、package_task、任务池原理和框架)
服务器·网络·c++·分布式·后端
2401_8827275711 小时前
低代码配置式组态软件-BY组态
前端·后端·物联网·低代码·前端框架
追逐时光者12 小时前
.NET 在 Visual Studio 中的高效编程技巧集
后端·.net·visual studio