
简介
该用户还未填写简介
擅长的技术栈
可提供的服务
暂无可提供的服务
译者序本文翻译自 2017 年的一篇英文博客 Monitoring and Tuning the Linux Networking Stack: Sending Data。如果能看懂英文,建议阅读原文,或者和本文对照看。这篇文章写的是 “Linux networking stack”,这里的 ”stack“ 并不仅仅是内核协议栈, 而是包括内核协议栈在内的,从应用程序通过系统调用写数据到 sock
内核版本:Linux-4.20.8本地处理本地数据包的情况,即数据包目的mac地址是本地的单播数据、广播、组播和网桥处于混杂模式时都需要交给上层处理,在处理完NF_BR_PRE_ROUTING链后会调用br_pass_frame_up进入上层处理static int br_pass_frame_up(struct sk_buff *skb){struct net_device *indev, *b
1. netdev_rx_handler_register在分析之前首先要介绍一个重要函数:netdev_rx_handler_register,这个函数是2.6内核所没有的。netdev_rx_handler_register/** dev: 要注册接收函数的dev* rx_handler: 要注册的接收函数* rx_handler_data: 指向rx_handler_data使用的数据*/i
本章来看下,数据是如何从网络中接收并最后到达应用程序的。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息。1、链路层包到达机器的物理网卡时候触发一个中断,并将通过DMA传送到位于 linux kernel 内存中的rx_ring。中断处理程序分配 skb_buff 数据结构,并将接收到的数据帧从网络适配器I/O端口拷贝到skb_buff 缓冲区中,并设置 skb_b
先看看ip头结构:struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD)// 小端__u8ihl:4,// 首部长度(4位):首部长度指的是IP层头部占32 bit字的数目(也就是IP层头部包含多少个4字节 -- 32位),包括任何选项version:4;// 版本(4位),目前的协议版本号是4,称作IPv4。(注意头最长是:当
此处主要讲的是从数据来到,中断到最终数据包被处理的过程。首先来介绍一下IO端口访问问题,内核提供了这样一组函数处理: /kernel/io.c中inb( )、inw( )、inl( )函数分别从I/O端口读取1、2或4个连续字节。 后缀“b”、“w”、“l”分别代表一个字节(8位)、一个字(16位)以及一个长整型(32 位)。inb_p( )、inw_p( )、inl_p( )分别从I/O端口读取
话不多说,先看一张桥转发时函数调用的一个基本蓝图。这张图中,简单的展示了,数据的接收和发送,其中还包括netfilet的钩子点所处的位置。需要说明的是:1.我们先暂时忽略数据包从一开始是怎么从驱动进入到netif_receive_skb的,因为这个暂时不影响我们理解这幅图的流程。2.由于桥转发的篇幅较大,图中没有标示出,数据包中途被丢弃的情况。约定数据包会发送成功。现在数据包(skb)已经准备好了
网卡网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换MAC芯片主要负责:比特流和帧的转换:7字节的前导码Preamble和1字节的帧首定界符SFDCRC校验Packet Filtering:L2 Filte
基于内核3.17.1版本原文链接:https://blog.csdn.net/subfate/article/details/53107435
提到网络协议栈,数据的收发是核心,我们先来看下数据的接收函数 netif_receive_skb()。先统一介绍下数据收发 。对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由







