- 博客(154)
- 资源 (4)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 setcontext getcontext makecontext swapcontext
Linux上下文切换以及协程 上下文切换,听起来虚无缥缈,什么是上下文,切换又是指的是什么?其实上下文就可以理解为一个进程所运行的相关的寄存器值,即包括sp/bp/pc等值,换句话说,一个上下文,就是包括了能够恢复进程运行所需要的所有必要的东西。所谓的切换, 那是多进程的操作系统必要的功能,一个CPU能够运行多个进程(看起来),那么必然要在多个进程之间不停的切换,A切换到B时,必...
2017-12-03 10:02:48
3290
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别
我的TLS实现:https://github.com/mrpre/atls/大家可以参考,代码里面的逻辑较清晰。 我的SSL专栏见:https://blog.csdn.net/mrpre/article/category/9270159描述了TLS的各方面。 本文是对前面系列章节关于非对称算法在SSL中运用的总结和细化,但也可以作为详解SSL中RSA、ECDHE非对...
2017-09-19 08:50:16
65776
38
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 TLS/SSL 协议详解 (28) TLS 1.0、TLS 1.1、TLS 1.2之间的区别
TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txtTLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txtTLS 1.2 RFC http://www.ietf.org/rfc/rfc5246.txtTLS 1.3 见:https://blog.csdn.net/mrpre/article/deta...
2017-09-14 11:32:26
172024
5
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 DH算法原理
DH算法原理DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。本篇分为几个部分,第一个部分介绍一下密钥交换的场景;第二部分介绍一下DH算法的的步骤,以及由该算法引出的一些问题;第三部分开始讲数学原理。数学...
2016-09-21 15:59:40
33906
16
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 关于UDP接收icmp端口不可达(port unreachable)
本篇分为3部分1:报文格式2:产生的原因3:linux协议栈如何处理4:应用层如何获取1:报文如下,10.30.13.1往10.30.16.10的80端口发送了一个UDP报文,80端口其实监听的是TCP。服务器回复了一个类型为端口不可达的ICMP,ICMP数据部分就是请求UDP ip层及其以上的数据。2:原因 首先原因就是接收udp报文...
2015-02-03 17:18:34
118942
13
原创 CSI以及本地盘的相关实现记录
CSI有众多接口,按逻辑共分为三类,开发者需要按照需求实现对应的接口。外部组件(node-driver-registrar、external-provisioner 等)会通过unix socket+gpc调用这些接口。在CSI代码中经常可以看到这么几句话,就是注册对应的接口。之所以分这么多类,是因为这些类是不同的外部组件分别调用的。实际上,你开发的CSI pod 完全可以全部注册这些类,然后CSI pod + External-Provisioner 部署在一起时,该CSI pod就会被调用contro
2022-06-15 14:14:03
722
原创 ipvs 导致syn 重传问题
(本篇讲的是IPVS自身到指的syn重传,和RS的PAWS没关系)sysctl_conn_reuse_mode 为0 时,如果当前IPVS的session是TIME_WAIT或者其他状态,任何进来的packet都会根据当前的session进行转发。这就造成一个问题,如果客户端请求都是短连接,那么IPVS的session都是TIME_WAIT状态,如果客户端来了一个SYN包,那么SYN包也会将当前的session变成SYN_RECV,然后不会重新调度RS。特别是,如果我们将RS权重为0,此时一个SYN过来
2022-05-23 17:50:43
892
原创 ip_forward 如何影响IPVS转发流程
先理清几个概念/proc/sys/net/ipv4/ip_forward 等价于下面的 /proc/sys/net/conf/all/forwarding/proc/sys/net/ipv4/conf/xx/forwarding 针对指定的dev xx进行设置/proc/sys/net/ipv4/conf/all/forwarding 需要对当前所有device进行设置,当然不同的属性,all 的逻辑不一样,需要one by one的的看/proc/sys/net/ipv4/conf/defa
2022-05-19 14:18:50
790
原创 PAWS 到底是什么
名词PAWS : Protection Against Wrapping SequenceISN: Init sequence NumberSEQ 回环TCP的 seq 是一个u32的递增数字,SYN和FIN会消耗一个seq,其次每个TCP的payload都会消耗对应长度的seq,也就是说,对于每一个TCP连接而言,seq是单调递增的,所以u32会溢出于是就回环了,回环本身没有什么问题,常见的通过将seq强转成有符号比较,if ((s32)current > (s32)last),永远能简单高
2022-05-07 16:36:12
1856
原创 netlink 读取数据流程
前言本篇缘起是我要实现类似ss -i 的功能,通过netlink获取系统中的所有socket信息代码如下//发送tcpdiag的数据sendto(netlinkdf, msg,...)//sleep足够时间,使得内核处理//因为每次都读取少部分数据,以为内核没来得及处理sleep(10)char buffer[10000]len = recvfrom(buffer, sizeof(buffer), 0);上面流程中,recvfrom 返回的字节大小,小于buffer大小,理应我们认为
2022-04-23 21:23:32
1279
原创 tcp_diag 内核相关实现 以及调用层次
tcp_diag 内核相关实现前言tcp_diag 是一个内核模块,本文的目的是梳理调用关系,如果从用户态的socket一路调用到tcp_diag模块dump出所有socket的。大致分层关系 总结如下:netlink层->sock_diag层->inet_diag层->tcp_diag用户态代码类似 ss 功能的代码可以从 https://man7.org/linux/man-pages/man7/sock_diag.7.html 中获得,但是它只是打印 unix_socket
2022-04-22 16:09:19
4045
原创 浅谈skiplist在LevelDB的应用
什么是跳表具体参考 http://zhangtielei.com/posts/blog-redis-skiplist.htmlLeveldb 为什么用跳表首先 skiplist作为memtable的数据结构,如果光为了存储kv,那么任何数据结构都能被使用,像Redis的dict。但是 LevelDB 有个特性,就是put 2个相同的key,那么2份相同的key会同时存在于 memtable 中,而不是通常人们理解的使用新的value把老的value替换掉。这就意味着,get时需要保证取到的是新的val
2021-08-18 14:12:14
382
原创 flannel 原理 之 TUN模式
flannel 原理 之 TUN模式首先,TUN模式 原理详见 https://wonderful.blog.csdn.net/article/details/113105456 ,通常用来两个私网通过公网穿越。总的来说要熟悉掌握TUN设备的特性,被路由到TUN设备发出去的数据,都会被Open TUN的socket读到,做到拦截;write到TUN的数据,都会被TUN重放到协议栈,模拟了TUN设备所在的机器收包操作。流程假设当前 2台node node1为11.238.116.75 node2的物理I
2021-03-24 16:32:13
1700
原创 flannel 原理 之 子网划分
flannel 原理 之 子网划分Docker通常情况下, 2台物理机上分别安装Docker,Docker分别在2台物理机上,docker0的网桥,其IP地址属于私网网段,例如物理机地址是10.x.x.x,docker0地址通常是192.x.x.x。 任何在物理机上启动的container,其分配的eth0地址都是 192.x.x.x。 但是2台独立的物理机上的container之间是无法通信的,因为物理网络里是没有192.x.x.x网段的信息,无法对其进行路由,更何况物理网络作为基础设施,也不可能动态
2021-03-24 16:26:17
1086
原创 TUN 设备原理
TUN 设备原理本文要解决的就是 sslvpn 的运行机制。例如如何使用tun设备,是的连个独立的私网ip能够跨公网访问simpletun首先玩一下简单的例子 https://github.com/gregnietsky/simpletun.git 然后有个直观的感受我们找2台机器 分别使用make命令编译上述代码,生成 二进制 simpletunA物理ip 11.238.116.73B物理ip 11.238.116.75在B机器上执行sudo ./simpletun -i tun90 -
2021-01-25 10:58:27
4492
原创 Redis cluster 原理
Redis cluster 原理Redis cluster 设计文档可见:https://redis.io/topics/cluster-spec#configuration-handling-propagation-and-failovers相关资料https://chanjarster.github.io/post/redis-cluster-config-propagation/在当前Redis6.0的版本中,可以使用 redis-cli --cluster create命令来规划一个集群,
2020-10-28 17:47:45
402
原创 redis 模块编程中 key value的生命周期
RedisModule_OpenKey本节探讨下 RedisModule_OpenKey 中 key-value 何时释放。首先 的数据结构如下struct RedisModuleKey { .... robj *key; robj *value; ....}我们关心的是 RedisModuleKey 本身以及 其中 的 key和value值的生命周期RedisModuleKey 本身 通过 RedisModule_OpenKey申请,模块内存管理自动将
2020-07-27 15:56:46
572
原创 Golang 对分片 append 是否会共享数据
Golang 对分片 append 是否会共享数据Golang 官方对 slice 的说明见文章:https://blog.golang.org/slices-intro 大部分特别是前半部分,写的非常详细,但是最后关于append相关部分,就让人感觉浅尝辄止了。首先,先写结论:append 返回的slice对象,有可能会共享入参slice的底层(意味着对返回对象slice的赋值会影响入参slice)也可能不共享入参slice的底层。先给几个例子例1:package mainimport (
2020-07-21 13:38:50
415
原创 Redis源码分析之PSYNC同步
Redis master-slave 同步源码分析(1)slave 流程分析(2)master 流程分析Slave 分析当Redis 启动后,会每隔 1s 调用 replicationCron (通过 redis自带的serverCron后台线程),即无论是单机、还是Master、还是Slave都会调用这个函数。我们先来讨论下作为Slave的情况下,replicationCron 函数运行逻辑。作为slave,这个函数的功能应该能猜到,就是和Master保持连接、握手、接受Master存量数据+
2020-07-10 14:29:16
810
原创 LLVM - 生成局部变量
接上面一篇:https://wonderful.blog.csdn.net/article/details/106902005上面一篇实现了如下函数,但是 都是对入参a的操作 double myfor(double a) { for(i = 0; i < a; i++) { a = a + 1 } return a }本例中,我们希望实现是局部变量的加减,然后return,如下 double myvar(double a) { do
2020-06-22 15:18:28
1188
原创 LLVM - 生成for循环
1、生成函数2、使用Phi表达式实现for循环3、本例中,KaleidoscopeJIT源码位于./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.hPhi的概念可参考https://stackoverflow.com/questions/11485531/what-exactly-phi-instruction-does-and-how-to-use-it-in-llvm本例中,生成的llvm ir如下:define do
2020-06-22 15:08:04
1012
原创 LLVM - 生成 if-else 以及 PH
1、生成函数2、函数有4个basic block,一个entry,一个 if-then 另一个 if-else,最后一个是因为需要使用ph,所以创建一个merge。3、创建ph来处理if-else,相关概念 http://en.wikipedia.org/wiki/Static_single_assignment_form4、使用jit运行5、本例中KaleidoscopeJIT源码在./llvm-8.0.1.src/examples/Kaleidoscope/include/Kaleidoscop
2020-06-22 14:55:44
588
原创 LLVM - 生成加法
本例中KaleidoscopeJIT在 ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.中1、LLVM生成函数2、LVVM生成加法3、LLVM jit运行#include <sys/time.h>#include "./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h"#include "llvm/ADT/APFloat.h"#i
2020-06-22 13:57:04
524
原创 Redis源码分析之HSET流程与ziplist
本篇分析Redis 如何处理hset指令数据结构首先,hset不同于set,set是存储在dict,即redis字典里面,毕竟set只是简单的kv类型数据。 hset存储的是复杂的数据结构,使用了压缩表ziplist,例如hset mykey name abc id 123其中 mykey 为 key,abc为field,123为 value 。首先,需要说明的是,如果想了解ziplist内存的布局,完全可以看ziplist.c 文件开头的那些注释,这个是非常官方的解释,也非常详细。名为myk
2020-06-19 17:27:18
1218
原创 kprobe 的 3 种使用
知识背景:会编写基础内核模块kprobe用处:用来跟踪、记录、打桩。最常见的使用就是需要打印内核函数的执行流程,比如排查问题时、或者学习内核流程时需要用到。准备工作:找一份和自己linux系统相同版本的源码(方法自行Google,ubuntu、centos、redhat各自有各自方法)内核模块跟踪指定函数官方文档:https://www.kernel.org/doc/Documentation/kprobes.txt在 内核源码目录samples/kprobes/有几个kprobe模块例子,.
2020-06-17 10:22:56
5039
4
原创 通过splice完成socket代理零拷贝
spilce 的应用通常,一个反向代理服务器,需要做转发处理,例如流量模型如下:client -> proxy -> server客户端和 proxy建立socket,然后proxy和server建立socket下面这个程序逻辑非常简单,从fd获取数据,将数据转发到fd2。为了让 fd对应的socket有待读数据,这里访问了1.1.1.1,它是我启动的server。#define _GNU_SOURCE#include <unistd.h>#include <
2020-06-12 17:27:28
1515
原创 Redis源码分析之SET流程
本篇分析Redis 如何处理set指令Client客户端解析用户输入、构造指令redisFormatSdsCommandArgv()redisAppendCommandArgv()cliSendCommand()issueCommandRepeat()repl()例如用户输入 set abcd 2,则构造的指令就是*3\r\n$3\r\nset\r\n$4\r\nabcd\r\n$1\r\n2\r\n,*后面表示指令+参数的个数,$后面表示当前参数的长度,然后紧跟参数值。Server服
2020-06-12 10:32:56
608
原创 Redis源码分析之SDS
Redis源码分析之SDSredis使用的sds源码,由另一个git库管理,独立于redis之外,可以独立看待:https://github.com/antirez/sds ,其好处,再其主页上说的很清楚了,本文是用来分析sds的内存结构,知道内存结构,也就能很好的理解sds的一些操作的原理。sds被用来描述Redis中的“字符串”,也是redis中最为简单的数据结构之一。本文就来分析 sds...
2020-06-08 14:57:11
264
原创 Nginx 的子请求(subrequest)原理分析
Nginx 的子请求(subrequest)原理分析Nginx 的子请求设计其依托于自身的access阶段,实现了对指定url发起旁路请求的功能,通常用来鉴权、镜像等功能。当然还有其他用法这里不一一赘述,通常用户使用的接口有如内置auth_request接口或者lua的capture接口。这两个对外的接口,都使用了Nginx的ngx_http_subrequest函数。本文就稍微梳理下其子请求流...
2020-03-03 15:58:42
2520
原创 进程间文件描述符传递原理
进程间文件描述符传递原理进程中文件的管理以及fork每个进程的文件描述符是独立的,即一个进程打开的文件描述符是记录在进程对象上的(task_struct)。task_struct { files_struct *files;}files_struct { struct fdtable __rcu *fdt;}fdtable { struct file _...
2019-06-06 13:36:13
2531
原创 raw socket 使用 BPF 过滤报文
raw socket 使用 BPF 过滤报文抓包使用 raw socket 进行网络底层抓包,想必大家都清楚(仔细想想tcpdump原理)。这里不赘述,网上许多资料。注意,网卡需要开启混杂模式、其次程序需要管理员权限。#include <stdlib.h>#include <stdio.h>#include <sys/socket.h>#inclu...
2019-05-07 11:04:05
3456
原创 tcp_tw_reuse对客户端的作用
tcp_tw_reuse对客户端的作用客户端频繁建立连接然后主动关闭连接,会产生大量TIME_WAIT,此时,如何快速利用TIME_WAIT呢?必须满足下面所有条件:客户端:/proc/sys/net/ipv4/tcp_tw_reuse 为 1/proc/sys/net/ipv4/tcp_timestamps 为 1 TIME_WAIT socket 生存时间超过1秒服务端:...
2019-04-16 10:48:56
2589
原创 Nginx 作为反向代理(proxy)时的一些buffer指令
Nginx 作为反向代理(ptoxy)时的一些buffer指令Nginx处理请求的行为Nginx 只要配置的proxy_pass 都会无条件执行 ngx_http_read_client_request_body尝试去读 client 的 body。请求不携带body常见于 GET/HEAD方法。此时,在ngx_http_read_client_request_body判断Content...
2019-02-28 16:42:25
5815
原创 MQTT v5 (MQTT 5.0) 新特性介绍
MQTT v5 (MQTT 5.0) 的新功能项目中逐步完成了 MQTT 5.0的开发,这里介绍下MQTT 5.0 的一些新特性MQTT 5.0 规范见:http://docs.oasis-open.org/mqtt/mqtt/v5.0/cos01/mqtt-v5.0-cos01.html#_Toc514847900格式首先,协议上,增加了一个 Property字段,正是这个字段,使得 M...
2019-02-14 13:21:02
12988
5
原创 Nginx 假性内存泄露
Nginx 假性内存泄露Nginx在使用中,发现其使用的VSZ和RSS都在不断变大,查看新增的代码,没有找到内存泄露的地方,ngx_palloc和ngx_pfree都是对称调用的。Nginx 内存池机制使用Nginx开发过的都知道,在Nginx里面普遍使用ngx_palloc/ngx_pnalloc申请内存,其中入参有一个pool,它是从ngx_create_pool获得的一个对象,改函数入...
2018-12-27 10:37:58
2966
3
原创 隐藏动态库so中的符号(函数名)
隐藏动态库so中的符号(函数名)正常的lib库生成1.cint func1(){ return 1;}2.cextern int func1(void);int func2(){ return func1();}编译成动态库 libfunc.so:gcc -shared -fPIC -o libfunc.so 1.c 2.c查看符号:$nm libf...
2018-11-29 19:35:50
11156
原创 通过代码获取Linux nameserver(域名服务器ip)
通过代码获取Linux 域名服务器ip/etc/resolv.conf首先,/etc/resolv.conf定义了机器的域名服务器ip,例如nameserver 1.1.1.1nameserver 2.2.2.2表示DNS服务器地址有2个。当然,你可以人肉解析改配置文件,这个是没问题的,如果你代码没有BUG的话。glibc 对配置文件的处理#ifdef _LIBC if (M...
2018-11-16 19:10:54
3866
原创 调用malloc时发生了什么(3) - 缺页中断
页表的创建kmalloc内存使用了umapped内存,直接对地址偏移即可寻址物理内存,这里不考虑。考虑用户态内存和vmalloc,都用到了虚拟内存,即需要通过页表查询的方式查询都物理内存。例如 用户态通过brk申请了一块内存,后续访问这块内存的0x00007F88F16A4690这块地址会发生什么?首先,X64内核是4级页表,根据X64对线性地址的划分,可以计算出0x00007F88F16...
2018-11-02 18:12:47
1701
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人