22.1 传递
网络层负责用底层物理网络处理分组,我们定义这种处理为分组的传递。分组传递到最终目的端,可使用两种不同的方法:直接传递和间接传递,如图22.1所示。注意,一个传递永远包含一个直接传递和 0 个或多个间接传递;最后的传递总是直接传递。
直接传递 direct delivery 就是分组的最终目的端主机与发送方都连接在同一个物理网络上。当分组的源端和目的端都在同一个物理网络上,或者传递是在最后一个路由器与目的主机之间进行时,就出现直接传递。
发送方很容易确定传递是否是直接传递,方法是提取出分组目的端的网络地址和掩码,并与它所连接的网络地址进行比较,如果相同则直接传递。
间接传递 indirect delivery 是指,目的主机与发送方不在同一个物理网络上,分组就是间接传递。在间接传递中,分组从一个路由器传送到另一个路由器,直到它到达「与最终目的端连接在同一个物理网络上的路由器」为止。
版权声明:本文为CSDN博主「memcpy0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
以下是一个简单的示例代码,用于判断给定分组的传递方式(直接传递或间接传递):
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语言编写的,用于说明概念,并非完整且可运行的代码。实际情况下,您可能需要根据编程语言和网络库的要求进行相应的调整和实现。
source_network = 192.168.1.0
^
SyntaxError: invalid syntax
抱歉,我的回答中给出的示例代码有一个错误。IP地址应该以字符串形式表示,并在示例代码中使用正确的语法。以下是修正后的示例代码:
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地址相关的变量以正确的字符串形式传递和使用。
return source_network == destination_network or (source_network & mask) == (destination_network & mask)
TypeError: unsupported operand type(s) for &: 'str' and 'str'
抱歉再一次给出了错误的代码示例。由于Python中的字符串不能直接进行位运算(例如按位与操作),我们需要将IP地址转换为整数以执行掩码计算。以下是修正后的示例代码:
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
函数,请确保将其包含在代码中以确保正确运行。
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地址作为参数,并将其拆分成四个十进制数(即四个八位的字节)。然后,通过迭代处理每个八位的字节,将其转换为对应的整数,并将它们组合起来形成一个整数表示。
具体来说,以下是代码的逐行解释:
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
,函数将对其进行拆分,得到四个十进制数 192
,168
,1
,0
。然后,根据每个十进制数的值,将其转换为二进制并左移相应的位数。最后,将这四个二进制数合并为一个整数值。在这种情况下,最终的整数表示为3232235776
。
这种将IPv4地址转换为整数的表示形式在网络编程和计算机网络中经常用到,可以便于比较和处理IP地址。
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
中的 192
、168
、1
、0
就是四个 octet(字节)。
所以,当我们在代码中使用 octet
变量时,通常是指代表示IPv4地址中的一个八位字节。在给定的代码示例中,octet
是在遍历 octets
列表时使用的临时变量,用于表示每个 IPv4 地址中的一个 octet(即一个字节)。通过遍历每个 octet
,我们可以将它们转换为整数并进行相应的处理。