Python套接字编程与ISO-OSI模型

2 投票
2 回答
2785 浏览
提问于 2025-04-15 14:29

我正在从一台电脑发送数据包到另一台电脑。我使用的是Python的socket库,具体是socket.socket(socket.AF_INET, socket.SOCK_DGRAM)。我们需要注意接收到的数据包的顺序吗?在ISO-OSI模型中,传输层以下的层负责处理所有的数据包通信。程序中是否包含所有的ISO-OSI层?还是有些层是在操作系统中?在本地网络上,我收到的数据包都是按顺序的。那在互联网上会有什么不同吗?

2 个回答

5

SOCK_DGRAM表示你想通过UDP发送数据包。这种方式没有顺序保证,也不保证数据能被接收,更不保证数据不会重复。而SOCK_STREAM则意味着使用TCP,这种方式没有数据包边界的保证,但它保证了数据的顺序、能被接收,并且不会重复(除非连接断开)。TCP/IP是让互联网得以实现的网络模型,它赢得了每个实际使用者的心和灵魂,但它并不符合ISO/OSI标准——这个标准是在纸上设计出来的,实际上并没有在真实世界中取得成功。

现在的互联网完全是基于TCP/IP的。不要依赖在低延迟的本地网络上进行的测试,因为这些测试并不能代表在真实世界中会发生什么。欢迎来到真实世界,祝你好运(你会需要一些运气的!)。

4

为了回答你的问题,如果你使用的是 SOCK_STREAM,那么你实际上是在使用 TCP。这是一种传输层的实现,它会帮你处理数据包的顺序和完整性。所以听起来你应该使用这个。SOCK_DGRAM 实际上是 UDP,它不负责任何完整性的问题。

我们需要关注数据包接收的顺序吗?在 ISO-OSI 模型中,传输层以下的层负责所有数据包的通信。程序中是否包含所有 ISO-OSI 层?

为了澄清这一点,在 ISO-OSI 模型中,传输层以下的所有层负责将一个 单独 的数据包从一台计算机发送到另一台计算机,它们并不“理解”数据包顺序的概念(这对它们来说并不适用)。

在这个模型中,还有一层(会话层,在传输层之上)负责定义会话的行为。正是这一层决定是否需要采取措施来防止数据包重排,确保完整性等等。

在现代世界中,ISO-OSI 模型更像是一个理想化的模板,而不是一个实际的模型。TCP/IP 是几乎在所有地方使用的实际实现。

在 TCP/IP 中,传输层 的角色就是定义是否存在会话行为。

撰写回答