![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux数据报文接收发送总结
文章平均质量分 56
Linux数据报文接收发送总结
wangxinyu2011
本人于2011年大学毕业后,一直从事家用网络设备的软件开发工作。从刚入职场的小白,到现在仍在奋斗的路上,一路走来得到了同事、领导、开源社区、技术博客等的帮助。一直想着在自己知识经验范围内,将自己浅薄的总结,提供给需要的人进行参考。技术的共享,开源社区的繁荣,我们每个从事技术开发的人都将受益。
展开
-
Linux数据报文接收发送总结7
2.4 网卡驱动初始化每一个驱动程序(不仅仅只是网卡驱动)会使用 module_init 向内核注册一个初始化函数,当驱动被加载时,内核会调用这个函数。比如igb网卡驱动的代码位于drivers/net/ethernet/intel/igb/igb_main.c//file: drivers/net/ethernet/intel/igb/igb_main.cstatic struct pci_driver igb_driver = { .name = igb_driver_nam原创 2021-05-18 21:57:12 · 5014 阅读 · 0 评论 -
Linux数据报文接收发送总结6
2.3 协议栈注册内核实现了网络层的ip协议,也实现了传输层的tcp协议和udp协议。这些协议对应的实现函数分别是ip_rcv(),tcp_v4_rcv()和udp_rcv()。和我们平时写代码的方式不一样的是,内核是通过注册的方式来实现的。Linux内核中的fs_initcall和subsys_initcall类似,也是初始化模块的入口。fs_initcall调用inet_init后开始网络协议栈注册。通过inet_init,将这些函数注册到了inet_protos(传输层协议)和ptype_base原创 2021-05-05 21:18:24 · 5395 阅读 · 2 评论 -
Linux数据报文接收发送总结5
2.2 网络子系统初始化linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。这里我们要说的是网络子系统的初始化,会执行到net_dev_init函数。/* * Initialize the DEV module. At boot time this walks the device list and * unhooks any devices that fail to initialise (nor..原创 2021-05-05 21:03:40 · 5444 阅读 · 0 评论 -
Linux数据报文接收发送总结4
二、系统初始化Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行。比如要提前创建好ksoftirqd内核线程,要注册好各个协议对应的处理函数,网络设备子系统要提前初始化好,网卡要启动好。只有这些都Ready之后,我们才能真正开始接收数据包。那么我们现在来看看这些准备工作都是怎么做的。Linux的子系统、模块均定义了一定的启动级别,在start_kernel函数中,按顺序启动/* initcalls are now grouped by functio..原创 2021-02-17 13:50:42 · 18279 阅读 · 0 评论 -
Linux数据报文接收发送总结3
1.3 协议分层大概了解了网卡驱动、硬中断、软中断和ksoftirqd线程之后,我们在这几个概念的基础上给出一个内核收包的路径示意:当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动。网络驱动会以DMA的方式把网卡上收到的帧写到内存里。再向CPU发起一个中断,以通知CPU有数据到达。当CPU收到中断请求后,会去调用网络驱动注册的中断处理函数。网卡的中断处理函数并不做过多工作,发出软中断请求,然后尽快释放CPU。ksoftirqd检测到有软中断请求到达,调用pol..原创 2021-02-17 12:11:20 · 18300 阅读 · 0 评论 -
Linux数据报文接收发送总结2
1. 准备工作此处重点介绍基础概念,为后面介绍数据包收发打下基础。本次代码层面基于Linux 4.4 Kernel。1.1 系统调用Linux的系统运行分为用户态和内核态,内核态控制着系统资源。通过定时器进行调度,把cpu分配给用户进程使用;通过中断来响应外设请求;并有一定的框架来管理内存、文件、网络等。系统调用流程如下:1.2 中断内核和网络设备驱动是通过中断的方式来处理的。当设备上有数据到达的时候,会给CPU的相关引脚上触发一个电压变化,以通知CPU来处理数据..原创 2021-02-17 11:50:55 · 18106 阅读 · 0 评论 -
Linux数据报文接收发送总结1
0.引如下简单的一段在代码,我们在Linux上运行;同时再运行一服务端的回显;#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>int main(void){ int sk = 0; struct sockaddr_in ser; char buf[1024].原创 2020-12-06 23:21:36 · 18594 阅读 · 0 评论