精华内容
下载资源
问答
  • 网卡发送与接收数据包

    千次阅读 2012-01-04 14:07:42
    MAC包中含有发送端和接收端的MAC地址信息。既然是驱动程序创建的MAC包头信息,当然可以随便输入地址信息的。主机伪装就是这么实现的。 驱动程序将MAC包拷贝到网卡芯片内部的缓冲区,就算完事了。有网卡芯片接手处理...
     
    

    网卡如何发送数据包:

    IP报文可以看作一个包。
    linux网卡驱动程序,将IP包添加14字节的MAC包头,构成MAC包。
    MAC包中含有发送端和接收端的MAC地址信息。既然是驱动程序创建的MAC包头信息,当然可以随便输入地址信息的。主机伪装就是这么实现的。
    驱动程序将MAC包拷贝到网卡芯片内部的缓冲区,就算完事了。有网卡芯片接手处理。
    网卡芯片对MAC包,再次封装成物理帧,添加头部同步信息和CRC校验。然后丢到网线上,就完成一个IP报文的发送。所有挂接到本网线的网卡都可以看到该物理帧。
     

    网卡如何接收数据包:

    网线可以看作一个高速公路,物理帧也就是辆汽车,网卡呢,或许是个加油站吧。

        从这个角度讲,汽车和加油站没有绝对的关系,所有汽车都可以进入该加油站。

        正常情况:

        网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。其次,网卡芯片将物理帧头去掉,得到MAC包。

        网卡芯片检查MAC包内的目的MAC地址信息,和本网卡的MAC地址是否一致?不一致,抛弃。

        网卡芯片将MAC帧拷贝到网卡的内部缓冲区,触发中断。

        驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff。告诉上层。

        上层去掉MAC包头,得到需要的IP包。

        过程中,网卡芯片对物理帧进行了MAC匹配过滤。这样做可以减小系统负荷。试想一下,若网卡芯片对所有的MAC帧不加判断的直接提供给驱动,让CPU判决会是什么样子呢?当总线上数据繁忙,CPU将浪费大部分时间去判断该MAC包是否是自己需要的,效率低下。

        不正常模式(混听):

        网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。其次,网卡芯片将物理帧头去掉,得到MAC包。网卡芯片发现自己当前被配置为混听模式,就不对MAC包过滤。网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触发中断。驱动程序通过中断,将MAC包拷贝到系统中,构建sk_buff,告诉上层。上层去掉MAC包头,得到需要的IP包。显然,这里的IP包并不一定是发给自己的。

        驱动的问题:

        网卡到底能不能接收其他MAC包,完全取决于网卡芯片中RCR( receive control register )配置。驱动程序是决定网卡能否工作于混听模式的桥梁。混听模式会加重CPU的负荷,而且也是不符合标准应用的!

        所有的车辆都要从加油站穿过,(有些都不加油),加油站工作人员的任务量就可想而知。

        当然也有例外,有些程序不通过驱动,也可以直接访问网卡芯片RCR达到设置混听模式。

        所谓 条条大路通香港,就是这个道理:)没有绝对的。

    展开全文
  • linux网卡数据流 发送与接收

    千次阅读 2014-09-03 21:34:11
    通常在驱动中看见的网卡代码很多,但是都离不开发送与接收,掌握好骨干也就好阅读网卡驱动了。 数据发送发送函数:xxx_start_xmit() 上层封装好了sk_buff丢进kernel后,buf存储在skb->data中,通 过 xxx_...


    通常网卡驱动代码量比较大,但是都离不开发送与接收,掌握好骨干也就好理解与调试了。


    数据发送 :

    发送函数:xxx_start_xmit()

    上层封装好了sk_buff丢进kernel后,buf存储在skb->data中,通 过 xxx_start_xmit(),发送出去。
    下面的实例是通过写入某个设备节点发送出去,当然这个设备肯定是串口或者sdio等传输设备,
    也可以直接调用写入函数将buf送出去。


    比如sdio的写入:
    sdio_memcpy_toio(xxx->func, addr, buf, sizeof(buf));

    net_device_ops结构体的填充,在里实现了open与发送等操作:

    static const struct net_device_ops xxx_netdev_ops = {
        .ndo_open = xxx_net_open,
        .ndo_stop = xxx_net_stop,
        .ndo_start_xmit = xxx_start_xmit,
        .ndo_get_stats =  xxx_get_stats,
        .ndo_tx_timeout = xxx_tx_timeout,
    };
    
    
       static int xxx_start_xmit(struct sk_buff *skb, struct net_device *dev){
    
       ---------
        nwrite = filep->f_op->write(filep, skb->data, skb->len, &filep->f_pos);
        set_fs(old_fs);
    
        if (nwrite == skb->len) {
            priv->stats.tx_packets++;
            priv->stats.tx_bytes +=skb->len;
            priv->netdev->trans_start = jiffies;
        }
        -----------
    }
    

    数据接收:

        目前我所看到的接收触发都是在中断(低速串口与sdio card)里面读取到buf后异步调用netif_rx()提交到网络栈,
    对于sdio card的接收数据是host端接收到中断后调用到card里面的中断处理函数而读取buf的。另外一种就是软中断来接收,
    比如usb与高速串口的数据接收。
    netif_rx()是标准的网卡上交sk_buff数据流,通常网卡驱动代码量很大当你找不到接收函数时,搜netif_rx()是最 好的 选择。



    下面接收处理函数:首先分配skb数据空间,再将读取的buf存入skb中,再调用netif_rx(),数据报入网络栈。

    static int xxx_submit_skb(void *data)
    {
        --------
        skb = netdev_alloc_skb(ndev, pkt_len + NET_IP_ALIGN); /* NET_IP_ALIGN is 2 */
        if (!skb) {
            printk(KERN_INFO "error: out of memory for rx'd frame\n");
            priv->stats.rx_dropped++;
            ret = -ENOMEM;
            goto error;
        } 
    
        skb_reserve(skb, NET_IP_ALIGN);
    
        memcpy((skb_put(skb, pkt_len), pkt_len),buf,sizeof(buf);
        
        skb->dev = priv->netdev;
        skb->protocol = eth_type_trans(skb, priv->netdev);
        priv->stats.rx_packets++;
        priv->stats.rx_bytes += pkt_len;
        ret = netif_rx(skb);
        if (ret != 0)
            printk(KERN_INFO "%s: netif_rx error\n", __func__);
    
        --------
    }
    



    展开全文
  • 树莓派Zero配置USB无线网卡前言无板载WiFi树莓派联网(接收端)方式汇总无线网卡选型作为接收端配置确认网卡是否有效修改interfaces文件配置无线网卡信息重启网卡或重启树莓派作为发送端配置重要提示使用RT5370无线...

    前言

    贪便宜买了个树莓派zero,不带板载WiFi及蓝牙,配置过程的话接收端还好,基本多数Linux免驱无线网卡设置好树莓派文件都能搞定(设置方法见“作为接收端配置”),但本意希望能将网卡设为AP组建局域网,结果差点没被搞疯掉,真是一步一个坑,本文记录一下以作纪念及供人避坑。

    无板载WiFi树莓派联网(接收端)方式汇总

    1. 树莓派+带RJ45接口的USB HUB实现网线连接;
    2. 树莓派+串口网口模块,通过GPIO转RJ45实现网线连接:https://blog.csdn.net/vilmaigic/article/details/109093247
    3. 树莓派+Zero Quick Plug实现USB共享网络连接:https://shumeipai.nxez.com/2018/02/20/raspberry-pi-zero-usb-ethernet-gadget-tutorial.html
    4. 树莓派+USB HUB+USB无线网卡实现WiFi连接。

    无线网卡选型

    如果各位壮士坚定地选择无线网卡联网,请务必认真阅读该文章https://www.cnblogs.com/sjqlwy/p/5003436.html
    并不是所有牛奶都叫特仑苏,也并不是所有无线网卡树莓派都能用。

    作为接收端配置

    如果只是希望用USB网卡在树莓派上实现上网,这个实现难度还会略低一些。

    确认网卡是否有效

    Terminal界面输入ifconfig查看是否有wlan0信息,如果显示wlan0信息则说明网卡可用,如无wlan0则证明该网卡需要安装驱动,找准网卡芯片型号开始八仙过海各显神通,建议阅读“无线网卡选型”中链接文章。
    实名建议不要选RTL8188类芯片,需要安装驱动,虽然Github上有大神开源了对应驱动,但不支持Raspbian系统最新kernal,需要降级头文件(详见:https://blog.csdn.net/dxxdxxd/article/details/108302135),简直费力不讨好。

    修改interfaces文件

    如网卡驱动正常,开始修改树莓派interfaces文件:sudo nano /etc/network/interfaces,并将内容修改为以下形式并保存退出:

    auto lo       
    iface lo inet loopback
    iface eth0 inet dhcp    	#采用dhcp方式获取IP
    
    auto wlan0      			#如果有wlan,无线网卡,则默认启动无线网卡连接
    allow-hotplug wlan0       	#表示wlan设备可以热插拨
    iface wlan0 inet dhcp      	#无线网卡连接也采用DHCP方式获取IP地址
    wpa-ssid "yourwifiname"     #ssid名
    wpa-psk "yourwifipassword"  #wifi使用wpa-psk认证方式,认证密码
    iface default inet dhcp
    

    配置无线网卡信息

    编辑/etc/wpa_supplicant/wpa_supplicant.conf文件,配置无线网卡信息,内容如下:

    country=CN
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
     
    network={
    	ssid="WiFi-A"
    	psk="password1"
    	key_mgmt=WPA-PSK
    	priority=1
    }
     
    network={
    	ssid="WiFi-B"
    	psk="password2"
    	key_mgmt=WPA-PSK
    	priority=2
    	scan_ssid=1
    }
    

    重启网卡或重启树莓派

    输入ifconfig查看wlan0是否分配了IP地址,如未分配则重启网卡:

    sudo ifdown wlan0
    sudo ifup wlan0
    

    若重启网卡后仍未被分配IP地址,则sudo reboot重启树莓派。

    作为发送端配置

    重要提示

    1. 请尽量选择RT5370芯片USB无线网卡,作为被誉为“树莓派可用的世界上最好配置AP的无线网卡”,它能为你减少很多生活的烦恼;
    2. 很多文章都在介绍使用create_ap工具做AP,但事实上该工具能在4B等带有板载WiFi主板上很好运行,但像zero这类无板载WiFi主板上无法实现,具体原因尚不详。
    3. 当然也有老哥使用RTL8188CUS芯片USB无线网卡实现了AP功能,具体见https://wangye.org/blog/archives/845/,该方法我没有试过,各位如果有RTL8188CUS可以尝试下。

    使用RT5370无线网卡配置AP

    老规矩直接上命令行:

    # udhcpd在非树莓派zero系列上可以正常工作,但在Zero (W)上重启后不能正常分配IP,猜想是因为该服务在无线网卡初始化完成前启动导致,使用dnsmasq替代后可正常工作
    sudo apt-get -y remove udhcpd
    # 安装hostapd和dnsmasq
    sudo apt-get -y install hostapd dnsmasq
    # 备份配置文件
    sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
    # 配置需要分配的IP网段,可根据需要自行分配
    sudo sed -i "s/^#dhcp-range=192.168.0.50,192.168.0.150,12h/dhcp-range=192.168.0.50,192.168.0.150,12h/g" /etc/dnsmasq.conf
    # 设置AP名称
    export AP_NAME="AP"
    # 为无线网卡配置静态IP,可根据需要自行分配
    export WLAN_IP=192.168.0.1
    # 确认IP地址是否设置成功
    sudo ifconfig wlan0 $WLAN_IP
    # dhcpcd.conf插入参数
    sudo sed -i '$a\interface wlan0' /etc/dhcpcd.conf
    # dhcpcd.conf设置静态IP
    echo "static ip_address=${WLAN_IP}/24" | sudo tee -a /etc/dhcpcd.conf
    # hostapd配置,配置为开放模式
    sudo touch /etc/hostapd/hostapd.conf
    # hostapd.conf设置interface
    echo "interface=wlan0" | sudo tee -a /etc/hostapd/hostapd.conf
    # hostapd.conf设置AP名称
    echo "ssid=${AP_NAME}" | sudo tee -a /etc/hostapd/hostapd.conf
    # 设置WiFi工作频段(1-13)
    echo "channel=9" | sudo tee -a /etc/hostapd/hostapd.conf
    # 硬件工作模式
    echo "hw_mode=g" | sudo tee -a /etc/hostapd/hostapd.conf
    # 验证方式为开放模式 1=wpa, 2=wep, 3=both,尽量避免选择安全性极低的wep
    echo "auth_algs=1" | sudo tee -a /etc/hostapd/hostapd.conf
    # 设置802.11n模式支持 	 
    echo "ieee80211n=1" | sudo tee -a /etc/hostapd/hostapd.conf
    # 备份配置文件
    sudo cp /etc/default/hostapd /etc/default/hostapd.bak 
    # 修改配置文件
    sudo sed -i "s/#DAEMON_CONF=\"\"/DAEMON_CONF=\"\/etc\/hostapd\/hostapd.conf\"/g" /etc/default/hostapd 
    # 启动networking和hostapd服务,注意先后顺序先使用networking服务设置IP再更新hostapd
    sudo service networking restart
    sudo service hostapd restart
    sudo service dnsmasq restart
    # 设置开机启动
    sudo update-rc.d hostapd enable
     #重启设备,检查配置是否已经生效
    sudo reboot
    

    可能有用的其他方式

    还看到了一位老哥写的另一种方式,方法上大同小异,但有讲如何进行NAT(尚未验证),供大家参考:

    1. https://blog.csdn.net/xukai871105/article/details/42497097
    2. https://blog.csdn.net/zsy135220/article/details/80389877
    展开全文
  • 在有关TCP连接的很多配置中,有很多选项有的配置  ... net.ipv4.tcp_wmem:这个参数定义了TCP发送缓冲(用于TCP发送...netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。
    在有关TCP连接的很多配置中,有很多选项有的配置 
    net.ipv4.tcp_rmem:这个参数定义了TCP接收缓冲(用于TCP接收滑动窗口)的最小值、默认值、最大值
    net.ipv4.tcp_wmem:这个参数定义了TCP发送缓冲(用于TCP发送滑动窗口)的最小值、默认值、最大值
    netdev_max_backlog:当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示队列的最大值
    rmem_default:这个参数表示内核套接字接收缓存区默认的大小
    wmem_default:这个参数表示内核套接字发送缓存区默认的大小 
    rmem_max:这个参数表示内核套接字接收缓存区最大的大小
    rmem_max:这个参数表示内核套接字接收缓存区最大的大小
    滑动窗口的大小与套接字缓存区会在一定程度上影响并发连接的数据,每个TCP连接都会为维护TCP滑动窗口而消耗内存,这个窗口会根据服务器的处理速度收缩或扩张。
         这里想说的是内核缓冲区和滑动窗口之间的区别联系:
         整个数据的流程中,首先网卡接收到的数据存放到内核缓冲区内,然后内核缓冲区存放的数据根据TCP信息将数据移动到具体的某一个TCP连接上的接收缓冲区内,也就是接收滑动窗口内,然后应用程序从TCP的接受缓冲区内读取数据,如果应用程序一直不读取,那么滑动窗口就会变小,直至为0.
        如果网卡处理数据的速度比内核处理数据的速度慢,那么内核会有一个队列来保存这些数据,这个队列的大小就是由参数netdev_max_backlog决定的
       对于发送数据来说,应用程序将数据拷贝到各自TCP发送缓冲区内(也就是发送滑动窗口),然后系统的所有TCP套接字上发送缓冲区(也就是发送滑动窗口)内的数据都将数据拷贝到内核发送缓冲区内,然后内核将内核缓冲区的数据经过网卡发送出去。
        TCP的发送/接受缓冲区(也就是发送/接受滑动窗口),是针对某一个具体的TCP连接来说的,每一个TCP连接都会有相应的滑动窗口,但是内核的发送/接受缓冲区是针对整个系统的,里面存放着整个系统的所有TCP连接的接收/发送的数据。
    展开全文
  • 1.先连接千兆网口 2.高级设置里面有个记住网口 打钩 3.发送参数发送接收卡以及保存到接受卡里面 左上角选择千兆网口 并完成显示屏连接 发送接收卡以及保存接收
  • 描叙:早上上班有一位同事反映无法上网,到现场查看,发现网络连接正常,但是网卡灯常亮不闪,本地连接状态显示有数据包发送,但是接收到得数据包非常少,ping网关出现掉包非常严重得现象;查看交换机端口,此相连...
  • 1、我在观察网卡发送数据接收数据的过程中发现,我从fpga上的一个网卡发送数据,然后另一个网卡接收数据,接收到的数据前面会有55h这8bit的数据。我从PC上发送数据,用fpga上的网卡接收数据,那么在接收到的数据...
  • FPGA千兆网系列2-----UDP发送与接收

    千次阅读 2018-11-25 19:48:15
    文章目录开发环境系统框图发送接收总结福利 开发环境 小梅哥AC6102开发板(内含RTL8211E...本实例支持udp的发送与接收 支持arp的发送接收 系统框图 发送 本实例支持发送3种包 发送udp包,s3_in是外部按键,按...
  • 客户端发送的SYN请求到达服务器的网卡后,进入服务器操作系统的网络协议栈,经过链路层和网络层的处理后,抵达TCP协议的入口函数。TCPv4的入口函数是tcp_v4_rcv,TCPv6的入口函数是tcp_v6_rcv。下面对tcp_v4_rcv进行...
  • 而我们知道,通过ifconfig可以看到某一网卡发送与接收的字节数,所以我们可以写一个脚本来统计一下。 先看ifconfig: # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 82:EC:7A:2B:7D:28...
  • 目录前导现有需求:计算机网络的发展及基础网络概念两台电脑的通信IP地址IP协议windows和Linux查看网卡信息IP地址分类以太网广域网端口端口分类socket简介TCP/IP协议socket介绍udp发送与接收数据udp发送数据udp...
  • 阿里云物联网卡发送下行短信上行短信消息接收 前言:阿里云短信服务分为两种:1.普通通讯sim卡,2.物联网卡。 本文演示接口demo均为阿里云物联网卡(java)。 1.发送下行短信,阿里云有公开的下行短信API...
  • IP地址IP协议 规定网络地址的协议叫ip协议,它定义的地址称为ip地址。广泛采用的v4版本的即ipv4,它规定网络地址由32位2进制表示。 注意: 一个ip地址通常写成四段十进制数 范围0.0.0.0-255.255.255.255 ...
  • IP地址IP协议 规定网络地址的协议叫ip协议,它定义的地址称为ip地址。广泛采用的v4版本的即ipv4,它规定网络地址由32位2进制表示。 注意: 一个ip地址通常写成四段十进制数 范围0.0.0.0-255.255.255.255 windows...
  • 创建UDP传输的发送端 :  1.建立udp的socket服务 2.将要发送的数据封装到数据包中...关闭socket服务(因为调用了系统的底层资源网卡) import java.io.IOException; import java.net.DatagramPacket; import...
  • Linux发送arp请求与接收arp响应

    千次阅读 2009-12-31 10:46:00
    Linux 中获得本机网卡MAC地址很简单,ioctl()就OK。可如何获得局域网其他主机的MAC地址呢…链路层广播ARP请求,然后接收ARP响应。实现介个功能其实已有现成三方库可用,如libnet。不过想加深对协议的理解和Linux网络...
  • 网卡介绍——MACPHY的关系分析

    千次阅读 2020-05-14 14:38:55
    (一)网卡初步认识 网络适配器又称网卡或网络接口卡(NIC),英文名Network Interface Card.它是使计算机联网的设备.平常所说的网卡就是将PC机和LAN...网卡发送数据前要同接收网卡进行对话以确定最大可发送数据的大..
  • 第二列: 对应网卡接收字节数 第九列: 对应网卡发送字节数 通过以上信息,我们就可以计算出网卡的上行下行的流量情况,代码实现如下: package main import ( "fmt" "io/ioutil" "strconv" "strings" ...
  • 重点研究了USB设备驱动结构以及无线网卡数据包的接收发送流程。在嵌入式Linux平台下,设计了基于USB接口的无线网卡驱动,实现了对无线网卡芯片Realtek RTL8188的支持。同时,结合嵌入式软硬件开发平台,成功组建了...
  • 网卡

    2015-03-30 17:59:25
    网卡(网络适配器)一般包括数据链路层、物理层两部分,是局域网中连接计算机和传输介质的接口,不仅能实现局域网传输介质之间的物理连接和电信号匹配,还涉及帧发送与接收、帧封装拆封、介质访问控制、数据编码...
  • 网卡是工作在OSI的数据链路层的网络组件,是局域网中连接计算机和传输介质(网线或WIFI信号)的接口,不仅能实现局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装拆封、介质访问控制...
  • Vxlan与网卡offload性能

    2017-04-12 14:39:00
    接收端协议栈也是从网卡接收上述不超过MTU的小帧并重组,早期上述数据分片和组合的工作均由CPU完成,导致占用CPU资源且效率不高。 offload 是将本来该操作系统进行的一些数据包处理(如分片、重组等)放到...
  • 网络适配器: 又称网卡或网络接口卡(NIC),是连接计算机与网络的硬件设备。  整理计算机上发往网线上的数据,并将数据分解为适当大小的数据包之后向... 对本机网络流量的检测比如网络连接配置、接收与发送的数...
  • 以intel网卡IGB驱动为例,网口eth0与网卡eth1的...如下为eth0的中断217到225共9个中断,除去217号中断,其余8个一半为接收队列中断,另一半为发送队列中断。 / # cat /proc/interrupts | grep eth0 217: 1 0 0 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 515
精华内容 206
关键字:

网卡接收与发送