-
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数据段
- (运输层)根据数据段头信息获取实际的用户数据
- (应用层)根据应用层协议获取最终的有效信息
更多相关内容 -
网卡接收和发送数据包的过程
2012-06-15 13:02:47介绍网卡的接受和发送过程,对网卡驱动编写提供参考 -
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 数据链路层为例
rxtasklet_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、网卡结构和基础知识详解 -
网卡驱动收发包过程图解
2021-12-22 19:19:06网卡工作在物理层和数据链路层,主要由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的总线地址写入网卡寄存器TDBA2、协议栈通过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以太网卡驱动收发数据过程
2021-05-13 03:04:03linux内核Ethernet以太网卡驱动收发数据过程linux内核Ethernet以太网卡驱动收发数据过程下图简单描述了网卡驱动与Linux内核之间的联系:关于上图的一些说明:系统初始化:1. 协议模块调用 dev_add_pack() 来注册协议... -
计算机网络——数据从网卡到应用的过程
2020-09-29 09:55:16数据从网卡到应用的过程 数据从网卡到应用的过程1、过程概述2、网卡3、网卡驱动 数据从网卡到应用的过程 1、过程概述 假设一个HTTP请求的数据到达网卡,那数据是如何被层层处理并到达应用呢? 2、网卡 网卡(Network... -
Linux 网卡数据收发过程分析
2021-06-16 15:47:27一般来说,网卡主要有两个重要的功能:接收数据 和 发送数据。 所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。 net_device 结构是 ... -
网卡接收到数据后如何处理
2021-12-07 19:31:56网卡接收到数据后如何处理 -
数据从网卡到应用的过程
2019-04-07 09:35:11本文写写数据从网卡到应用的过程,内容与图片很多整理自《网络是怎样连接的》、《Tomcat内核设计与剖析》,有的图片因清晰度不够我进行了重绘。 总览 本文围绕这张图从下至上展开。假设一个HTTP请求的数据到达网卡,... -
51单片机实现控制网卡芯片进行数据传输的设计
2021-01-19 18:19:08如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的协议,采用... -
网卡适配器收发数据帧流程
2021-08-20 11:04:40网络设配器的发包过程 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连接和收发数据过程
2022-02-20 17:10:41tcp可靠性:1.应答机制和超时传输. 若传输成功,接收方接收到数据,...发送方未收到ack,无法判定数据发送到接收方失败还是返回ack在传输过程中失败. tcp建立连接:new socket对象 目的:1.创造通信数据,或者通信资源,连接对 -
Socket的双网卡收发(C#)
2021-02-26 18:47:34最近的一个项目中需要同时使用两块网卡收发UDP组播数据包,并且要求使用Socket的方式接收和发送网络数据包(我不会告诉你们我之前是直接使用SharpPcap来实现的)。在C#中Socket接触的比较早,但是用的不多,特别是在... -
2021/12/14---搭建5300网卡获取csi数据
2021-12-14 15:21:351、5300网卡,有半高和全高之分。(后期补图片) 2、一台电脑,一个路由器(不加密,不连外网) 3、一个Ubuntu启动盘,用来重装系统。本人所用系统为:ubuntu14.04.1,内核为4.1.10+ ubuntu14.04.1的下载资料如下: ... -
嵌入式Linux网卡驱动程序的实现与数据收发性能的优化
2018-01-25 11:09:19本文描述Linux网卡驱动程序的实现以及如何优化数据的收发过程 -
【linux】【网络】网卡驱动收发包过程
2021-03-25 16:58:24RX过程 初始化阶段(配置网卡多队列) 1,网卡驱动创建rx descriptor ring,将ring的总线地址写入网卡寄存器 2,网卡驱动为每个descriptor分配sk_buff和数据缓存区 数据接收阶段(处理首包和后续包的区别) 3,网卡... -
网络数据包转发和接收全过程
2020-12-21 11:59:41可参考:http://lxr.linux.no/linux+v2.6.30.4/net/网络设备接口部分主要负责从物理介质接收和发送数据,实现的文件在linu/driver/net目录下面。网络接口核心部分是整个网络接口的关键部位,它为网络协议提供统一的... -
tun/tap虚拟网卡收发机制解析
2019-10-29 18:58:57tun/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 ... -
linux内核网络协议栈--数据包的网卡驱动收发包过程(二十五)
2020-05-27 14:58:18网卡工作在物理层和数据链路层,主要由PHY/MAC芯片、Tx/Rx FIFO、DMA等组成,其中网线通过变压器接PHY芯片、PHY芯片通过MII接MAC芯片、MAC芯片接PCI总线 PHY芯片主要负责:CSMA/CD、模数转换、编解码、串并转换 MAC... -
网卡将接收到的信号转换成数字信息
2021-07-16 08:11:53接收操作的第一步是网卡接收到信号,然后将其还原成数字信息。局域网中传输的网络包信号是由1和0组成的数字信息与用来同步的时钟信号叠加而成的,因此只要从中分离出时钟信号,然后根据时钟信号进行同步,就可以读取... -
从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造
2020-08-09 10:54:31单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以太网帧的帧头14字节和帧尾CRC校验4字节 seq编码,在RFC793中,建议ISN和一个假的时钟绑在一起,这个时钟会在每4微秒对ISN... -
"本地连接"有发送无接收数据的解决方法
2021-07-10 01:57:42"本地连接"有发送无接收数据的解决方法发布时间:2013-07-23 23:34:03 作者:佚名 我要评论在日常的网络维护中,常常出现"本地连接"有发送无接收,这个故障曾经让我伤透脑筋,现在也没有一个正确的解决方案,而下面...