tcp - CPU如何分配来自网络的数据?
问题描述
我正在学习网络通信,并且已经熟悉 TCP/IP 网络层(物理层、数据链路层……和应用层)以及数据如何通过这些节点移动。但是我对当网络接口卡(NIC)接收到数据时机器内部会发生什么有一些疑问。
问题:
- CPU如何知道来自其他机器的数据到达?
- CPU如何通知操作系统来自其他机器的数据到达?
- 操作系统如何知道数据用于哪个应用程序?
请给我一些关于这个主题的深入解释,或者建议一些有用的材料来说明清楚。
解决方案
从 Linux 角度为您提供一般视图(其他操作系统应该类似):
数据包到达 NIC。这些数据包通过 DMA 复制到 RAM 中的循环队列中。数据包的到达会产生一个中断,让系统知道它们是 RAM 中的数据包。对应于中断,将有一个通过网络驱动程序向操作系统注册的中断处理程序例程。(为了简单起见,没有谈论softirq)。每个 CPU 都有一个轮询功能,其工作是从这些队列中收集数据包并将它们传递到上层 n/w 层。所以回答你的问题:
CPU如何知道来自其他机器的数据到达? 当中断发生且轮询循环未在 CPU 上运行时,操作系统(通过网络驱动程序)将要求 CPU 启动轮询循环以收集数据包。
CPU如何通知操作系统来自其他机器的数据到达? CPU不需要通知操作系统。操作系统会知道中断何时发生,因为中断处理程序是网络驱动程序的一部分,网络驱动程序是操作系统的一部分。事实上,操作系统会告诉 CPU 开始收集数据包。
操作系统如何知道数据用于哪个应用程序? 通信是通过具有端口号的套接字完成的。到达的数据包将具有一个端口号,该端口号将指导操作系统将数据包带到所需的应用程序。
推荐阅读
- javascript - 单击类别按钮 Laravel 后,数据库产品未出现在我的页面中
- javascript - 使用Angular重定向到html中的另一个页面
- javascript - Vue 3 vue-cli,如何为 css/js 使用 CDN url?
- apache-beam - 根据偏移量或偏移量时间戳停止从 Kafka 消费的 Beam 管道
- json - 从 VUE 中的本地 json-server 检索数据
- javascript - Javascript函数返回错误的计算值
- rust - 递归构建迭代器会导致“递归不透明类型”错误
- pygame - Python 3.9.6 屏幕不会显示颜色
- html - (HTML & CSS) 我正在尝试在图像之间添加圆圈,但它们不会垂直居中
- r - 使用R比较两个excel文件