一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核有数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...向 Linux 内核注册了 ei_interrupt 硬件中断服务。 所以,当网卡接收到数据包时,会触发 ei_interrupt 中断服务来通知内核有数据包需要处理。...一般来说,内核网络协议栈会通过网络层的 IP协议 和传输层的 TCP协议 或者 UDP协议 来对数据包进行处理,处理完后就会把数据提交给应用层的进程进行处理。
异步方法的一种变体经常出现在网卡上。这些卡通常希望在与处理器共享的内存中建立一个循环缓冲区(通常称为DMA 环形缓冲区);每个传入的数据包都放在环中的下一个可用缓冲区中,并发出中断信号。...https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch13s04.html https://en.wikipedia.org...arthurchiao.art/blog/monitoring-network-stack/ https://blog.packagecloud.io/illustrated-guide-monitoring-tuning-linux-networking-stack-receiving-data.../ https://blog.packagecloud.io/monitoring-tuning-linux-networking-stack-receiving-data/ https://www.linuxjournal.com.../content/queueing-linux-network-stack
来源:测试窝 模拟网络状况的有很多种,这里说的是Linux上的TC工具。 什么是TC TC(traffic control)是Linux中的流量控制工具。它是通过控制netem来实现的网络场景模拟。...该工具是直接对物理网卡生效的,如果是逻辑网卡,则该控制无效。如果是用的虚拟机,可视虚拟网卡为物理网卡。 什么是HTB HTB是Hierarchy Token Bucket的缩写。...TC使用步骤 要对网卡进行流量控制的配置,需要进行如下的步骤: 为网卡配置一个队列; 在该队列上建立分类; 根据需要建立子队列和子分类; 为每个分类建立过滤器; 建立与过滤器配合的路由表; 操作实例...限流效果 测试手段从A机往B机用iperf开5个线程发数据包。 ? ? ? 有很多种手段可以模拟网络丢包、延迟、限流的情况,大家可以自行探索。
“我刚才才把这份数据从内核地址空间往用户态地址空间拷贝了一次,这还没喘口气,又让我再搬一次从用户态再搬回内核地址空间,太折腾我了吧!”...之前让你们两次搬运数据实在没有办法,这是上边的应用程序要这样写的。他们要把硬盘上的文件读取出来,然后再通过网卡发送出去。这一读一写的不就要搬两次吗?”...“你们看,数据从硬盘最终到网卡,因为有应用程序的参与,他们需要先读到他们在用户空间的缓存区,再发送出去,这样就总共有四次数据的传输。...“还是可以发啊,你看像这样···反正最后也是把数据从内核空间交给网卡发,只是免去了数据去用户空间白晃一圈的浪费”,我把他画的图改了一下,不肯放弃解释到。 ?...零拷贝技术 不过后来工作太忙,迟迟没有操作系统那边的消息,慢慢的我们就把这事给淡忘了,直到前几天······ “阿Q,听说了吗,最近Linux帝国新成立了一个公司,居然绕过我们CPU就能把数据从网卡写入硬盘中
因为每条路由都是针对单个pod的 此时在pod-a中去ping pod-b应该是通了的,假设在pod-b的8080端口运行着一个http服务,在pod-a中请求这个服务,在主机路由的模式下,host1发往...从host1去往host2的过程中,所以源MAC是host1的eth0网卡的mac,目标MAC是host2的eth0网卡的mac。...从host2发往pod-b,源mac是host2上veth-pod-b网卡的mac,目标mac是pod-b的eth0网卡mac 这是跨节点容器通信方式中最简单高效的方式,没有封包拆包带来的额外消耗,但这种方式的使用场景有一些限制...host-1发往host-2时是长这样的: img-vxlan.jpg 可以看到,vxlan包是把整个pod-a发往pod-b最原始的帧都装进了一个udp数据包的payload中,整个流程简述如下:...这个问题linux内核协议栈已经帮我们解决好了,linux内核协议栈会悄悄维护连接的状态: 当pod-a向pod-b主动发送数据包时,到达pod-b时,连接状态为NEW; 当pod-b主动向pod-a发送数据包
ip和icmp的关系 所以,大家在这里完全可以简单的理解为 ping 某个IP 就是往某个IP地址发个消息。...TCP发数据和ping的区别 一般情况下,我们会使用 TCP 进行网络数据传输,那么我们可以看下它和 ping 的区别。 ? ping和普通发消息的关系 ping和其他应用层软件都属于应用层。...为了发送消息,那就得先知道往哪发。linux里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了socket 的概念。 要使用 socket , 那么首先需要创建它。...因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外发一遍,能通的话说明其他软件发的数据也能通。...本地网卡,其实就是个"假网卡",它不像"真网卡"那样有个ring buffer什么的,"假网卡"会把数据推到一个叫 input_pkt_queue 的 链表 中。
ip和icmp的关系 所以,大家在这里完全可以简单的理解为 ping 某个IP 就是往某个IP地址发个消息。...TCP发数据和ping的区别 一般情况下,我们会使用 TCP 进行网络数据传输,那么我们可以看下它和 ping 的区别。 ping和普通发消息的关系 ping和其他应用层软件都属于应用层。...为了发送消息,那就得先知道往哪发。linux里万物皆文件,那你要发消息的目的地,也是个文件,这里就引出了socket 的概念。 要使用 socket , 那么首先需要创建它。...因为可以简单理解为ping就是自己组了个数据包,让系统按着其他软件发送数据的路径往外发一遍,能通的话说明其他软件发的数据也能通。...本地网卡,其实就是个"假网卡",它不像"真网卡"那样有个ring buffer什么的,"假网卡"会把数据推到一个叫 input_pkt_queue 的 链表 中。
网卡能做的事(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)。
低功耗多通道无线数据采发仪4.png 整个设备由供电模块、任务管理模块、功耗管理模块、无线模块、数字接口模块、模拟接口模块、防雷模块、系统控制模块、状态扫描模块及报警模块构成,固件程序采用UCOSGUI...通道数量(输入) 2路DO+2路AO 优势 整体低功耗设计,专为野外安装实际需求设计,可长时间、高可靠度工作; 丰富的输入输出接口; 独立的三级防雷模块设计; 创新的双MCU电路结构; 应用领域广泛
本文将介绍在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子系统打交道,比如网卡的队列满了,需要告诉上层不要再发了...,等队列有空闲的时候,再通知上层接着发数据。
从前面的一篇文章应用层发送一个数据包的时候,是如何到达网卡的(上)可以知道,应用层发送一个数据包的时候首先经过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层处理完后下发到
这里以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队列的数据包来源于网卡收到的数据包
然后它再把处理过后的数据包重新发回到协议栈中。 下面这段话摘抄自网络上,我觉得是对物理网卡和虚拟网卡的一个很好的概括总结。...首先它也归内核的网络设备子系统管理,对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去...当它用对称秘钥解密并拆封数据后,找到原始请求是要访问10.119.210.110。 ⑨:此时它又扮演了反向代理的角色,向内部服务10.119.210.110发起请求。...或许你猜到了,它通过已经打开的/dev/net/tun设备,往tun虚拟网卡写入解密拆封后的数据。可还记得上一步v** client是通过读取tun设备从而得到浏览器发出的请求?...这里,它通过向tun设备写入数据来让浏览器得到它想要的回复。 前面提到对于内核和协议栈而言,既然tun设备就是一个网卡,那么当它接收到数据后,就需要完全按照网卡接收数据的流程来处理。
上篇讲到mac头通过mac头的协议字段决定把数据包分发给上层的哪个协议。...continue; } else { skb2 = skb; } // 找到了处理该数据包的上层协议...* Shift to last raw user */ raw_rcv(raw_sk, skb, dev, iph->saddr, iph->daddr); // 没找到处理该数据包的上层协议...; kfree_skb(skb, FREE_WRITE); } return(0); } ip层遍历inet_protos数组,找到和ip头中指定的协议相等的协议,把数据包交给该节点处理...应用层使用read函数进行读取的时候,就从接收队列摘下一个skb。至此,一个数据包从网卡到应用层的过程就结束了。
然后它再把处理过后的数据包重新发回到协议栈中。 下面这段话摘抄自网络上,我觉得是对物理网卡和虚拟网卡的一个很好的概括总结。...首先它也归内核的网络设备子系统管理,对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去...当它用对称秘钥解密并拆封数据后,找到原始请求是要访问10.119.210.110。 ⑨:此时它又扮演了反向代理的角色,向内部服务10.119.210.110发起请求。...很自然地,vpn client会收到这份数据。那么当它解密、拆封后需要做什么呢? 或许你猜到了,它通过已经打开的/dev/net/tun设备,往tun虚拟网卡写入解密拆封后的数据。...这里,它通过向tun设备写入数据来让浏览器得到它想要的回复。 前面提到对于内核和协议栈而言,既然tun设备就是一个网卡,那么当它接收到数据后,就需要完全按照网卡接收数据的流程来处理。
,之后将数据交给应用层 telnet。...服务器应用层需要将收到的数据回显到客户端屏幕,于是服务器将需要回显的数据交由 TCP 进程发送。...在这个模型中,我们可以将服务器往客户发送的数据字节确认报文和数据字节回显报文合并成一个报文,这样,上述 TCP 连接就只需交换 3 个报文。...在等待发送 ACK 期间,TCP 收集需要往另一端发送的数据,直到收集的数据大小超过 MSS 的定义或者延迟时间超时,TCP 才将 ACK 信息和需要发送的数据合并成一个报文一起发送。...由于目前网络上没有压力,因此从上面的结果,大致可以判断发 10000 个网络包用了 2s 的时间,网卡响应很快。round-trip 可以作为网卡响应时间的衡量值。
内容速览 简介 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 网卡的数据包
pod2的详细流程; 发送 数据包从pod1出来,到达node1的协议栈,node1发现目标地址并非本机地址,且本机开启了流量转发功能,于是查找路由并转发; 目标IP为10.244.3.3,主机路由匹配到应该走...因为是vxlan设备,发送方法与普通的网卡有些区别(详见下面的代码vxlan_xmit),数据包没有被提交到网卡的发送队列,而是由vxlan设备进一步封装成一个udp数据包,它会根据目标mac地址来反查下一跳的主机地址以决定把这个...udp数据包发给哪个主机,这时候就会用到上面提到的fdb表了,它查到去往02:3f:39:67:7d:f9的下一跳主机地址为192.168.3.10(节点新增时,步骤三添加的FDB记录就用上了),于是封装.../net/tun文件,主机就会多一张名为tun0的网卡,任何时候往这个打开的文件写的内容都会直接被内核协议栈收包,效果就是相当于上面代码中调用了netif_rx(skb)的效果,而发往这个tun0网卡的数据...我们继续用上面的场景举例,说明一下udp模式下的数据包发送流程: pod1发送给pod2的数据给会被主机路由引导通过tun设备(flannel.1)发送; flanneld进程从打开的/dev/net/
结合应用,看下协议在真实工作中如何应用它以及什么场景下可以用到它。ARP协议,在它的工作原理里面有一张ARP表。 打开cmd,调出系统的命令行。我自己的电脑其实也有自己的ARP表。...看到很多接口,不同的接口,因为这台电脑有很多不同的网卡。192.168.1.4是我上网用的接口。...往其中一个ip地址发送信息,往其中一个ARP表里找下有没有对应的mac地址,有的话就直接发送。如果没有,通过ARP协议寻找mac地址。...Wireshark这个工具是通过网卡抓取所有的报文流量进行分析。...按红色按钮暂停,然后输入arp,回车,过滤出我想要的报文: 192.168.1.4是我这台电脑的ip,去给192.168.1.10发送消息。
本期月报主要贡献人员: 张健、廖威雄、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,并仍然在数据平面上实现线速性能。
领取专属 10元无门槛券
手把手带您无忧上云