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

Linux 网卡数据收发过程分析

一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核有数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...向 Linux 内核注册了 ei_interrupt 硬件中断服务。 所以,当网卡接收到数据包时,会触发 ei_interrupt 中断服务来通知内核有数据包需要处理。...一般来说,内核网络协议栈会通过网络层的 IP协议 和传输层的 TCP协议 或者 UDP协议 来对数据包进行处理,处理完后就会把数据提交给应用层的进程进行处理。

2.3K30
您找到你想要的搜索结果了吗?
是的
没有找到

性能场景之网络模拟

来源:测试窝 模拟网络状况的有很多种,这里说的是Linux上的TC工具。 什么是TC TC(traffic control)是Linux中的流量控制工具。它是通过控制netem来实现的网络场景模拟。...该工具是直接对物理网卡生效的,如果是逻辑网卡,则该控制无效。如果是用的虚拟机,可视虚拟网卡为物理网卡。 什么是HTB HTB是Hierarchy Token Bucket的缩写。...TC使用步骤 要对网卡进行流量控制的配置,需要进行如下的步骤: 为网卡配置一个队列; 在该队列上建立分类; 根据需要建立子队列和子分类; 为每个分类建立过滤器; 建立与过滤器配合的路由表; 操作实例...限流效果 测试手段从A机B机用iperf开5个线程数据包。 ? ? ? 有很多种手段可以模拟网络丢包、延迟、限流的情况,大家可以自行探索。

1.5K10

CPU:别再拿我当搬砖工!

“我刚才才把这份数据从内核地址空间用户态地址空间拷贝了一次,这还没喘口气,又让我再搬一次从用户态再搬回内核地址空间,太折腾我了吧!”...之前让你们两次搬运数据实在没有办法,这是上边的应用程序要这样写的。他们要把硬盘上的文件读取出来,然后再通过网卡发送出去。这一读一写的不就要搬两次吗?”...“你们看,数据从硬盘最终到网卡,因为有应用程序的参与,他们需要先读到他们在用户空间的缓存区,再发送出去,这样就总共有四次数据的传输。...“还是可以啊,你看像这样···反正最后也是把数据从内核空间交给网卡,只是免去了数据去用户空间白晃一圈的浪费”,我把他画的图改了一下,不肯放弃解释到。 ?...零拷贝技术 不过后来工作太忙,迟迟没有操作系统那边的消息,慢慢的我们就把这事给淡忘了,直到前几天······ “阿Q,听说了吗,最近Linux帝国新成立了一个公司,居然绕过我们CPU就能把数据网卡写入硬盘中

55310

硬核图解!断网了,还能ping通 127.0.0.1 吗?为什么?

ip和icmp的关系 所以,大家在这里完全可以简单的理解为 ping 某个IP 就是某个IP地址发个消息。...TCP数据和ping的区别 一般情况下,我们会使用 TCP 进行网络数据传输,那么我们可以看下它和 ping 的区别。 ? ping和普通发消息的关系 ping和其他应用层软件都属于应用层。...为了发送消息,那就得先知道linux里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了socket 的概念。 要使用 socket , 那么首先需要创建它。...因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外一遍,能通的话说明其他软件数据也能通。...本地网卡,其实就是个"假网卡",它不像"真网卡"那样有个ring buffer什么的,"假网卡"会把数据推到一个叫 input_pkt_queue 的 链表 中。

81950

硬核图解!断网了,还能ping通 127.0.0.1 吗?为什么?

ip和icmp的关系 所以,大家在这里完全可以简单的理解为 ping 某个IP 就是某个IP地址发个消息。...TCP数据和ping的区别 一般情况下,我们会使用 TCP 进行网络数据传输,那么我们可以看下它和 ping 的区别。 ping和普通发消息的关系 ping和其他应用层软件都属于应用层。...为了发送消息,那就得先知道linux里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了socket 的概念。 要使用 socket , 那么首先需要创建它。...因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外一遍,能通的话说明其他软件数据也能通。...本地网卡,其实就是个"假网卡",它不像"真网卡"那样有个ring buffer什么的,"假网卡"会把数据推到一个叫 input_pkt_queue 的 链表 中。

1.5K30

深入理解kubernetes(k8s)网络原理之三-跨主机pod连接

因为每条路由都是针对单个pod的 此时在pod-a中去ping pod-b应该是通了的,假设在pod-b的8080端口运行着一个http服务,在pod-a中请求这个服务,在主机路由的模式下,host1...从host1去host2的过程中,所以源MAC是host1的eth0网卡的mac,目标MAC是host2的eth0网卡的mac。...从host2pod-b,源mac是host2上veth-pod-b网卡的mac,目标mac是pod-b的eth0网卡mac 这是跨节点容器通信方式中最简单高效的方式,没有封包拆包带来的额外消耗,但这种方式的使用场景有一些限制...host-1host-2时是长这样的: img-vxlan.jpg 可以看到,vxlan包是把整个pod-a发往pod-b最原始的帧都装进了一个udp数据包的payload中,整个流程简述如下:...这个问题linux内核协议栈已经帮我们解决好了,linux内核协议栈会悄悄维护连接的状态: 当pod-a向pod-b主动发送数据包时,到达pod-b时,连接状态为NEW; 当pod-b主动向pod-a发送数据

2.3K21

jvm可达性分析算法_对点网络

网卡能做的事(TCP/UDP组包校验和分段,IP添加包头校验与分片)尽量网卡做,网卡不能做的也尽量迟后分片(发送)或提前合并片(接收)来减少在网络栈中传输和处理的包数目,从而减少数据传输和上下文切换所需要的...数据 TSO(TCP分段,TCP Segmentation Offload)在TCP处做,UFO(UDP分片,UDP Fragmentation Offload)因为UDP不支持分段所以移到下层的IP...收数据 LRO(Large Receive Offload),TSO是,LRO是收。将多个TCP分段聚合成一个skb结构,以减小上层协议栈的skb的开销。...GRO(Generic Receive Offloading),GSO是,GRO是收。...比如说,系统一方面在使用大的packet size传输大量的数据,同时在运行许多的交换式应用(interactive application)。

1.7K30

Linux BSP实战课(网络篇):数据包的发送过程

本文将介绍在Linux系统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从应用程序到网卡并最终发送出去的。 socket层 socket(...)...:应用层的程序(Application)调用该函数开始发送数据包,该函数数会调用后面的inet_sendmsg inet_sendmsg:该函数主要是检查当前socket有没有绑定源端口,如果没有的话,...ip_append_data函数中进行分片,同时还会在该函数中检查socket的send buffer是否已经用光,如果被用光的话,返回ENOBUFS udp_send_skb(skb, fl4) 主要是skb...通知网卡发送数据网卡发送完成后发送中断给CPU 收到中断后进行skb的清理工作 在网卡驱动发送数据包过程中,会有一些地方需要和netdevice子系统打交道,比如网卡的队列满了,需要告诉上层不要再发了...,等队列有空闲的时候,再通知上层接着数据

40120

应用层发送一个数据包的时候,是如何到达网卡的(下)

从前面的一篇文章应用层发送一个数据包的时候,是如何到达网卡的(上)可以知道,应用层发送一个数据包的时候首先经过tcp_write和ip_queue_xmit函数,然后调用mac层的dev_queue_xmit...该函数代码如下,主要功能是完成arp解析(如果还没解析的话)、把数据包复制一份和对所有数据包都感兴趣的协议、把数据包插入发送队列,然后发送发送队列中的数据包。如果发送失败则加到发送队列里等待重发。...3c501网卡为例。...0. */ outw(gp_start, GP_LOW); /* aim - packet will be loaded into buffer start */ // 传输数据网卡...\n"); dev_kfree_skb (skb, FREE_WRITE); return 0; } 通过对整个过程的分析我们知道,一个数据包从应用层到网卡的过程中,数据包在tcp层处理完后下发到

1.1K20

tun设备的妙用-V**篇

然后它再把处理过后的数据包重新发回到协议栈中。 下面这段话摘抄自网络上,我觉得是对物理网卡和虚拟网卡的一个很好的概括总结。...首先它也归内核的网络设备子系统管理,对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去...当它用对称秘钥解密并拆封数据后,找到原始请求是要访问10.119.210.110。 ⑨:此时它又扮演了反向代理的角色,向内部服务10.119.210.110起请求。...或许你猜到了,它通过已经打开的/dev/net/tun设备,tun虚拟网卡写入解密拆封后的数据。可还记得上一步v** client是通过读取tun设备从而得到浏览器发出的请求?...这里,它通过向tun设备写入数据来让浏览器得到它想要的回复。 前面提到对于内核和协议栈而言,既然tun设备就是一个网卡,那么当它接收到数据后,就需要完全按照网卡接收数据的流程来处理。

1.3K20

网卡收到一个数据包的时候,是如何传给应用层的(上)

这里以3c501网卡为例,每个设备对应一个device的结构体,下面代码即对3c501网卡数据结构进行初始化,包括发送函数,注册中断回调,mac头长度等。...AX_RX, AX_CMD); /* Aux control, irq and receive enabled */ MOD_INC_USE_COUNT; return 0; } 设置完网卡对应的数据结构后...,如果有数据包到达,由驱动程序中的这两个函数处理。...netif_rx直接把skb挂载到backlog队列中,然后结束中断处理,等下半部分再进行数据包的具体处理。由sock_init函数的代码我们知道,下半部分的处理函数是net_bh。...just after */ cli(); /* * While the queue is not empty */ // backlog队列的数据包来源于网卡收到的数据

1.1K20

tun设备的妙用-VPN篇

然后它再把处理过后的数据包重新发回到协议栈中。 下面这段话摘抄自网络上,我觉得是对物理网卡和虚拟网卡的一个很好的概括总结。...首先它也归内核的网络设备子系统管理,对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去...当它用对称秘钥解密并拆封数据后,找到原始请求是要访问10.119.210.110。 ⑨:此时它又扮演了反向代理的角色,向内部服务10.119.210.110起请求。...很自然地,vpn client会收到这份数据。那么当它解密、拆封后需要做什么呢? 或许你猜到了,它通过已经打开的/dev/net/tun设备,tun虚拟网卡写入解密拆封后的数据。...这里,它通过向tun设备写入数据来让浏览器得到它想要的回复。 前面提到对于内核和协议栈而言,既然tun设备就是一个网卡,那么当它接收到数据后,就需要完全按照网卡接收数据的流程来处理。

4.6K41

TCP 应答时间参数对网络性能的影响

,之后将数据交给应用层 telnet。...服务器应用层需要将收到的数据回显到客户端屏幕,于是服务器将需要回显的数据交由 TCP 进程发送。...在这个模型中,我们可以将服务器客户发送的数据字节确认报文和数据字节回显报文合并成一个报文,这样,上述 TCP 连接就只需交换 3 个报文。...在等待发送 ACK 期间,TCP 收集需要另一端发送的数据,直到收集的数据大小超过 MSS 的定义或者延迟时间超时,TCP 才将 ACK 信息和需要发送的数据合并成一个报文一起发送。...由于目前网络上没有压力,因此从上面的结果,大致可以判断 10000 个网络包用了 2s 的时间,网卡响应很快。round-trip 可以作为网卡响应时间的衡量值。

2.3K120

Linux TunTap 介绍

应用程序如何操作Tun/Tap Linux Tun/Tap驱动程序为应用程序提供了两种交互方式:虚拟网络接口和字符设备/dev/net/tun。...应用程序可以通过标准的Socket API向Tun/Tap接口发送IP数据包,就好像对一个真实的网卡进行操作一样。...应用程序也可以通过/dev/net/tun字符设备写入数据包,这种情况下该字符设备上写入的数据包会被发送到Tun/Tap虚拟接口上,进入操作系统的TCP/IP协议栈进行相应处理,就像从物理网卡进入操作系统的数据一样...Linux Bridge上还有一个Tap虚拟网卡,用于V**程序接收从Linux Bridge上收到的数据包。...假设192.168.0.5出了一个对192.168.0.3的ARP请求,该ARP请求在网络中经过的路径如下: 192.168.0.5出ARP请求,询问192.168.0.3的MAC地址。

2.4K10

超级详细的Linux抓包工具tcpdump详解!

内容速览 简介 tcpdump 是Linux下一款命令行抓包程序,使用 tcpdump 之前,可以先看一下它提供的帮助。...其他常用的一些参数 -i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any -Q:选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=...#过滤出源地址是1.1.1.1任意主机的3389端口的数据包 tcpdump src 1.1.1.1 and dst port 3389 当你在使用多个过滤器进行组合时,有可能需要用到括号,而括号在...#过滤出源地址是1.1.1.1任意主机的3389端口或者22端口的数据包 tcpdump 'src 1.1.1.1 and (dst port 3389 or 22)' =:判断二者相等 ==:...,in 和 out eproc:表示 effective process name epid:表示 effective process ID #过滤来自进程名为 nc 发出的流经 en0 网卡数据

3.1K30

小白必看!用Wireshark真实模拟寻找ARP协议的过程!

结合应用,看下协议在真实工作中如何应用它以及什么场景下可以用到它。ARP协议,在它的工作原理里面有一张ARP表。 打开cmd,调出系统的命令行。我自己的电脑其实也有自己的ARP表。...看到很多接口,不同的接口,因为这台电脑有很多不同的网卡。192.168.1.4是我上网用的接口。...其中一个ip地址发送信息,其中一个ARP表里找下有没有对应的mac地址,有的话就直接发送。如果没有,通过ARP协议寻找mac地址。...Wireshark这个工具是通过网卡抓取所有的报文流量进行分析。...按红色按钮暂停,然后输入arp,回车,过滤出我想要的报文: 192.168.1.4是我这台电脑的ip,去给192.168.1.10送消息。

1.4K30

Linux阅码场 - Linux内核月报(2020年12月)

本期月报主要贡献人员: 张健、廖威雄、chenwei、夏天 期链接: Linux阅码场 - Linux内核月报(2020年06月) Linux阅码场 - Linux内核月报(2020年07月)...例如,一个在虚拟机中运行的用于处理敏感数据应用程序,可以和运行在同一个虚拟机中的其它应用程序分离开。我们称呼这个运行EC2实例的虚拟机为主虚拟机。...让SRIOV网卡数据面使用VIRTIO Ring的设计布局,这样在虚拟机中就只需要单一的VIRTIO网卡驱动,而不需要部属各种厂商SRIOV网卡VF的驱动。...VIRTIO full offload方案中需要硬件厂商在网卡硬件层面实现VIRTIO的数据面和控制面,数据面的难度比较低,但是控制面会复杂很多,因为这个涉及和内存管理单元(IOMMU)的交互。...简而言之,vDPA是一种比VIRTIO full offload更加灵活的设计方法,让网卡设计厂商可以用更小的代价支持VIRTIO硬件Ring,并仍然在数据平面上实现线速性能。

1.6K60
领券