理解 Linux网络栈(1):Linux 网络协议栈简单总结( 三 )
文章插图
1.1.5 物理层 - 物理层封装和发送
文章插图
- 物理层在收到发送请求之后 , 通过 DMA 将该主存中的数据拷贝至内部RAM(buffer)之中 。 在数据拷贝中 , 同时加入符合以太网协议的相关header , IFG、前导符和CRC 。 对于以太网网络 , 物理层发送采用CSMA/CD,即在发送过程中侦听链路冲突 。
- 一旦网卡完成报文发送 , 将产生中断通知CPU , 然后驱动层中的中断处理程序就可以删除保存的 skb 了 。
文章插图
1.2 接收端1.2.1 物理层和数据链路层
文章插图
简要过程:
- 一个 package 到达机器的物理网络适配器 , 当它接收到数据帧时 , 就会触发一个中断 , 并将通过 DMA 传送到位于 linux kernel 内存中的 rx_ring 。
- 网卡发出中断 , 通知 CPU 有个 package 需要它处理 。 中断处理程序主要进行以下一些操作 , 包括分配 skb_buff 数据结构 , 并将接收到的数据帧从网络适配器I/O端口拷贝到skb_buff 缓冲区中;从数据帧中提取出一些信息 , 并设置 skb_buff 相应的参数 , 这些参数将被上层的网络协议使用 , 例如skb->protocol;
- 终端处理程序经过简单处理后 , 发出一个软中断(NET_RX_SOFTIRQ) , 通知内核接收到新的数据帧 。
- 内核 2.5 中引入一组新的 API 来处理接收的数据帧 , 即 NAPI 。 所以 , 驱动有两种方式通知内核:(1) 通过以前的函数netif_rx;(2)通过NAPI机制 。 该中断处理程序调用 Network device的 netif_rx_schedule 函数 , 进入软中断处理流程 , 再调用 net_rx_action 函数 。
- 该函数关闭中断 , 获取每个 Network device 的 rx_ring 中的所有 package , 最终 pacakage 从 rx_ring 中被删除 , 进入 netif _receive_skb 处理流程 。
- netif_receive_skb 是链路层接收数据报的最后一站 。 它根据注册在全局数组 ptype_all 和 ptype_base 里的网络层数据报类型 , 把数据报递交给不同的网络层协议的接收函数(INET域中主要是ip_rcv和arp_rcv) 。 该函数主要就是调用第三层协议的接收函数处理该skb包 , 进入第三层网络层处理 。
文章插图
- IP 层的入口函数在 ip_rcv 函数 。 该函数首先会做包括 package checksum 在内的各种检查 , 如果需要的话会做 IP defragment(将多个分片合并) , 然后 packet 调用已经注册的 Pre-routing netfilter hook, 完成后最终到达 ip_rcv_finish 函数 。
- ip_rcv_finish 函数会调用 ip_router_input 函数 , 进入路由处理环节 。 它首先会调用 ip_route_input 来更新路由 , 然后查找 route , 决定该 package 将会被发到本机还是会被转发还是丢弃: 如果是发到本机的话 , 调用 ip_local_deliver 函数 , 可能会做 de-fragment(合并多个 IP packet) , 然后调用 ip_local_deliver 函数 。 该函数根据 package 的下一个处理层的 protocal number , 调用下一层接口 , 包括 tcp_v4_rcv (TCP), udp_rcv (UDP) , icmp_rcv (ICMP) , igmp_rcv(IGMP) 。 对于 TCP 来说 , 函数 tcp_v4_rcv 函数会被调用 , 从而处理流程进入 TCP 栈 。 如果需要转发 (forward) , 则进入转发流程 。 该流程需要处理 TTL , 再调用 dst_input 函数 。 该函数会 (1)处理 Netfilter Hook (2)执行 IP fragmentation (3)调用 dev_queue_xmit , 进入链路层处理流程 。
- 设计模式6之代理模式
- 退休主任医师的网络医生经验:一天最多能看20人 很要耐心
- Nginx服务器屏蔽与禁止屏蔽网络爬虫的方法
- 监控摄像头被黑!Mirai僵尸网络再作乱物联网设备成重灾区
- 在图上发送消息的神经网络MPNN简介和代码实现
- Linux培训完能到什么水平,之后还需要学习哪些技术?
- 如何使用 lshw 查看 Linux 设备信息
- 网络安全:如何使用MSFPC半自动化生成强大的木码?「下集」
- 人工智能驱动的零接触网络在5G世界中的作用
- AMD Radeon图形驱动占到了Linux内核的10.5%