精华内容
下载资源
问答
  • 2017-06-23 13:49:19

    1.网络模型

    因特网的五层协议栈:

        应用层
        运输层
        网络层
        链路层
        物理层

    七层ISO模型

        应用层
        表示层
        会话层
        运输层
        网络层
        链路层
        物理层

    2.网络模型各层意义

    物理层:主要负责帧数据在节点间的移动
    链路层:典型为以太网和PPP协议,数据称做帧(frame)
    网络层:典型为IP协议,数据称做数据报(datagram)
    网络层:典型为TCP/UDP协议,数据称做报文段(segment),主要负责应用程序端点间的传送
    会话层:主要是数据的定界和同步
    表示层:主要是解释数据的含义,包括数据压缩,加密等
    应用层:典型为HTTP,SMTP等协议,数据称做报文(message)

    3.网络模型各层头部信息

    以太网帧头部包含:目的MAC,源MAC和网络层协议类型,(组播的目的MAC:MAC地址只要第48bit是1就表示组播地址,一般组播地址的第1字节是0x01;组播的源MAC:它唯一标识这个设备,所以只能是单播地址)
    IP数据报头部包含:运输层的协议,源和目的IP地址

    4.网卡接收数据流程

    • (物理层)网卡接收来自其他节点的数据帧
    • (链路层)根据帧头信息获取数据报
    • (网络层)路由过滤,判断是否应该丢弃该数据报,并根据数据报头信息获取TCP/UDP数据段
    • (运输层)根据数据段头信息获取实际的用户数据
    • (应用层)根据应用层协议获取最终的有效信息
    更多相关内容
  • 介绍网卡的接受和发送过程,对网卡驱动编写提供参考
  • USB网卡收发数据分析

    千次阅读 2022-02-12 15:23:19
    网络的软硬件设施,其目的的本质,不就是传输数据帧吗?那么,在这个过程中,缓存数据帧的 sk_buff,就很重要了。

    前言

    网络子系统是 Linux 内核的重中之重。今天,我们从网卡驱动入手,开始网络子系统的探索之路。

    硬件环境请添加图片描述

    树莓派3B+,搭载千兆网卡 LAN7515,不过其使用的是 USB2.0 通道(最高理论速度为480Mbps),官方给出 300Mbps 的以太网传输速率。

    驱动

    LAN7515 的驱动为 lan78xx,源码比较简单,就两个文件 ./linux/drivers/net/usb/lan78xx.c/h,编译后产生 lan78xx.ko 驱动文件。

    驱动分析

    1. USB 驱动注册

    static struct usb_driver lan78xx_driver = {
    	.name			= DRIVER_NAME,
    	.id_table		= products,
    	.probe			= lan78xx_probe,
    	.disconnect		= lan78xx_disconnect,
    	.suspend		= lan78xx_suspend,
    	.resume			= lan78xx_resume,
    	.reset_resume		= lan78xx_reset_resume,
    	.supports_autosuspend	= 1,
    	.disable_hub_initiated_lpm = 1,
    };
    
    module_usb_driver(lan78xx_driver);
    

    LAN7515 是 USB 网卡,和 CPU 交互的接口为 USB,所以它是一个 USB 设备,要在内核注册它的 USB 驱动——lan78xx.ko。
    insmod lan78xx.ko 即在 USB 总线上注册 LAN7515 网卡驱动,此时,会遍历 USB 总线上已注册的设备,用总线的 match 方法判断是否有匹配的设备,如果有,则调用驱动的 probe 函数。
    具体看一下:
    在这里插入图片描述
    /sys/bus/usb/ 下有 devices 和 drivers 目录,这两个目录下分别是当前系统中 USB 总线上已注册的设备已注册的驱动
    可以看到,在 drivers 目录中目前还没有 lan78xx 驱动,并且我们也不知道 devices 目录中的哪个 USB 设备为 LAN7515 设备。
    下面我们安装 lan78xx 驱动
    在这里插入图片描述
    看到执行了 lan78xx_probe() 函数,这也印证了我们上面的说法(注册驱动,会遍历设备,寻求匹配,匹配成功,触发 probe)。
    我们再次查看 /sys/bus/usb/drivers 下的目录情况
    在这里插入图片描述
    可以看到,已经产生了 lan78xx 目录,说明驱动注册成功了。

    2. 驱动和设备绑定

    在 lan78xx_probe() 函数中调用了 lan78xx_bind() 方法,正式地将 lan78xx 驱动和 1-1.1.1:1.1 设备绑定了起来。在 lan78xx 目录下也能体现这一点。
    在这里插入图片描述
    我们也可以手动绑定和解绑

    # ifconfig -a
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:42 errors:0 dropped:0 overruns:0 frame:0
              TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:4478 (4.3 KiB)  TX bytes:4478 (4.3 KiB)
    # ls
    bind       module     new_id     remove_id  uevent     unbind
    # echo "1-1.1.1:1.0" > bind 
    [37493.831496] lan78xx_probe()
    [37494.126379] lan78xx 1-1.1.1:1.0 (unnamed net_device) (uninitialized): No External EEPROM. Setting MAC Speed
    [37494.144756] libphy: lan78xx-mdiobus: probed
    [37494.264385] lan78xx 1-1.1.1:1.0 (unnamed net_device) (uninitialized): int urb period 64
    [37494.276093] lan78xx_phy_init()
    # ls
    1-1.1.1:1.0  module       remove_id    unbind
    bind         new_id       uevent
    # ifconfig -a
    eth0      Link encap:Ethernet  HWaddr B8:27:EB:8A:BC:F4  
              BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:42 errors:0 dropped:0 overruns:0 frame:0
              TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:4478 (4.3 KiB)  TX bytes:4478 (4.3 KiB)
    # 
    # 
    # echo "1-1.1.1:1.0" > unbind 
    # ls
    bind       module     new_id     remove_id  uevent     unbind
    # ifconfig -a
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:42 errors:0 dropped:0 overruns:0 frame:0
              TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:4478 (4.3 KiB)  TX bytes:4478 (4.3 KiB)
    # 
    

    3. 数据收发

    以 PC1 数据链路层发送一个数据包给 PC2 数据链路层为例
    请添加图片描述
    rx

    tasklet_schedule(&dev->bh);	// USB 收到数据时,产生中断,触发该任务
    lan78xx_bh()
        lan78xx_rx_bh()
            rx_submit()
                usb_fill_bulk_urb()	// 从 USB 读取数据
                tasklet_schedule(&dev->bh);
                    lan78xx_bh()
                        rx_process()
                            lan78xx_rx()
                                lan78xx_skb_return()
    -----上面为驱动-------下面为数据链路层-----------------------
                                    netif_rx()	// 送入数据链路层
    

    tx

    struct net_device_ops {
    	.ndo_start_xmit		= lan78xx_start_xmit,
    }
    -----上面为数据链路层-------下面为驱动-----------------------
    lan78xx_start_xmit()
    	skb_queue_tail()	// 插入队列
    	tasklet_schedule(&dev->bh);	// 触发任务调度 lan78xx_bh
    		lan78xx_bh()
    			lan78xx_tx_bh()
    				skb_dequeue()	// 取出数据
    ------上面为驱动网络部分--------下面为驱动 USB 部分-----------
    				usb_fill_bulk_urb()	// 填充数据到 USB
    				usb_submit_urb()	// USB 发送数据
    

    RX call tree:目前理得有点混乱,大致过程是 USB 硬件产生中断,驱动去捞数据,经过 rx_process() 处理后,最终调用 netif_rx(skb),将数据送入内核网络子系统,进一步处理 skb。
    TX call tree:内核网络子系统最终调用 ndo_start_xmit() 发送数据,该接口最终由设备驱动实现,本示例为 lan78xx_start_xmit(),最终将数据通过 USB 发送给 LAN7515 网卡,网卡再经过自己的硬件加工,最终将数据发送到网线。
    在这里插入图片描述

    打印帧头

    static netdev_tx_t
    lan78xx_start_xmit(struct sk_buff *skb, struct net_device *net)
    {
    printk("%s()\n", __FUNCTION__);
    
    struct ethhdr *eth = eth_hdr(skb);
    printk(KERN_INFO "DEST:" MAC_FMT "\n", MAC_ARG(eth->h_dest));
    printk(KERN_INFO "SOURCE:" MAC_FMT "\n", MAC_ARG(eth->h_source));
    
    struct iphdr *ip_header = ip_hdr(skb);
    printk("daddr:%x is %d.%d.%d.%d\n", ip_header->daddr, inet_ntoa(ip_header->daddr));
    printk("saddr:%x is %d.%d.%d.%d\n\n", ip_header->saddr, inet_ntoa(ip_header->saddr));
    ...
    
    [44851.676380] lan78xx_start_xmit()
    [44851.680906] DEST:08:00:27:38:fc:d0
    [44851.685656] SOURCE:b8:27:eb:8a:bc:f4
    [44851.690571] daddr:6401a8c0 is 192.168.1.100
    [44851.696164] saddr:101a8c0 is 192.168.1.1
    

    打印 TX 方向,驱动送给网卡的数据帧中的目的 MAC、源 MAC、目的 IP、源 IP,即上图中 ① 处的数据帧头。

    总结

    网卡、网卡驱动、内核网络子系统,它们干的事情核心就是传递数据包,其中 sk_buff 在整个过程中起着穿针引线的作用,这次分析网卡驱动收发的过程中,也尝试打印了 sk_buff 的部分信息,作为一个探索的开始吧。其实 sk_buff 在网络子系统中确实起着非常重要的作用,sk_buff 是 socket buffer 的意思,这又进一步体现了 socket 的重要,连其 buffer 都那么 NB,socket 不更 NB 吗?所以后面的研究路线是:driver --> sk_buff --> socket

    展开全文
  • Linux网卡接收数据包过程图详细总结

    千次阅读 2022-03-27 17:02:00
    简介 本文对代码的详细实现过程不做过多的讲解,重点让读者熟悉...1、接收数据前的准备工作 1)网络子系统的初始化; 2)协议栈的注册; 3)网卡驱动的初始化; 4)启动网卡; 2、接收和传输网络数据: 一、接

    简介

    本文对代码的详细实现过程不做过多的讲解,重点让读者熟悉数据的接收过程,如需进一步熟悉源码,可根据下面的链接做进一步学习:
    1、网卡驱动源码分析
    2、网卡结构和基础知识详解

    收包过程总览

    从TCP/IP网络分层模型中可以清楚当数据帧从网卡(物理层)接收到客户端(应用层)收到数据包的整个过程。
    在这里插入图片描述

    通过网卡进行网络数据接收一般要经历下面两个过程:
    1、接收数据前的准备工作

    		1)网络子系统的初始化;
    		2)协议栈的注册;
    		3)网卡驱动的初始化;
    		4)启动网卡;
    

    2、接收和传输网络数据:

    一、接收数据前的准备工作

    1、网络子系统的初始化:
    linux系统在加载内核到内存中后会进行大量的初始化工作,其中初始化各个内核子系统都是通过调用subsys_initcall函数来实现,具体初始化网络子系统主要有以下三个方面:
    1、申请一个softnet_data数据结构,在这个数据结构里的poll_list是等待驱动程序将其poll函数注册进来;
    2、将每一种软中断都注册一个处理函数;
    3、将软中断和对应的中断处理函数都放在softirq_vec数组中。
    具体流程如下图:
    在这里插入图片描述
    2、协议栈的注册:
    内核实现了网络层的ip协议,也实现了传输层的tcp协议和udp协议。 这些协议对应的实现函数分别是ip_rcv(),tcp_v4_rcv()和upd_rcv()。和我们平时写代码的方式不一样的是,内核是通过注册的方式来实现的,这些函数主要是将从物理层ring_buffer写到skb_buffer中的数据做进一步的解析处理并传至上一层;
    在这里插入图片描述
    3、网卡驱动的初始化:
    每一个驱动程序(不仅仅只是网卡驱动)会使用 module_init 向内核注册一个初始化函数,当驱动被加载时,内核会调用这个函数去完成驱动的注册、网卡设备的初始化和网卡驱动和设备的匹配等过程。
    在这里插入图片描述4、启动网卡:

    当完成前面的注册和初始化过程后,网卡就可以通过命令ifconfig eth0 up进行打开,网卡的打开过程就是通过调用驱动注册的open函数去实现的,igb_open函数执行过程中,还会启用msix机制和NAPI机制,其中msix机制可以具体理解为中断管理机制,通过该函数调用最终的中断处理函数,而NAPI机制是与最开始的软中断调用的poll函数相关的,具体流程如下图:
    在这里插入图片描述

    二、接收和传输网络数据

    整体过程梳理:
    首先网卡接收网络数据帧并通过DMA保存在ring_buffer中,此时网卡通过硬中断通知cpu接收到数据,cpu会生成一个软中断,然后通过创建一个ksoftirqd内核线程处理软中断,然后通过NAPI机制调用驱动注册的poll函数,poll函数会将ring_buffer中的数据保存在skb_buffer中然后调用netif_receive_skb()将数据发送到内核协议栈进行处理,也就会调用最开始协议栈注册的函数。
    具体流程如下图:
    在这里插入图片描述
    下面具体解析一个硬中断和ksoftirqd内核线程处理软中断:
    硬中断:
    首先当数据帧从网线到达网卡上的时候,第一站是网卡的接收队列。网卡在分配给自己的RingBuffer中寻找可用的内存位置,找到后DMA引擎会把数据DMA到网卡之前关联的内存里,这个时候CPU都是无感的。当DMA操作完成以后,网卡会像CPU发起一个硬中断,通知CPU有数据到达,具体流程如下图:
    在这里插入图片描述
    ksoftirqd内核线程处理软中断:
    网络子系统初始化部分, 我们看到我们为NET_RX_SOFTIRQ注册了处理函数net_rx_action,函数就是在这里被调用执行的。
    注意:
    硬中断中设置软中断标记,和ksoftirq的判断是否有软中断到达,都是基于smp_processor_id()的。这意味着只要硬中断在哪个CPU上被响应,那么软中断也是在这个CPU上处理的。所以说,如果你发现你的Linux软中断CPU消耗都集中在一个核上的话,做法是要把调整硬中断的CPU亲和性,来将硬中断打散到不通的CPU核上去。
    在这里插入图片描述最后讲述协议栈的处理过程:
    在ksoftirqd内核线程处理软中断最终调用的netif_receive_skb函数会根据包的协议,假如是upd包,会将包依次送到ip_rcv(),upd_rcv()协议处理函数中进行处理,最终将数据包传至传输层,函数处理流程如下:
    在这里插入图片描述

    总结

    接收数据前准备工作:
    1、创建ksoftirqd线程,为它设置好它自己的线程函数,后面就指望着它来处理软中断;
    2、协议栈注册,linux要实现许多协议,比如arp,icmp,ip,udp,tcp,每一个协议都会将自己的处理函数注册一下,方便包来了迅速找到对应的处理函数;
    3、网卡驱动初始化,每个驱动都有一个初始化函数,内核会让驱动也初始化一下。在这个初始化过程中,把自己的DMA准备好,把NAPI的poll函数地址告诉内核;
    4、启动网卡,分配RX,TX队列,注册中断对应的处理函数;
    以上是内核准备收包之前的重要工作,当上面都ready之后,就可以打开硬中断,等待数据包的到来了。

    数据接收:
    1、网卡将数据帧DMA到内存的RingBuffer中,然后向CPU发起中断通知;
    2、CPU响应中断请求,调用网卡启动时注册的中断处理函数;
    3、中断处理函数发起软中断请求;
    4、内核线程ksoftirqd线程发现有软中断请求到来,先关闭硬中断;
    5、ksoftirqd线程开始调用驱动的poll函数收包;
    5、poll函数将受到的包送到协议栈注册的ip_rcv函数中;
    6、ip_rcv函数再讲包送到upd_rcv函数中(对于tcp包就送到tcp_rcv)。

    读者有兴趣可以通过下面的链接对网卡其他的知识进行学习:
    1、网卡驱动源码分析
    2、网卡结构和基础知识详解

    展开全文
  • 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线 PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换 ...

    网卡

    网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线

    PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换

    MAC芯片主要负责:

    1. 比特流和帧的转换:7字节的前导码Preamble和1字节的帧首定界符SFD

    2. CRC校验

    3. Packet Filtering:L2 Filtering、VLAN Filtering、Manageability / Host Filtering

    Intel的千兆网卡以82575/82576为代表、万兆网卡以82598/82599为代表

    收发包过程图

    ixgbe_adapter包含ixgbe_q_vector数组(一个ixgbe_q_vector对应一个中断),ixgbe_q_vector包含napi_struct

    硬中断函数把napi_struct加入CPU的poll_list,软中断函数net_rx_action()遍历poll_list,执行poll函数

    这里写图片描述


    发包过程

    这里写图片描述


    1、网卡驱动创建tx descriptor ring(一致性DMA内存),将tx descriptor ring的总线地址写入网卡寄存器TDBA

    2、协议栈通过dev_queue_xmit()将sk_buff下送网卡驱动

    3、网卡驱动将sk_buff放入tx descriptor ring,更新TDT

    4、DMA感知到TDT的改变后,找到tx descriptor ring中下一个将要使用的descriptor

    5、DMA通过PCI总线将descriptor的数据缓存区复制到Tx FIFO

    6、复制完后,通过MAC芯片将数据包发送出去

    7、发送完后,网卡更新TDH,启动硬中断通知CPU释放数据缓存区中的数据包

    Tx Ring Buffer

    收包过程

    这里写图片描述

    1、网卡驱动创建rx descriptor ring(一致性DMA内存),将rx descriptor ring的总线地址写入网卡寄存器RDBA

    2、网卡驱动为每个descriptor分配sk_buff和数据缓存区,流式DMA映射数据缓存区,将数据缓存区的总线地址保存到descriptor

    3、网卡接收数据包,将数据包写入Rx FIFO

    4、DMA找到rx descriptor ring中下一个将要使用的descriptor

    5、整个数据包写入Rx FIFO后,DMA通过PCI总线将Rx FIFO中的数据包复制到descriptor的数据缓存区

    6、复制完后,网卡启动硬中断通知CPU数据缓存区中已经有新的数据包了,CPU执行硬中断函数:

    • NAPI(以e1000网卡为例):e1000_intr() -> __napi_schedule() -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)
    • 非NAPI(以dm9000网卡为例):dm9000_interrupt() -> dm9000_rx() -> netif_rx() -> napi_schedule() -> __napi_schedule() -> __raise_softirq_irqoff(NET_RX_SOFTIRQ)

    7、ksoftirqd执行软中断函数net_rx_action():

    • NAPI(以e1000网卡为例):net_rx_action() -> e1000_clean() -> e1000_clean_rx_irq() -> e1000_receive_skb() -> netif_receive_skb()
    • 非NAPI(以dm9000网卡为例):net_rx_action() -> process_backlog() -> netif_receive_skb()

    8、网卡驱动通过netif_receive_skb()将sk_buff上送协议栈

    Rx Ring Buffer

    软件(SW)向从next_to_use开始的N个descriptor补充sk_buff,next_to_use += N,tail = next_to_use - 1(设置网卡寄存器RDT)

    硬件(HW)向从head开始的M个descriptor的sk_buff复制数据包并设置DD,head += M

    SW将从next_to_clean的开始的L个sk_buff移出Rx Ring Buffer交给协议栈,next_to_clean += L,向从next_to_use开始的L个descriptor补充sk_buff,next_to_use += L,tail = next_to_use - 1

    注意:每次补充完sk_buff以后,tail、next_to_use、next_to_clean三者都是紧挨着的

    这里写图片描述


    中断上下部

    这里写图片描述


    do_IRQ()是CPU处理硬中断的总入口,在do_IRQ()中调用硬中断函数

    netif_rx()

    在netif_rx()中把skb加入CPU的softnet_data

    RSS + FDIR

    FDIR(Flow Director)的优先级高于RSS(Receive Side Scaling)

    RSS通过计算包的五元组(sip、sport、dip、dport、protocol)的hash并取余,得到队列的index,然后将包放入这个队列,实现了数据包在各个队列之间的负载均衡,不过RSS不能保证回包也落在同一个队列上

    对称hash(sip/sport和dip/dport交换后hash不变)可以部分解决该问题,但是对于一些需要做NAT的设备(比如负载均衡)就失效了,FDIR可以完全解决该问题,参见https://tech.meituan.com/MGW.html

    这里写图片描述

    展开全文
  • linux内核Ethernet以太网卡驱动收发数据过程linux内核Ethernet以太网卡驱动收发数据过程下图简单描述了网卡驱动与Linux内核之间的联系:关于上图的一些说明:系统初始化:1. 协议模块调用 dev_add_pack() 来注册协议...
  • 计算机网络——数据网卡到应用的过程

    千次阅读 多人点赞 2020-09-29 09:55:16
    数据网卡到应用的过程 数据网卡到应用的过程1、过程概述2、网卡3、网卡驱动 数据网卡到应用的过程 1、过程概述 假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢? 2、网卡 网卡(Network...
  • 一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。 net_device 结构是 ...
  • 网卡接收数据后如何处理
  • 数据网卡到应用的过程

    千次阅读 2019-04-07 09:35:11
    本文写写数据网卡到应用的过程,内容与图片很多整理自《网络是怎样连接的》、《Tomcat内核设计与剖析》,有的图片因清晰度不够我进行了重绘。 总览 本文围绕这张图从下至上展开。假设一个HTTP请求的数据到达网卡,...
  • 如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的协议,采用...
  • 网络设配器的发包过程 sk_buff(Socket Buffer) DMA 与 Buffer descriptor 参考文档 前文列表 《Linux 内核网络协议栈》 网卡的工作原理 Linux 操作系统的功能可以概括为进程管理、内存管理、文件系统管理...
  • 网卡驱动收发过程

    2018-09-12 15:48:02
    网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线 PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换 ...
  • tcp可靠性:1.应答机制和超时传输. 若传输成功,接收接收数据,...发送方未收到ack,无法判定数据发送到接收方失败还是返回ack在传输过程中失败. tcp建立连接:new socket对象 目的:1.创造通信数据,或者通信资源,连接对
  • 最近的一个项目中需要同时使用两块网卡收发UDP组播数据包,并且要求使用Socket的方式接收和发送网络数据包(我不会告诉你们我之前是直接使用SharpPcap来实现的)。在C#中Socket接触的比较早,但是用的不多,特别是在...
  • 2021/12/14---搭建5300网卡获取csi数据

    千次阅读 2021-12-14 15:21:35
    1、5300网卡,有半高和全高之分。(后期补图片) 2、一台电脑,一个路由器(不加密,不连外网) 3、一个Ubuntu启动盘,用来重装系统。本人所用系统为:ubuntu14.04.1,内核为4.1.10+ ubuntu14.04.1的下载资料如下: ...
  • 本文描述Linux网卡驱动程序的实现以及如何优化数据收发过程
  • RX过程 初始化阶段(配置网卡多队列) 1,网卡驱动创建rx descriptor ring,将ring的总线地址写入网卡寄存器 2,网卡驱动为每个descriptor分配sk_buff和数据缓存区 数据接收阶段(处理首包和后续包的区别) 3,网卡...
  • 可参考:http://lxr.linux.no/linux+v2.6.30.4/net/网络设备接口部分主要负责从物理介质接收和发送数据,实现的文件在linu/driver/net目录下面。网络接口核心部分是整个网络接口的关键部位,它为网络协议提供统一的...
  • tun/tap虚拟网卡收发机制解析

    千次阅读 多人点赞 2019-10-29 18:58:57
    tun/tap虚拟网卡收发机制
  • 网络数据接收过程分析

    千次阅读 2014-08-20 10:52:57
    网络数据接收过程分析(七)---tcp_v… (0/767)2008-09-19 14:56 网络数据接收过程分析(六)---tcp缓… (0/635)2008-09-19 14:53 网络数据接收过程分析(六)---tcp缓… (0/1086)2008-09-19 ...
  • 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线 PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换 MAC...
  • 接收操作的第一步是网卡接收到信号,然后将其还原成数字信息。局域网中传输的网络包信号是由1和0组成的数字信息与用来同步的时钟信号叠加而成的,因此只要从中分离出时钟信号,然后根据时钟信号进行同步,就可以读取...
  • 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以太网帧的帧头14字节和帧尾CRC校验4字节 seq编码,在RFC793中,建议ISN和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN...
  • "本地连接"有发送无接收数据的解决方法发布时间:2013-07-23 23:34:03 作者:佚名 我要评论在日常的网络维护中,常常出现"本地连接"有发送无接收,这个故障曾经让我伤透脑筋,现在也没有一个正确的解决方案,而下面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,755
精华内容 31,102
关键字:

网卡收发数据的过程

友情链接: intro2.zip