首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 网卡数据收发过程分析

一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...不过本文主要分析网卡设备收发数据的实现,所以不会分析 net_device 结构的所有成员。...下面主要列出收发数据相关的成员,如下: struct net_device { char name[IFNAMSIZ]; // 设备名字 ......通过调用 eth_type_trans 函数从数据包的以太网头部中获取网络层协议类型。 调用 netif_rx 函数将数据包上送给内核网络协议栈。

2.4K30

Linux Socket 收发Json

如果对你有帮助,麻烦点个在看或点个赞,感谢~ 不管是Qt开发还是linux 嵌入式应用开发,一个人的核心竞争力还是不断思考,也就是不断琢磨。...下面的程序主要是Linux C Socket 读取JSON文件并传输,然后再写入文件,其中使用了cJSON库,关于cJSON库不过多介绍,主要介绍整体的思路。 1....,将socket通信独立出来,JSON解析、写文件、响应客户端JSON数据等分别写成函数。...客户端 客户端主要是读取一个JSON文件,然后发送 之后接收服务器响应的JSON数据:在原有数据基础上添加成功与否的标志 具体测试程序: int main(void) { FILE *fid;...小结 编译JSON时需要链接linux的数学库 自己琢磨如何拆解函数功能 应用程序也主要是调用别人的api,那么你的核心竞争力是什么呢 ? 如需程序工程可在公众号后台留言。

4.7K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    IP与以太网的包收发操作的详细讲解

    IP与以太网的包收发操作包的基本知识在网络通信中,数据被封装为数据包进行传输。数据包由头部和数据部分组成,头部包含了发送者和接收者的地址等信息,数据部分则是要传输的实际数据。...包收发操作概览生成包含接收方IP地址的IP头部生成以太网用的MAC头部通过ARP查询目标路由器的MAC地址将IP包转换成电或光信号发送出去给网络包再加3个控制数据向集线器发送网络包接收返回包将服务器的响应包从...以太网使用MAC地址标识每个网络接口,数据以太网中通过帧传输。将IP包转换成电或光信号发送出去在发送数据包时,数据包需要被转换成电或光信号以便在物理介质中传输。...将服务器的响应包从IP传递给TCP服务器的响应包需要传递给上层的TCP协议进行处理,以确保数据的正确性和可靠性。以上是IP与以太网的包收发操作的详细讲解。...通过生成IP头部和MAC头部,查询目标路由器的MAC地址,将数据包转换为信号发送,再进行控制数据处理,最后将服务器的响应包从IP层传递给TCP层,实现了网络通信的收发操作。

    35171

    Linux数据链路层:以太网协议

    一、以太网帧 和 局域网转发数据包 1.局域网转发的原理(基于以太网协议) 1....(2)而现在最常见的局域网通信技术就是以太网,无线LAN,令牌环网(这三种技术在数据链路层使用的都是MAC地址),早在1970年代IBM公司就发明了局域网通信技术令牌环网,但后来在1980年代,局域网通信技术进入了以太网大潮...所以数据传输时,太大也不好,太小也不好,以太网协议规定了数据帧有效载荷的大小区间,最大不能超过上限MTU1500字节,最小不能低于下限46字节 3....【Linux】传输层协议:UDP和TCP 【Linux】网络层协议:IP 二、局域网中的数据碰撞 1.如何解决局域网中的数据碰撞?(碰撞检测和碰撞避免算法) 1....不过我们也有相应的解决方案,那就是HTTPS协议,对数据包中的内容进行加密,下面有我之前写的文章链接,详情可移步。 【Linux】应用层协议:HTTP和HTTPS 2.

    46120

    收发数据的原理(上)

    协议栈的上半部分有两块,分别是负责用TCP协议收发数据的部分和负责用UDP协议收发数据的部分,它们会接受应用程序的委托执行收发数据的操作。...另外,ICMP用于错误提示以及各种控制消息,ARP则是用于查询IP相应的以太网MAC地址。现在只需要大概知道这个名词,后面才会细讲。...双方通过通信规则进行信息交换从而完成数据收发准备。收发操作,需要一块临时存放要收发数据的内存空间,这块内存空间叫做缓冲区,它是在连接操作过程中分配的。 关于控制信息头部 控制信息可以分为两类。...当然,以太网和IP协议也有自己的头部(包含着控制信息),为了避免不同头部混淆,我们一般记作TCP头部,以太网头部、IP头部。本文主要讲解TCP头部,其余知识后面再讲,读者有兴趣可先自行查阅。...等到后面的收发数据操作。 在此,收发数据的创建套接字阶段、连接阶段已经讲完,剩下的通信阶段、断开阶段留到下次再讲。

    77020

    收发数据的原理(下)

    网络原理系列文章: 一、五分钟了解网络连接(已完成) 二、收发数据的原理(上)(已完成) 三、收发数据的原理(下)(已完成) 四、收发数据的番外篇(未完成) 因为网络原理不是三言两语可以讲完,如果读者很忙...至于积累多少数据才发送,有以下两个要素判断。 第一,每个网络包能容纳的数据长度。协议栈会根据一个叫做MTU的参数来进行判断。MTU表示一个网络包的最大长度,在以太网中一般是1500字节。...MTU表示一个网络包的最大长度,在以太网中一般是1500字节。MTU包含了头部的总长度,MTU = MSS + 头部,所以MSS是一个网络包所能容纳的最大数据长度。 第二,等待时间。...上一篇也讲过,发送数据前,要在每一块数据添加TCP头部,并根据套接字中包含的通信对象的信息(发送方和接收方的端口号),然后交给IP模块处理发送操作,IP模块会在每个网络包前面添加IP头部和以太网头部,具体操作...至于积累多少数据才发送,有以下两个要素判断。 第一,每个网络包能容纳的数据长度。协议栈会根据一个叫做MTU的参数来进行判断。MTU表示一个网络包的最大长度,在以太网中一般是1500字节。

    99020

    linux收发邮件_python邮件发送

    linux邮件传输一般用在特定的网络环境下,记住,只要有网络,就能办事; 闲话少扯,直接上干货: 步骤1 邮箱设置开启STMP服务,开启后会收到STMP授权码。...步骤2 linux命令:/etc/mail.rc配置邮件发送参数 将以下数据加到最下面(如下图): #邮箱 set from=843903492@qq.com #默认smtp发送,stmp发送需要在邮箱内配置...@qq.com #这里填的是邮箱授权码(我的授权码就不在这现眼了) set smtp-auth-password=xxxxxxxxxxxxxx set smtp-auth=login 步骤3 linux...注意:命令之间需要加空格(如下图),主要使用的就是发送内容和文件,其他相关linux Mail函数的方法不再赘述。 发送成功后: 内容位置: 有问题的兄弟们下方留言,我及时回复。

    3.8K30

    使用脚本收发 protobuf 协议数据

    protobuf 上面的接口确实是基于二进制数据的协议,虽然是私有协议,但是采用了 protobuf 来进行规范,在提高性能的同时,也保留了一定的通用性。...json,所以需要先安装 nodejs、npm 环境,linux 上的安装大同小异,此处不再赘述。...pbjs 的功能有很多,help 信息中已经罗列出来了,例如生成 js 代码 (--es5/--es6),生成 ts 代码 (--ts),不过最让我感兴趣的还是 --decode,意思是可以将数据解析为...json,下面用上一节的二进制数据做个练手,假设数据已经保存在名为 response.bin 的文件: > pbjs msg.proto --decode ProbeIpv6Response < response.bin...jq 有了 json 数据就好办了,下面上 jq 提取设备 IP,假设已经将数据保存在了 response.json 文件中: > jq -r '.selfAddr.addrV6' probe_v6.

    21821

    Linux 是如何收发网络包的?

    之前写过一篇:你不好奇 Linux 是如何收发网络包的? 文章。 当时有些地方写的比较笼统,然后我「把 Linux 接收+发送网络包的流程」这部分内容完善了下,现在重新分享给大家。 发车发车!...,这每一层都增加了各自的协议头,那自然网络包的大小就增大了,但物理链路并不能传输任意大小的数据包,所以在以太网中,规定了最大传输单元(MTU)是 1500 字节,也就是规定了单次传输的最大 IP 包大小...所以为了解决频繁中断带来的性能开销,Linux 内核在 2.6 版本中引入了 NAPI 机制,它是混合「中断和轮询」的方式来接收网络包,它的核心概念就是不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序...---- 参考资料: 《深入理解Linux网络》 Linux 网络数据接收流程(TCP)- NAPI:https://wenfh2020.com/2021/12/29/kernel-tcp-receive.../ Linux网络-数据包接收过程:https://blog.csdn.net/frank_jb/article/details/115841622

    1.1K10

    linux网络编程系列(十三)--缓冲区设计及收发大量数据

    自定义缓冲区 我们在使用TCP/IP编程的时候除了socket有收发数据缓冲区之外,通常我们还要自己定一个数据收发缓冲区。...如果应用程序随后又要发送50kB数据,而此时发送缓冲区中尚有未发送的数据(若干kB),那么网络库应该将这50kB数据追加到发送缓冲区的末尾,而不能立刻尝试write(),因为这样有可能打乱数据的顺序。...另外的话,假如一次读到的数据不够一个完整的数据包,那么这些已经读到的数据是不是应该先暂存在某个地方,等剩余的数据收到之后再一并处理。...,把连接信息和整个缓冲区压入任务队列,任务线程处理一个任务的数据,就清空缓冲区该段的数据,然后将缓冲区中后面的数据前移(所以每次都是处理的第一个数据区的数据) 优点:减少了malloc 缺点:在数据插入和使用的时候都使用的锁...,而且有严重的拷贝复制情况,(如果想任务处理和数据接收不互相锁,必须使用多的一份儿数据拷贝,情况就更糟) 1.3.3 使用线程池 使用线程池,每个线程独立的读数据,当数据满足一个包的时候就当做任务处理;

    1.2K10

    Linux 命令行中收发 Gmail 邮件

    我喜欢在 Linux 终端上读写电子邮件的便捷,因此我是 Mutt 这个轻量简洁的电子邮件客户端的忠实用户。对于电子邮件服务来说,不同的系统配置和网络接入并不会造成什么影响。...这个客户端通常隐藏在我 Linux 终端的 某个标签页或者某个终端复用器的面板 上,需要用的时候随时可以调出来,不需要使用的时候放到后台,就不需要在桌面上一直放置一个电子邮件客户端的应用程序。...安装 Mutt 在 Linux 系统上,一般可以直接从发行版提供的软件库中安装 Mutt,另外需要在家目录中创建一个 .mutt 目录以存放配置文件: $ sudo dnf install mutt $...为 Gmail 设置双因素身份验证(2FA) Google 希望用户通过 Gmail 网站收发电子邮件,因此当你在 Gmail 网站以外操作电子邮件时,实际上是被 Google 作为“开发者”看待(

    2.9K20

    Linux-485收发切换延迟的解决方法

    应用程序编写时,在原来的普通串口通信基础上,加上485收发方向控制即可。 具体说来,UART发送过程中,将PIN_DIR脚拉高,发送完毕再将PIN_DIR脚拉低,使485总线可以接收数据。...但在Linux应用程序编写中,这个方向切换存在延迟问题。...解决思路 关于收发方向延迟问题,解决思路有如下几种: 由硬件自动控制收发方向的切换,这种方式不需要软件参与,硬件实现也很简单,推荐使用 尝试将操作系统HZ由默认的100改为1000,经测,tcdrain...知识储备 解决此问题,需要有如下知识储备: 了解485通信原理 了解Linux终端设备驱动架构,搞清楚板上串口对应的实际驱动源文件 掌握Linux设备驱动中的中断处理机制:顶半部、底半部(tasklet...缕一下代码,找到串口发送的结束时刻:8250串口的收发数据是通过中断方式实现的,串口的结束时刻在中断处理程序中判断, 1) 中断处理函数的注册 serial8250_init()-> serial8250

    7.7K30

    udp服务端收发数据流程

    6、收到消息的时候,先确定客户端的编码形式是utf-8还是gbk,并且用同样的方式把字节码解码成能看懂的数据。 7、在进行回发的时候,要首先对要发送的数据进行编码,转换成对应的字节码发送。...9、在用线程,进程,进程池的时候可实现消息收发的并行,协程的时候可实现伪并行,原理就是方法之间切换。 10、协程可使用封装好的框架,greenlet以及gevent框架来操作。...可能多个,所以不限 local_port = ('', 8989) # 绑定本地端口 socket_serve.bind(local_port) while True: # 本地端口监听客户端数据...(接收数据) socket_temp_serve_data = socket_serve.recvfrom(1024) # 数据解码 socket_serve_data = socket_temp_serve_data...[0].decode('gbk') # 打印接受到的数据 print(socket_serve_data) # 用户输入数据并对客户端发送 socket_serve_sendto_temp_data

    1K80
    领券