首页 > 系统相关 >0233-Net-linux 收包流程

0233-Net-linux 收包流程

时间:2024-08-15 11:30:10浏览次数:12  
标签:收包 查看 命令 0233 网卡 中断 Net 数据包

环境

  • Time 2022-11-27
  • WSL-Ubuntu 22.04

前言

说明

参考:https://github.com/leandromoreira/linux-network-performance-parameters

目标

了解 linux 系统接收网络数据包的具体流程。

数据到达网卡

网卡将光电信号还原成数据包。

网卡校验

如果不是在混杂模式下,网卡校验数据包中的 MAC 地址,同时也校验 FCS。
FCS 帧校验序列,在数据包的末尾,有 4 字节的 FCS 校验位,使用 CRC 生成。
如果数据包不满足校验,会被丢弃。

通过命令 ethtool -S 或者 ip -s -s link show 命令来查看。

DMA

如果网卡还有接收描述符,通过 DMA,将数据包拷贝到 Ring Buffer。
并将一个描述符指向 Ring Buffer 的内存区域。

通过命令 ethtool -g 可以查看发送和接收的描述符。

发起硬中断

在等待 rx-usecs 微秒或者 rx-frames 个帧后,网卡发起硬中断。

通过命令 ethtool -c 可以查看网卡的 rx-usecs 和 rx-frames 参数。

处理硬中断

CPU 处理硬中断函数,触发一个软中断,清除硬中断。

通过命令 ethtool -x 可以查看网卡的队列由哪个 CPU 进行处理。
硬件中断信息通过 cat /proc/interrupts 命令查看。
/proc/irq 目录下有对应的中断号的信息,smp_affinity 查看和 CPU 的绑定信息。

软中断

软中断会使用网卡注册的 NAPI 进行收包。

软中断可以通过 cat /proc/softirqs 命令查看。

内核收包

NAPI 从 Ring Buffer 进行收包,封装成 sk_buff。
收包的时间由 netdev_budget_usecs 控制,次数由 netdev_budge 和 dev_weight 控制。

通过命令 sysctl -a | grep netdevsysctl net.core.dev_weight 进行查看。

内核网络栈

数据包 sk_buff 进入网络内核栈,交给应用程序。
如果内核处理不过来,数据包需要进行排队,netdev_max_backlog 控制最大排队数量。

可以通过命令 sysctl net.core.netdev_max_backlog 查看。
如果队列不够,通过命令 cat /proc/net/softnet_stat 查看,第二列增长就有问题。
详细查看:https://access.redhat.com/solutions/1241943,附录有更好的工具。

总结

介绍了 linux 接收数据包的流程,以及其中可以使用的查看工具。

附录

工具

#!/bin/bash

cmd="${0##*/}"

usage() {
cat >&2 <<EOI
usage: $cmd [ -h ]

Output column definitions:
      cpu  # of the cpu

    total  # of packets (not including netpoll) received by the interrupt handler
             There might be some double counting going on:
                net/core/dev.c:1643: __get_cpu_var(netdev_rx_stat).total++;
                net/core/dev.c:1836: __get_cpu_var(netdev_rx_stat).total++;
             I think the intention was that these were originally on separate
             receive paths ...

  dropped  # of packets that were dropped because netdev_max_backlog was exceeded

 squeezed  # of times ksoftirq ran out of netdev_budget or time slice with work
             remaining

collision  # of times that two cpus collided trying to get the device queue lock.

EOI
 exit 1
}



softnet_stats_header() {
 printf "%3s %10s %10s %10s %10s %10s %10s\n" cpu total dropped squeezed collision rps flow_limit
}

softnet_stats_format() {
 printf "%3u %10lu %10lu %10lu %10lu %10lu %10lu\n" "$1" "0x$2" "0x$3" "0x$4" "0x$5" "0x$6" "0x$7"
}


getopts h flag && usage

cpu=0
softnet_stats_header
while read total dropped squeezed j1 j2 j3 j4 j5 collision rps flow_limit_count
do
 # the last field does not appear on older kernels
 # https://github.com/torvalds/linux/commit/99bbc70741903c063b3ccad90a3e06fc55df9245#diff-5dd540e75b320a50866267e9c52b3289R165
 softnet_stats_format $((cpu++)) "$total" "$dropped" "$squeezed" "$collision" "$rps" "${flow_limit_count:-0}"
done < /proc/net/softnet_stat

标签:收包,查看,命令,0233,网卡,中断,Net,数据包
From: https://www.cnblogs.com/jiangbo4444/p/18360545

相关文章

  • Kubernetes的网络基础
    kubernetes网络模型Kubernetes集群上会存在三个分别用于节点、Pod和Service的网络于worker上完成交汇由节点内核中的路由模块,以及iptables/netfilter和ipvs等完成网络间的流量转发Kubernetes网络模型(2)节点网络集群节点间的通信网络,并负责打通与集群外部端点间的通信......
  • kubernetes高效学习
    知识结构1.基础概念与概述k8s简介:了解k8s的起源、目标、应用场景和优势。核心概念:Pod、Node、Service、Label、Namespace、Deployment等。2.集群架构Master节点:APIServer、Scheduler、Controller-Manager、Etcd。Node节点:Kubelet、Kube-proxy、Docker(或其他容器运行......
  • .NET 7 + Vue 权限管理系统 小白快速上手
    前言今天给大家推荐一个超实用的开源项目《.NET7+Vue权限管理系统小白快速上手》,DncZeus的愿景就是做一个.NET领域小白也能上手的简易、通用的后台权限管理模板系统基础框架。不管你是技术小白还是技术大佬或者是不懂前端Vue的新手,这个项目可以快速上手让我们从0到1,搭建......
  • Kubernetes(k8s)基础及原理
    什么是Kubernetes(k8s)Kubernetes是一个开源的容器编排系统,用于自动化地部署、扩展和管理容器化应用程序。Kubernetes源自谷歌内部的Borg系统,旨在实现容器化应用的高效管理。它提供了服务发现、负载均衡、自动扩缩容等功能,并支持跨主机的容器管理。Kubernetes的设计以“一切......
  • 在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
    在Kubernetes中,资源限制是通过Pod的配置来设置的,它们定义了Pod可以请求和使用的最大资源量。资源限制分为两类:CPU和内存。这些限制不仅帮助系统管理员控制资源使用,还对Pod的服务质量(QoS)有重要影响。1.资源限制的配置CPU限制:CPU限制是通过spec.containers[].resources.lim......
  • 《NET CLR via C#》---第七章(常量,读/写字段,可读字段)
    常量常量是值从不变化的符号。定义常量符号时,它的值必须能在编译时确定。确定后,编译器将常量值保存到程序集元数据中。这意味着只能定义编译器识别的基元类型的常量。在C#中,可用于定义常量:Boolean,Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,Single,Double,Decimal,String。C#也......
  • 《NET CLR via C#》---第六章(类型成员,类型的可访问性,友元程序集,分部类型,CLR调用方法指
    类型成员类型可以定义0个或者多个以下种类的成员。成员描述常量常量是指出数据值恒定不变的符号。这种符号使代码更易阅读和维护。常量总与类型关联,不与类型的实例关联。常量总与类型关联,不与类型的实例关联字段字段表示只读或可读/可写的数据值。字段可以是静态......
  • SO-Net: Self-Organizing Network for Point Cloud Analysis
    Abstract本文提出了SO-Net,是一种创新的深度学习架构,为处理无序点云数据设计。SO-Net利用自组织映射(SOM)技术来捕捉点云的空间分布,并实现排列不变的特征提取。这种分层特征提取方法能够从局部到全局提取特征,还能够通过点到节点的k最近邻搜索系统地调整网络的receptivefield,从......
  • 论文阅读笔记:ST-MetaNet-2
    目录预备知识定义1:城市交通定义2:Geo-graph属性问题1方法RNN元学习器元图注意力网络元循环神经网络预备知识在本节中,我们介绍定义和问题陈述。为简洁起见,我们在表1中提供了一个注释表。假设有个位置,它们报告时间戳上的类型的流量信息。 注:我猜测这里所陈述的......
  • kubernetes应用编排的基本工作逻辑
    Pod和应用Kubernetes本质上是“以应用为中心”的现代应用基础设施,Pod是其运行应用及应用调度的最小逻辑单元本质上是共享Network、IPC和UTS名称空间以及存储资源的容器集可将其想象成一台物理机或虚拟机,各容器就是该主机上的进程各容器共享网络协议栈、网络设备、路由、IP......