Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化
本章开始深入分析Nginx的HTTP模块,重点关注初始化过程。源码原理
HTTP模块初始化主要在src/filter在网络层的分析实现细节分析主要基于Linux内核版本4..0-。
我绘制了一张Linux内核协议栈网络层netfilter(iptables)的选举选举全景图,其中包含了许多内容,源码原理以下将详细讲解。分析选项卡源码
INGRESS入口钩子是选举选举在Linux内核4.2中引入的。与其他netfilter钩子不同,源码原理入口钩子附加到特定的分析网络接口。可以使用带有ingress钩子的选举选举nftables来实施非常早期的过滤策略,甚至在prerouting之前生效。源码原理请注意,分析共享娃娃机源码系统在这个非常早期的选举选举阶段,碎片化的源码原理数据报尚未重新组装,例如匹配ip saddr和daddr适用于所有ip数据包,分析但匹配传输层的头部(如udp dport)仅适用于未分段的数据包或第一个片段,因此入口钩子提供了一种替代tc入口过滤的方法,但仍需tc进行流量整形。
Netfilter/iptables由table、chain和规则组成。
iptables的链(chain)
netfilter在网络层安装了5个钩子,对应5个链,还可以通过编写内核模块来扩展这些链的火山安卓 影视源码功能。
⑴五个链(chain)及对应钩子
以下是网络层五条链的位置图:
①网络数据包的三种流转路径
②源码中网络层的5个hook的定义
include\uapi\linux etfilter_ipv4.h
在include\uapi\linux etfilter.h中有对应的hook点定义:
注:在4.2及以上版本内核中又增加了一个hook点NF_NETDEV_INGRESS:
为NFPROTO_INET系列添加了NF_INET_INGRESS伪钩子。这是将这个新钩子映射到现有的NFPROTO_NETDEV和NF_NETDEV_INGRESS钩子。该钩子不保证数据包仅是inet,用户必须明确过滤掉非ip流量。这种基础结构使得在nf_tables中支持这个新钩子变得更容易。
iptables的表
⑴五张表(table)
以下是五张表分布在对应链上的图:
相关视频推荐
免费学习地址:Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
需要C/C++ Linux服务器架构师学习资料加qun 获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,佩戴口罩人脸识别源码Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,yt8512驱动源码DPDK,ffmpeg等),免费分享
⑵源码中IP层的表的定义
netfilter中的表的定义
include\linux etfilter\x_tables.h
网络层各hook点的优先级
数值越低优先级越高:
include\uapi\linux etfilter_ipv4.h
下面我们看下netfilter/iptables的这几张表在内核源码中的定义。
①raw表
源码里RAW_VALID_HOOKS宏可以看出raw表只有NF_INET_PRE_ROUTING、NF_INET_LOCAL_OUT链有效。
②mangle表
源码中valid_hooks参数可以看出mangle表对NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING五条链都有效。
③nat表
valid_hooks变量可以看出nat表只有NF_INET_PRE_ROUTING、NF_INET_POST_ROUTING、NF_INET_LOCAL_OUT、NF_INET_LOCAL_IN四条链有效。
④filter表
源码中valid_hooks参数可以看出filter表对NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT三条链有效。
网络层的五张表在内核中对应了五个内核模块:
3、Netfilter在网络层安装的5个hook点
下面我们看下网络层的各个hook点安装的位置:
⑴、NF_INET_PRE_ROUTING
它是所有传入数据包到达的第一个hook点,它是在路由子系统中执行查找之前。这个钩子在IPv4的ip_rcv()方法中,在IPv6的ipv6_rcv()方法中。
①net\ipv4\ip_input.c
②net\ipv4\xfrm4_input.c
⑵、NF_INET_LOCAL_IN
这个钩子在IPv4的ip_local_deliver()方法中,在IPv6的ip6_input()方法中。所有路由到本地主机的数据包都会到达此hook点,它是在首先通过NF_INET_PRE_ROUTING hook点并在路由子系统中执行查找之后进到这里。
net\ipv4\ip_input.c
⑶、NF_INET_FORWARD
①net\ipv4\ip_forward.c
②net\ipv4\ipmr.c
⑷、NF_INET_LOCAL_OUT
①net\ipv4\ip_output.c
②net\ipv4\raw.c
⑸、NF_INET_POST_ROUTING
net\ipv4\ip_output.c
以上我们看到xfrm中也有安装相关hook点,这里引用官方资料介绍下什么是xfrm:
xfrm是IP层的一个框架,用于封装实现IPSec协议。
简单来说,xfrm就是IP层的一个框架,用于封装实现IPSec协议。
到此,我们基于源码分析介绍完了Netfilter在网络层的实现。
kafka源码Topic的创建源码分析(附视频)
关于Kafka Topic创建的源码分析,可以从kafka-topic.sh脚本的入口开始,它执行了kafka.admin.TopicCommand类。在创建Topic时,主要涉及AdminClientTopicService对象的创建和AdminClientClient创建Topics方法的调用,其中Controller负责处理客户端的CreateTopics请求。
服务端的处理逻辑在KafkaRequestHandler.run()方法中,通过apis.handle(request)调用对应接口,如KafkaApis.handleCreateTopicsRequest,这个方法会触发adminManager.createTopics(),创建主题并监控其完成状态。创建的Topic配置和分区副本信息会被写入Zookeeper,如Topic配置和Topic的分区副本分配。
当Controller监听到/brokers/topics/Topic名称的变更后,会触发Broker在磁盘上创建相关Log文件。如果Controller在创建过程中失败,如Controller挂掉,待重新选举后,创建过程会继续,直到Log文件被创建并同步到zk中。
创建Topic时,zk上会创建特定节点,包括主题配置和分区信息。手动添加或删除/brokers/topics/节点将影响Topic的创建和管理。完整参数可通过sh bin/kafka-topic -help查看。
2024-12-23 23:37
2024-12-23 23:14
2024-12-23 22:37
2024-12-23 22:31
2024-12-23 22:05