欢迎访问陈同学博客原文
最近看的《网络是怎样连接的》非常有趣,真的是 “计算机网络概论” 图解趣味版。
本文写写数据从网卡到应用的过程,内容与图片很多整理自《网络是怎样连接的》、《Tomcat内核设计与剖析》,有的图片因清晰度不够我进行了重绘。
总览
本文围绕这张图从下至上展开。假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢?
网卡
网卡(Network Adapter),也称网络适配器,是一个 硬件设备,有全球唯一的 MAC(Media Access Control)地址,MAC地址在网卡生产时就被烧制在ROM中,网卡初始化时恢复到计算机中。
网卡收到的数据是 光信号或电信号,然后将其还原成 数字信息(1和0组成)。
下图是还原的数字信息结构。
根据 FCS(帧校验序列,Frame Check Sequence) 校验数据,判断数据在传输过程是否因噪音等影响导致信号失真,从而导致数据错误,需要丢弃这种无效的数据包。
然后 检查 数据包中MAC头部中的 接收方的MAC地址,若不是发给自己,则丢弃数据包;若数据包是发给自己,则将数字信息保存到网卡内部缓冲区。
以上过程网卡自行搞定,不需要CPU参与,CPU也不知道数据包的到达。
网卡驱动
硬件需要驱动程序来控制,就像电脑需要操作系统一样,而网卡驱动就是CPU控制和使用网卡的程序。
网卡处理完数字信号后,接下来的数据接收需要CPU参与,此时网卡通过中断将数据包达到的事件通知给CPU。接着,CPU暂停手头工作,开始用网卡驱动来干活。
- 从网卡缓冲区读取接收到的数据
- 根据MAC头部的以太类型字段判断协议种类并调用处理该协议的软件(即协议栈)
通常我们接触的以太类型是 IP协议,因此会调用TCP/IP协议栈来处理。
协议栈
因各层协议看上去像堆叠状态,也就取名"协议栈"。 像TCP、UDP、IP等协议都是规范,而协议栈则是实现各类协议的网络控制软件。例如:Windows、Linux各自对协议进行了