交换机VLAN设置
在设置交换机vlan的时候,不太理解vid和vlan标签的区别,网上搜索资料,没找到很明确清晰的答案,deepseek的回答比较有用,这里记录一下。 流量类型 处理方式(接收) 处理方式(发送) 不带标签 (Untagged) 端口根据 PVID 为其打上标签 端口根据目标VLAN的成员类型:如果是Untagged则剥离标签 带标签 (Tagged) 端口检查是否允许该VLAN通过,允许则接收,否则丢弃 端口根据目标VLAN的成员类型:如果是Tagged则保留标签 deepseek给出的表格已经比较清晰了,这里再补充一下。 基本概念 PVID(交换机设置界面的VID) 每个端口只能设置一个PVID,当端口收到不带标签的流量时,会根据PVID为其打上标签 因此交换机进入内部的流量一定全部带标签 PVID只作用于入口 VLAN 所有相同tag的虚拟网络,每个VLAN表都可以设置自己的端口选项 交换机内部的流量根据VLAN设置来处理,例如tag=1的流量根据vlan1的设置来处理 VLAN只作用于出口 工作原理:按流量方向分解 1. 接收流量(数...
Debian13部署基于ebpf的路由软件Landscape Router
研究openwrt的时候,在b站发现了一个路由软件,拥有分流功能,或许可以实现比tun模式更好用的代理功能,就自己尝试了一下 项目地址:https://landscape.whileaway.dev/ github:https://github.com/ThisSeanZhang/landscape 部署 使用pve创建两台debian13虚拟机,一台部署Landscape,一台用于连接Landscape路由测试 在root目录下下载可执行文件landscape-webserver-x86_64并重命名为landscape-webserver 在/root/.landscape-router/目前下载static.zip网页资源并解压 服务开机自启使用项目文档中的systemd 服务即可 管理网页https://ip:6443 账号密码默认都是root 服务启动后目录结构如下 ├── .landscape-router │ ├── cert.pem │ ├── geo_tmp │ │ ├── ip │ │ │ ├── 1.ip │ │ ...
解决slaac下的多ipv6地址问题
由于使用slaac,每次ipv6前缀变更会增加nas的ipv6地址,nas系统会存在多个ipv6地址,ddnsgo没办法使用一个正确的ipv6地址 实现了一个工具,通过获取路由器RA,提供api返回nas和路由器RA前缀匹配的ipv6地址 在ddnsgo配置命令获取 curl http://nas-ip:30066 工具地址:https://github.com/moyin1004/nas-net-tool 可以使用docker部署: 运行参数可以自己配置,interface指定网络接口, unraid网络接口一般是br0,addr指定api监听地址 docker pull moyinrain/nas-net-tool:latest docker run -itd --network host --name nas-net-tool nas-net-tool -interface br0 -addr ":33066" 参考资料 http://www.gocloud.cn/bbs/thread-14510-1-1.html https://e...
brpc源码之bthread原理及调度
源码分析:https://github.com/moyin1004/brpc-learn bthread结构 btreahd数据结构 bthread可以理解为用户态线程,调度无需系统调用 TaskMeta实际由brpc中对象池ReourcePool分配 实际上每个bthread都是一个任务,bthread的调度就是对任务的调度,如果了解golang的GMP模型,就会发现两者非常相似,都是任务+任务队列的形式,bthread或者goroutine的和普通任务的区别就是可以中途挂起 bthread对应的数据结构如下: struct TaskMeta { // [Not Reset] butil::atomic<ButexWaiter*> current_waiter{NULL}; uint64_t current_sleep{TimerThread::INVALID_TASK_ID}; // A flag to mark if the Timer...
面经-Golang
内存分配/内存逃逸/GC 内存管理原理:https://draven.co/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator 分配 Golang内存管理—内存分配器 图解Go语言内存分配器 原理来源于google的tcmalloc 内存逃逸 https://juejin.cn/post/7155815911755087908 GC Golang 垃圾回收:一次 GC 周期的详细过程 GMP调度 GMP 原理与调度 看完brpc的bthread之后再看go的协程调度,发现基本原理大致相同 协程+队列+系统线程池 协程可以视为任务 每个队列绑定一个系统线程,当本队列空时,可以从其他队列偷取任务 参考资料 https://draven.co/golang/
面经-MongoDB
分片原理 https://juejin.cn/post/6969431144462974984 分片核心概念 分片(Shard):每个分片是存储数据子集的独立 MongoDB 实例(通常以副本集形式部署,保证高可用性)。所有分片共同存储整个数据集 分片键(Shard Key):集合中用于划分数据的字段(如 user_id 或 timestamp)。分片键的选择直接影响数据分布的均衡性和查询性能 块(Chunk):分片内数据的逻辑划分单位,默认大小为 64MB/128MB。块是数据在分片间迁移的最小单位 配置服务器(Config Server):储分片集群的元数据(如分片键范围、块分布信息),通常以副本集形式部署,保证元数据高可用 查询路由器(mongos):轻量级进程,作为客户端与分片集群的入口,负责将请求路由到正确的分片 分片工作原理 数据分片流程 写入流程:当客户端写入数据时,mongos 根据分片键计算数据应归属的块,检查该块当前所属的分片,并将数据写入对应的分片 读取流程:mongos 根据查询条件中的分片键确定目标分片,若查询包含分片键,直接路由到对应分片...
Office文件内容解析
微软官方文档: doc格式:https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-doc xls格式:https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls ppt格式:https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-ppt OLE复合文件格式:https://docs.microsoft.com/en-us/openspecs/windows_protocols/MS-CFB doc、xls、ppt文件都属于OLE复合文件,在OLE基础上存储 OLE格式解析 以xls为例:复合文件以一个Header+多个Sector形式进行存储。 Header为512B,保存文件的基础信息,前8各字节一定是0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1。其余信息见图。 Sector分为Directory,F...
C++11智能指针标准库简化实现及enable_shared_from_this解析
参考libc++ 7.0.1实现 简单实现源码:https://github.com/moyin1004/learning/blob/master/cpp/SharedPtr.cc shared_ptr数据定义 shared_ptr使用引用计数管理一个对象资源,简单定义如下: template <typename T> class SharedPtr { private: T* _ptr; atomic<int>* _cntrl; } 以上实现简化了标准库控制块,只有计数,缺少了弱引用计数(weak_ptr使用) 实际使用中,引用计数为0时,并没有释放控制块资源,但是资源已经不可用了,当弱引用计数计数也为0时,才会释放控制块资源 标准库控制块实现: class __shared_count { protected: long __shared_owners_; // 用于shared_ptr 引用计数 }; class __shared_weak_count : ...
内存对齐
内存对齐 #include <cstdio> #include <cstdlib> #include <atomic> // g++ mem_align.cpp -Wall -O2 struct TestAlign { int64_t a; char b; int64_t c; }; int main() { // glibc 的实现(Linux 默认 C 库): malloc 在 64 位系统上默认对齐到 16 字节 TestAlign ta1{1, 'a', 2}; int8_t *p1 = (int8_t *)&ta1; printf("data: %c\n", *(char *)(p1 + 8)); // 应该是a printf("data: %ld\n", *(int64_t *)...
C++ attribute语法
GNU 和 IBM 语言扩展 __attribute__((...)) 、Microsoft扩展 __declspec() 标准库格式:[[attribute-list]] GUN __thread TaskGroup *tls_task_group = __null; static __attribute__((noinline, unused)) TaskGroup *get_tls_task_group(void) { asm volatile(""); return tls_task_group; } static __attribute__((noinline, unused)) TaskGroup **get_ptr_tls_task_group(void) { TaskGroup **ptr = &tls_task_group; asm volatile("" : "+rm"(ptr)); return ptr; } sta...
面经-Redis
lua脚本和pipline的区别 https://blog.csdn.net/qq_37080455/article/details/140443791 批量发送命令,lua脚本是原子性的,pipeline按顺序处理操作不保证原子性的 pileline的作用和优势 Redis Pipeline 的主要作用是将多个命令批量发送到服务器执行,减少客户端与服务器之间的网络往返次数(Round-Trip Time, RTT),从而显著提升批量操作的性能。 核心作用 批量执行命令客户端将多个命令一次性发送到 Redis 服务器,服务器依次执行这些命令,并将结果一次性返回给客户端。避免了传统的“发送命令→等待响应→再发送下一个命令”的串行模式。 减少网络开销合并多个命令的通信过程,降低网络延迟对性能的影响(尤其在物理距离较远的场景中效果更明显)。 核心优势 大幅降低延迟假设网络往返时间为 100ms,执行 100 个命令时:传统模式:总耗时 = 100 命令 × 100ms = 10,000ms(10 秒)。 Pipeline:总耗时 ≈ 1 次往返时间(100ms) + 命令...