Tcp CPU如何从网络分发数据?

Tcp CPU如何从网络分发数据?,tcp,operating-system,nic,Tcp,Operating System,Nic,我正在学习网络通信,并且已经熟悉TCP/IP网络层(物理层、数据链路层……和应用层)以及数据如何通过这些节点移动。但我有一些问题,当网络接口卡(NIC)接收数据时,机器内部会发生什么 问题: CPU如何知道来自其他机器的数据已到达 CPU如何通知操作系统来自其他机器的数据已到达 操作系统如何知道数据用于哪个应用程序 请给我一些关于这个主题的深入解释,或者建议一些有用的材料来说明清楚。从Linux的角度给你一个大致的观点(应该类似于其他操作系统): 数据包到达NIC。这些数据包通过DMA复制到RA

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

问题:

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

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

    从Linux的角度给你一个大致的观点(应该类似于其他操作系统):

    数据包到达NIC。这些数据包通过DMA复制到RAM中的循环队列中。数据包的到达将产生一个中断,让系统知道它们是RAM中的数据包。与中断相对应,将有一个通过网络驱动程序向操作系统注册的中断处理程序例程。(为了简单起见,我没有提到softirq)。每个CPU都有一个轮询函数,其任务是从这些队列中获取数据包并将其传递到上层n/w层。因此,回答您的问题:

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

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

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

    Google“interrupts”、“drivers”。你已经知道(3)的答案了。