我有一个非常笼统的问题。我试图在 OSI 的两层的两个模块之间进行通信(假设传输层在 A 类中实现,B 类实现网络层)。我的理解是,A 类可以简单地使用 B 类,通过调用其方法将数据有效负载进一步转发到较低层。因此,A 类具有 B 类的知识,反之则不然。
问题是,当 B 类从较低层接收数据时,数据如何转发给 A 类(上层),因为它不知道 A 类。这样的功能在 C++ 中是如何实现的?完成此类任务需要学习哪些重要主题?
我有一个非常笼统的问题。我试图在 OSI 的两层的两个模块之间进行通信(假设传输层在 A 类中实现,B 类实现网络层)。我的理解是,A 类可以简单地使用 B 类,通过调用其方法将数据有效负载进一步转发到较低层。因此,A 类具有 B 类的知识,反之则不然。
问题是,当 B 类从较低层接收数据时,数据如何转发给 A 类(上层),因为它不知道 A 类。这样的功能在 C++ 中是如何实现的?完成此类任务需要学习哪些重要主题?
它在内核中的工作方式是传输层在网络层注册一个回调。当网络层接收到必须传输到网络层的数据报时,它调用此回调函数传递网络层数据报的有效负载。网络层数据报知道它必须将数据报的有效载荷传递给特定的传输层协议,因为有一个特定字段指示上层协议。在 IPv4 数据报的情况下,它是字段Protocol。
您可以通过不同的方式在 C++ 中实现此回调:
当 B 收到协议 X 的数据报时,它会通知为该协议注册的观察者,或者它调用注册的回调或 lambda。
只需在网络层类中编写 setter/getter 函数即可。当传输层类更新时,它通过 getter 函数读取网络数据。
让网络成为传输的私有成员甚至可能是有意义的,因为没有网络,传输永远不会存在。
首先用笔和纸画出所有类的依赖关系。修改它们几次,直到你有一个似乎最有意义的设计。