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

IP 数据包接收过程

在《网络中断下半部处理》一文中介绍过,当网卡接收到网络数据包后,会由网卡驱动通过调用 netif_rx 函数把数据包添加到待处理队列中,然后唤起网络中断下半部处理。...而网络中断下半部处理由 net_rx_action 函数完成的,其主要功能就是从待处理队列中获取一个数据包,然后根据数据包的网络层协议类型来找到相应的处理接口来处理数据包。...处理IP数据包 通过上面的分析,我们知道当内核接收到一个 IP 数据包后,会调用 ip_rcv 函数处理这个数据包,下面我们来分析一下 ip_rcv 函数的实现: int ip_rcv(struct...设置好数据包的路由缓存后,就调用路由缓存的 input 方法处理数据包。...tcp_v4_rcv, /* TCP handler */ IPPROTO_TCP, /* protocol ID */ ... }; 所以,当接收到一个

1.1K30

万字图解 | 深入揭秘Linux 接收网络数据包

大家好,我是「云舒编程」,今天我们来聊聊Linux是怎么从网络上接收数据包的。...通过本文你可学到: Linux 是怎么发送数据包到网络上的 Linux 是怎么从网络上接收数据包的 软中断、硬中断 Linux 是怎么从网络上接收数据包的 整体流程: 系统初始化时,网卡驱动程序会向内核申请一块内存...中断本质上是一种特殊的电信号,由硬件设备发向CPU,CPU接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。...❝ Linux设计为硬中断在哪个CPU上被响应,那么软中断也是在这个 CPU 上处理的。...参考资料 深入理解Linux网络技术内幕(文中的图大部分来自该书) Linux内核源码剖析:TCP/IP实现

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

Linux BSP实战课(网络篇):数据包接收过程

本文将介绍在Linux系统中,以一个UDP包的接收过程作为示例,介绍数据包是如何一步一步从网卡传到进程手中的。 网卡到内存 网络接口卡必须安装与之匹配的驱动程序才能正常工作。...UDP层 UDP层 udp_rcv函数是UDP模块的入口函数,用于处理接收到的UDP数据包。...如果找不到相应的socket,则该数据包将被丢弃;否则,继续处理。 sock_queue_rcv_skb函数的主要功能是进行两项检查。...如果socket上设置了过滤条件且该数据包不满足条件,则该数据包也会被丢弃。在Linux中,每个socket都可以像tcpdump中一样定义过滤条件,不满足条件的数据包将被丢弃。...两种情况都能正常的接收到相应的数据包

30220

网络数据包接收过程

Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux下网络包的接收过程,为了简单起见,我们用udp来举例,如下: int main(){ int serverSocketFd = socket(AF_INET, SOCK_DGRAM,...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...数据包接收过程 硬中断处理 首先当数据帧从网线到达网卡,网卡在分配给自己的 ringBuffer 中寻找可用的内存位置,找到后 DMA 会把数据拷贝到网卡之前关联的内存里。...注意:当RingBuffer满的时候,新来的数据包将给丢弃。ifconfig查看网卡的时候,可以里面有个overruns,表示因为环形队列满被丢弃的包。

18910

网络数据包接收过程

Linux 网络架构 Linux 网络初始化 网络设备子系统初始化 网卡驱动初始化 协议栈初始化 数据包接收过程 硬中断处理 ksoftirqd 软中断处理 协议栈处理 应用层处理 总结 这里深度理解一下在...Linux下网络包的接收过程,为了简单起见,我们用udp来举例,如下: int main(){ int serverSocketFd = socket(AF_INET, SOCK_DGRAM,...Linux 网络架构 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。内核对更上层的应用层提供socket接口来供用户进程访问。...数据包接收过程 硬中断处理 首先当数据帧从网线到达网卡,网卡在分配给自己的 ringBuffer 中寻找可用的内存位置,找到后 DMA 会把数据拷贝到网卡之前关联的内存里。...注意:当RingBuffer满的时候,新来的数据包将给丢弃。ifconfig查看网卡的时候,可以里面有个overruns,表示因为环形队列满被丢弃的包。

24510

为什么我抓不到baidu的数据包

最近,有位读者问起一个奇怪的事情,他说他想抓一个baidu.com的数据包,体验下看包的乐趣。 但却发现“抓不到”,这就有些奇怪了。 我来还原下他的操作步骤。...HTTP用的是80端口,如果此时对着80端口抓包,也会抓不到数据。 粗略判断,18号和20号包分别是客户端请求baidu.com的请求包和响应包。...在Protocols中找到TLS那一栏 点击确定后,就能看到18号和20号数据包已经被解密。 解密后的数据包内容 此时再用http.host == "baidu.com",就能过滤出数据了。...解密后的数据包中可以过滤出baidu的数据包 到这里,其实看不了数据包的问题就解决了。 但是,新的问题又来了。 ssl.key文件是个啥? 这就要从HTTPS的加密原理说起了。...总结 • 文章开头通过抓包baidu的数据包,展示了用wireshark抓包的简单操作流程。

1.2K10

Linux处理数据包过程

当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机数据还是转发给其他主机,如果是流入本机的数据,则数据会从内核空间进入用户空间(被应用程序接收、处理)。...但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。...Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。...如果Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的。...例如eth0是172.16.10.0/24网段,而eth1是192.168.100.0/24网段,到达该Linux主机的数据包无法从eth0交给eth1或者从eth1交给eth0,除非Linux主机开启了数据包转发功能

1.8K40

如何做到每秒接收100万个数据包

上周在一次偶然的谈话中,我无意中听到一位同事说:Linux的网络堆栈太慢了!你不能指望它在每个核每秒处理超过5万个数据包! 这引起了我的思考。...虽然我同意每个核50kpps可能是任何实际应用程序的极限,但Linux网络栈能做什么呢?让我们换个说法,让它更有趣: 在Linux上,写一个每秒接收100万个UDP数据包的程序有多难?...对于原始的发送和接收,将传递多少数据包?...使用多个线程从一个套接字接收数据不是最优的。 SO_REUSEPORT 幸运的是,Linux中最近添加了一个解决方案:SO_REUSEPORT标志。...虽然我们已经展示了在Linux机器上接收1Mpps在技术上是可能的,但应用程序并没有对接收到的数据包进行任何实际处理——它甚至没有查看流量的内容。

99521

测试 APP 抓不到数据包该怎么办

我们自己可以实现一个简单的通过 socket 通信的 APP 和与之其对应的 Server,实现一个简单功能,客户端 APP 发送 socket 消息,模拟平时项目中 APP 调用 socket 相关接口通信,同时接收服务端下发的...,可以通过 tcpdump 将数据包保存成 pcap 格式,然后用 wireshark 打开进行分析,来看下用 tcpdump 抓到的数据包: ?...客户端发送的数据包 ?...服务端接收数据包 tcpdump 显示数据包格式不是很友好,导入到 wireshark 或者可用 wireshark 直接抓包,分析起来就比较容易了,可以看到数据传输是通过 socket 传输的: ?...hook 方式抓包 上述方法虽然抓包很好,但是对于渗透测试来说,我们不仅仅要看到数据包内容,更重要的是还能修改数据包,所以这里还可以使用 hook 方式抓包,在实现 socket 通信的过程,客户端(基于

2.2K10

请求数据包从发送到接收,都经历什么?

此时客户端会变成 SYN-SENT 状态 服务器接收到客户端的数据包之后,通过标志位判断出了客户端想要建立连接。...发送完一个数据包之后,不用等待 ACK 的返回,会直接继续发送下一个包,这就是滑动窗口。 但是这样会有一个问题,应用程序发送包发送的过于频繁,导致服务器接收不过来了。...而对于接收方也是一样的,接收方收到消息之后,会将数据存储在 Buffer 中,然后在 Buffer 中对收到的数据进行重组,还原成最初的应用程序发送的数据。...这个数字越大,则说明接收方的缓冲区越大,能够接收更多的数据。接收方会在确认应答的时候,将自己的剩余窗口大小写入,随ACK一起发送给发送方。...所以发送方会定期的向接收方发送窗口探测的数据段。 好了,关于数据包的发送就介绍到这里。之后有机会再聊聊 TCP 的拥塞控制相关的东西。

71520

Simulink串口接收详解2用S-Function解析数据包

文件说明及下载 4.1 文件说明 4.2 文件下载 ---- 1.概述 在上一个博文 [Matlab] Simulink 串口接收详解1 中,讲了一下Serial Precive模块的简单用法,但是有时候我们接收的数据是具有复杂定义的数据包...Data Type Conversion模块设置 还是一次接收一个16字节的uint8数组,实际代表了2个double的数据。...文件说明及下载 4.1 文件说明 QtSerialSend 文件夹: Qt写的串口发送程序; recCom.mdl:Matlab串口接收程序; recCom_Union.mdl:Matlab串口接收程序...,用S-Function进行解析; DataType.h : 定义发送和接收的数据类型,被unPackData_Q.c调用; unPackData_Q.c:用C语言写的S-Function函数,编译后变成...4.2 文件下载 稍后我会上传这些资料到下载区: Matlab接收程序下载:https://download.csdn.net/download/humanking7/10510716 Qt发送程序下载

2.1K10

请求数据包从发送到接收,都经历什么?

此时客户端会变成 SYN-SENT 状态 服务器接收到客户端的数据包之后,通过标志位判断出了客户端想要建立连接。...发送完一个数据包之后,不用等待 ACK 的返回,会直接继续发送下一个包,这就是滑动窗口。 但是这样会有一个问题,应用程序发送包发送的过于频繁,导致服务器接收不过来了。...而对于接收方也是一样的,接收方收到消息之后,会将数据存储在 Buffer 中,然后在 Buffer 中对收到的数据进行重组,还原成最初的应用程序发送的数据。...这个数字越大,则说明接收方的缓冲区越大,能够接收更多的数据。接收方会在确认应答的时候,将自己的剩余窗口大小写入,随ACK一起发送给发送方。 如果发送方接收到的大小为0,那么此时就会停止发送数据。...所以发送方会定期的向接收方发送窗口探测的数据段。 好了,关于数据包的发送就介绍到这里。之后有机会再聊聊 TCP 的拥塞控制相关的东西。

76720

UDP 协议 C# UdpClient乱序接收数据包丢失的问题 Socket ReceiveBufferSize

一、UDP 协议 C# UdpClient乱序接收数据包丢失的问题 Socket ReceiveBufferSize 利用UdpClient收发文件,走Udp协议,发送端只管发送数据包接收端负责接收数据...,测试中发现,按每块1298字节发送数据包时,接收端在接收共8块时出现了部分数据包的丢失,分析可能是数据突然集中到达超出Socket接收缓冲区大小,造成数据覆盖丢失,因为默认Socket缓冲区大小为8192...字节,每块数据1298字节再加上我在实验程序中自定义的数据包头信息,每块数据大小在1472字节,8块共计11776字节,远超出了8192,会造成数据丢失。...接收端在乱序接收文件过程中,对突然集中到达的数据包处理不及时,造成缓冲区大小不够存储这些数据包,发生数据包的丢失,因而【如果要传送大文件,或在使用高带宽或高滞后时间连接(如卫星宽带提供程序),请考虑增加缓冲区的大小

1.6K20

图解Linux网络包接收过程

对于UDP包来说,会被放到用户socket的接收队列中。 我们从上面这张图中已经从整体上把握到了Linux数据包的处理过程。但是要想了解更多网络模块工作的细节,我们还得往下看。...二 Linux启动 Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行。...只有这些都Ready之后,我们才能真正开始接收数据包。那么我们现在来看看这些准备工作都是怎么做的。...等下次网卡再有硬中断过来的时候再处理剩下的接收数据包。其中budget可以通过内核参数调整。...上面我们说完了整个Linux内核对数据包接收和处理过程,最后把数据包放到socket的接收队列中了。那么我们再回头看用户进程调用recvfrom后是发生了什么。

4.1K72

linux | 网络数据包softirq 软中断与CPU

Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。...event PIW: 0 0 Posted-interrupt wakeup event heidsoft@heidsoft-dev:~$ /research/linux...NAPI 或新 API 的编写是为了更有效地处理传入卡的数据包。硬中断是昂贵的,因为它们不能被中断。即使有中断 合并(稍后详细描述),中断处理程序将独占一个 CPU 内核 完全地。...NAPI 的设计允许驱动程序进入轮询模式而不是被 为每个需要的数据包接收硬中断。在正常操作下,会引发初始硬中断或 IRQ,然后是 SoftIRQ 处理程序 它使用 NAPI 例程轮询卡。.../about-linux-smp_affinity https://web.archive.org/web/20200225050436/http://blog.yufeng.info/archives

2.6K20
领券