自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 fib_unmerge:把local 路由从main 表里切割出来

前面文章提到, local 路由默认情况下是插入到 main 表里的。只有在用户填了自定义的策略路由规则后, local路由才会从 main 表里,挪出来,放到独立的 local 表里。函数就是做的这个事情。

2025-09-30 19:30:00 151

原创 内核如何管理 local(主机)路由表

今天遇到一个有意思的问题,Q:linux系统,内核初始化完成后,默认创建了几个路由表?不论是 AI 还是搜索, 答案也是各种各样, 非常有争议的一个话题。下面看下逐个探索下解析下不同观点。

2025-09-30 01:30:00 700

原创 lo口与 local 路由表

通过上面的实验,我们发现只要是一个 IP 地址被配置到 lo 口上,不仅原来的 ip 地址本身能 ping 通,这个 IP地址整个网段都是可以 ping 通的。关键在 1171行,如果是 lo 口,添加的路由类型就是 local 路由,否则还是普通单播路由。结论:lo 口上的 IP 地址,跟其他网口上 IP 地址类似,还是会产生三条一样样式的路由,那么我们来看下如果同样的 IP 地址被配置到 lo 口上,是否还有这样的三条路由。前面文章,我们讨论过,增加一个 ip 地址,内核会增加三个路由。

2025-09-29 17:30:00 506

原创 linux内核多路由表与策略路由的实现

ip地址引发的路由变化或者手动添加一个目的网段的路由,这些场景看起来,完全可以使用一个路由表就能满足场景需求。如果是新建的 netns,会调用fib_net_init >> ip_fib_net_init >> fib4_rules_init。TODO:支持策略路由,但是没有添加策略路由规则时候,会涉及到多路由表/多table的场景优化。在系统初始化时候,注册的 IPv4 的策略路由 ops 模版,是非常重要的。1. 如果有匹配路由,路由查找成功,停止遍历策略路由链表,并返回对应路由。

2025-09-29 01:00:00 785

原创 ping本机网口的IP地址,tcpdump在lo口才能抓到对应报文

如 fib 路由模块,会调用这个函数注册自己的处理函数。当 ip 地址有变化时候,ip 地址模块就会调用这些被注册的回调函数,通知对应模块,及具体的ip 地址变化信息。我们注意到前面的三条路由并不在一个路由表里,而是分散在 local/main两个单独的路由表里。我们经常用到的是前两个表,如他们名字一样, 分别用于存放 local 和网段路由类型的路由。1. 如果有匹配路由,路由查找成功,停止遍历策略路由链表,并返回对应路由。内核的路由模块通过一个回调函数,感知IP地址变化,并更新对应的路由表项。

2025-09-28 20:00:00 808

原创 无法识别的流量触发的内核丢包统计(续)

注:不要通过tcpdump去设置混杂模式,tcpdump可以让网卡处于混杂模式,但会导致net rx drop不变。因为我们之前使用该模块定位了STP导致drop值增加,所以又在没有增加的机器加载调试模块。打开网卡混杂模式,原本net rx drop没有变化的机器, 统计值也开始增加了。: 相对比较容易理解。:是用来做报文分流镜像的, 比如我们使用tcpudmp命令,附加特定过滤条件,有的同学可能不了解,但是tcpdump/libpcap,我们是经常使用的。至此,为什么drop统计值增加,能够解释清楚了。

2025-07-22 20:14:28 866

原创 无法识别的流量触发的内核丢包统计

截止到目前可以认为protocol的值就是我们收的网络报文的ethernet头里的protocol字段。在使用perf命令查看统计值增长点的时候,我们搂草打兔子,捎带把skb的protocol给打印出来了。在使用perf工具定位IPv6报文后,人肉查看,发现IPv6的个数大约占drop统计值的60%左右,因为我们公司是把内核的IPv6功能禁止的,网络协议栈收到IPv6报文的时候是不做任何处理并丢弃的。的报文被统计异常的时候,把它当时对应的ethernet头信息打印出来。

2025-07-21 20:14:25 963

原创 linux网口<UP> 和state UP 的区别

每个网口在内核里有对应的结构体。

2025-07-11 09:26:45 2240

原创 tcpdump过滤vlan报文的逻辑差异

2. 在网口上抓包:内核代码里,在tcpdump抓包过滤的钩子函数之前,会把报文的vlan解析并剔除掉。所以 tcpdump(af_packet)在内核里,通过钩子函数运行过滤条件的 ebpf 指令时,被处理的报文已经不带vlan头了。因此读取 pcap 文件时候,没有 vlan 报文,这也是符合ebpf 指令的预期结果。相同的 ebpf 指令,为什么内核处理报文时候,就能够把 vlan 报文也匹配进来呢?而在网口上抓包时候,传递给内核的bpf指令也是严格按照ETH+IP+ICMP过滤的。

2025-06-21 13:55:18 944

原创 tcpdump时,为什么网口不显示混杂模式标志`PROMISC`

把这些标记位从将当前 netdev 的标志位上清除(与操作置零),然后设置为上层应用期望设置的值(预期值放在ifm->ifi_flags)。标志位, 就会满足 if 判断条件, 调用dev_set_rx_mode(dev)。参数,pflag保持初始值0,对应pcap_open_live的 ``参数 1,启用混杂模式.在内核里,针对每个网口上,会维护3 个标志位,来相应上层命令,并控制并记录网口的。这个函数是个基础函数, tcpdump时,最终也会调用到这个函数。根据命令行解析,并传递给内核的。

2025-06-21 11:25:15 1053

原创 内核如何管理同网口下多个ip地址(网口别名)

每个网口下面有多个IPv4地址,每个IP地址存放到一个的结构体里。这个结构体里存放别名、ip地址和掩码信息。每个网口下面有一个单链表,通过这个链表把多个 ifa 地址链接在一起。每个 net_namespace下有多个网口,通过一个 hash 数据组,把各个网口下的全部ifa 节点,放到这个hash链里面。别名并不会创建一个独立的网口,只是在同一个网口下增加一个对应的 ifa结构体并挂载到上面的两个链表中。每个ip地址,在内核里有一个的结构体相对应。

2025-06-19 22:08:31 1913

原创 TCP fastopen 介绍

网络上有大量的短连接,传输的数据很少。google统计显示,其访问请求里有30%左右的流量是短连接。

2025-06-18 21:20:29 1920

原创 【TCP 三次握手】消失的半链接队列

网上大部分文档这部分内容讲的比较多,简单来说,可以把半链接队列的逻辑概括如下:在v6.14内核里,三次握手的处理流程如下:2015年(没错十年前)内核加入了组性能优化的patch,将半链接socket(req socket)放到了一个全局的hash链表里。之前半链接socket是存放到对应listen socket下的半链接hash链表里(syn_table)。这个系列的patch的主要目的是为了优化性能,但在patch里也改变了长度判断。其中 在patch里明确提到半链接socket的变化tcp/dcc

2025-06-15 22:24:10 914

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除