上一篇说明了操作系统网络包发送过程,本次说明网络包接受过程。发送包过程是ISO模型从上到下的过程。而接受过程则是从下到上的过程。
1.网卡接收数据
网卡可以接收任何经过网卡的数据包,当网卡接收到数据包,由DMA将数据包从网卡传输到ring buffer中。然后触发硬件中断,操作系统介入,发起一个软中断。(这个地方如果直接进行接受数据的协议栈处理会占用CPU的中断,导致其它任务无法响应中断,所以硬中断后直接发起软中断,可以等待CPU的调度执行软中断。)内核线程ksoftirqd发现软中断,关闭网卡的硬中断(此时如果有数据包到网卡,可能又会触发软中断,没有必要),然后调用驱动的poll函数,将ring buffer中的数据封装为skb结构然后交给协议栈进行处理。
2.数据链路层
拿到数据后,通过比较mac地址判断网络包是否是发送给本机的,如果不是本机则丢弃数据包。 如果是本机,则去除mac头。
3.网络层
网络层主要是从数据包中取出IP地址和端口号,比较IP地址是否一致。然后根据端口号获取对应进程的元数据信息。
4.传输层
取出tcp头信息(如果协议是tcp),进行拥塞控制、判断是否丢包等处理。如果一切都木有问题,则将skb放入端口对应的socket的接收队列中。
5.接收数据软中断
操作系统接内核线程收到软中断,触发poll、epoll对应的处理。如果是aio,操作系统则将等待队列数据从内核空间拷贝到用户空间,然后调用aio注册的函数。如果是nio则无需进行处理,等到用户程序调用select即可。如果是bio,则也无需处理,等待用户程序调用read方法即可。
6.应用层处理
bio、NIO、aio分别获取到对应的数据,进行业务处理。