首页 > 解决方案 > CPU如何分配来自网络的数据?

问题描述

我正在学习网络通信,并且已经熟悉 TCP/IP 网络层(物理层、数据链路层……和应用层)以及数据如何通过这些节点移动。但是我对当网络接口卡(NIC)接收到数据时机器内部会发生什么有一些疑问。

问题:

  1. CPU如何知道来自其他机器的数据到达?
  2. CPU如何通知操作系统来自其他机器的数据到达?
  3. 操作系统如何知道数据用于哪个应用程序?

请给我一些关于这个主题的深入解释,或者建议一些有用的材料来说明清楚。

标签: tcpoperating-systemnic

解决方案


从 Linux 角度为您提供一般视图(其他操作系统应该类似):

数据包到达 NIC。这些数据包通过 DMA 复制到 RAM 中的循环队列中。数据包的到达会产生一个中断,让系统知道它们是 RAM 中的数据包。对应于中断,将有一个通过网络驱动程序向操作系统注册的中断处理程序例程。(为了简单起见,没有谈论softirq)。每个 CPU 都有一个轮询功能,其工作是从这些队列中收集数据包并将它们传递到上层 n/w 层。所以回答你的问题:

CPU如何知道来自其他机器的数据到达? 当中断发生且轮询循环未在 CPU 上运行时,操作系统(通过网络驱动程序)将要求 CPU 启动轮询循环以收集数据包。

CPU如何通知操作系统来自其他机器的数据到达? CPU不需要通知操作系统。操作系统会知道中断何时发生,因为中断处理程序是网络驱动程序的一部分,网络驱动程序是操作系统的一部分。事实上,操作系统会告诉 CPU 开始收集数据包。

操作系统如何知道数据用于哪个应用程序? 通信是通过具有端口号的套接字完成的。到达的数据包将具有一个端口号,该端口号将指导操作系统将数据包带到所需的应用程序。


推荐阅读