自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 setcontext getcontext makecontext swapcontext

Linux上下文切换以及协程 上下文切换,听起来虚无缥缈,什么是上下文,切换又是指的是什么?其实上下文就可以理解为一个进程所运行的相关的寄存器值,即包括sp/bp/pc等值,换句话说,一个上下文,就是包括了能够恢复进程运行所需要的所有必要的东西。所谓的切换, 那是多进程的操作系统必要的功...

2017-12-03 10:02:48 2020 1

原创 TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别

我的TLS实现:https://github.com/mrpre/atls/大家可以参考,代码里面的逻辑较清晰。 我的SSL专栏见:https://blog.csdn.net/mrpre/article/category/9270159描述了TLS的各方面。 本文是对前面系列章节关于非...

2017-09-19 08:50:16 40782 26

原创 TLS/SSL 协议详解 (28) TLS 1.0、TLS 1.1、TLS 1.2之间的区别

TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txt TLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txt TLS 1.2 RFC http://www.ietf.org/rfc/rfc5246.txt   ...

2017-09-14 11:32:26 110589 2

原创 DH算法原理

  DH算法原理       DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。   本篇分为几个部分,第一个部分介绍一下密钥...

2016-09-21 15:59:40 23132 12

原创 关于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数...

2015-02-03 17:18:34 70473 12

原创 Redis cluster 原理

Redis cluster 原理 Redis cluster 设计文档可见: https://redis.io/topics/cluster-spec#configuration-handling-propagation-and-failovers 相关资料 https://chanjarster...

2020-10-28 17:47:45 18 0

原创 redis 模块编程中 key value的生命周期

RedisModule_OpenKey 本节探讨下 RedisModule_OpenKey 中 key-value 何时释放。 首先 的数据结构如下 struct RedisModuleKey { .... robj *key; robj *value; ......

2020-07-27 15:56:46 69 0

原创 Golang 对分片 append 是否会共享数据

Golang 对分片 append 是否会共享数据 Golang 官方对 slice 的说明见文章:https://blog.golang.org/slices-intro 大部分特别是前半部分,写的非常详细,但是最后关于append相关部分,就让人感觉浅尝辄止了。 首先,先写结论:append ...

2020-07-21 13:38:50 74 0

原创 Redis源码分析之PSYNC同步

Redis master-slave 同步源码分析 (1)slave 流程分析 (2)master 流程分析 Slave 分析 当Redis 启动后,会每隔 1s 调用 replicationCron (通过 redis自带的serverCron后台线程),即无论是单机、还是Master、还是Sl...

2020-07-10 14:29:16 112 0

原创 LLVM - 生成局部变量

接上面一篇:https://wonderful.blog.csdn.net/article/details/106902005 上面一篇实现了如下函数,但是 都是对入参a的操作 double myfor(double a) { for(i = 0; i < a; i++) { ...

2020-06-22 15:18:28 213 0

原创 LLVM - 生成for循环

1、生成函数 2、使用Phi表达式实现for循环 3、本例中,KaleidoscopeJIT源码位于./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.h Phi的概念可参考https://stackoverflow.com...

2020-06-22 15:08:04 171 0

原创 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_...

2020-06-22 14:55:44 68 0

原创 LLVM - 生成加法

本例中KaleidoscopeJIT在 ./llvm-8.0.1.src/examples/Kaleidoscope/include/KaleidoscopeJIT.中 1、LLVM生成函数 2、LVVM生成加法 3、LLVM jit运行 #include <sys/time.h> #...

2020-06-22 13:57:04 108 0

原创 Redis源码分析之HSET流程与ziplist

本篇分析Redis 如何处理hset指令 数据结构 首先,hset不同于set,set是存储在dict,即redis字典里面,毕竟set只是简单的kv类型数据。 hset存储的是复杂的数据结构,使用了压缩表ziplist,例如 hset mykey name abc id 123 其中 myke...

2020-06-19 17:27:18 126 0

原创 kprobe 的 3 种使用

知识背景:会编写基础内核模块 kprobe用处:用来跟踪、记录、打桩。最常见的使用就是需要打印内核函数的执行流程,比如排查问题时、或者学习内核流程时需要用到。 准备工作:找一份和自己linux系统相同版本的源码(方法自行Google,ubuntu、centos、redhat各自有各自方法) 内核...

2020-06-17 10:22:56 159 0

原创 通过splice完成socket代理零拷贝

spilce 的应用 通常,一个反向代理服务器,需要做转发处理,例如流量模型如下: client -> proxy -> server 客户端和 proxy建立socket,然后proxy和server建立socket 下面这个程序逻辑非常简单,从fd获取数据,将数据转发到fd2。...

2020-06-12 17:27:28 141 0

原创 Redis源码分析之SET流程

本篇分析Redis 如何处理set指令 Client 客户端解析用户输入、构造指令 redisFormatSdsCommandArgv() redisAppendCommandArgv() cliSendCommand() issueCommandRepeat() repl() 例如用户输入 s...

2020-06-12 10:32:56 65 0

原创 Redis源码分析之SDS

Redis源码分析之SDS redis使用的sds源码,由另一个git库管理,独立于redis之外,可以独立看待:https://github.com/antirez/sds ,其好处,再其主页上说的很清楚了,本文是用来分析sds的内存结构,知道内存结构,也就能很好的理解sds的一些操作的原理。 ...

2020-06-08 14:57:11 80 0

原创 Nginx 的子请求(subrequest)原理分析

Nginx 的子请求(subrequest)原理分析 Nginx 的子请求设计其依托于自身的access阶段,实现了对指定url发起旁路请求的功能,通常用来鉴权、镜像等功能。当然还有其他用法这里不一一赘述,通常用户使用的接口有如内置auth_request接口或者lua的capture接口。这两个...

2020-03-03 15:58:42 440 0

原创 进程间文件描述符传递原理

进程间文件描述符传递原理 进程中文件的管理以及fork 每个进程的文件描述符是独立的,即一个进程打开的文件描述符是记录在进程对象上的(task_struct)。 task_struct { files_struct *files; } files_struct { struct...

2019-06-06 13:36:13 813 0

原创 raw socket 使用 BPF 过滤报文

raw socket 使用 BPF 过滤报文 抓包 使用 raw socket 进行网络底层抓包,想必大家都清楚(仔细想想tcpdump原理)。这里不赘述,网上许多资料。 注意,网卡需要开启混杂模式、其次程序需要管理员权限。 #include <stdlib.h> #include &...

2019-05-07 11:04:05 1445 0

原创 tcp_tw_reuse对客户端的作用

tcp_tw_reuse对客户端的作用 客户端频繁建立连接然后主动关闭连接,会产生大量TIME_WAIT,此时,如何快速利用TIME_WAIT呢? 必须满足下面所有条件: 客户端: /proc/sys/net/ipv4/tcp_tw_reuse 为 1 /proc/sys/net/ipv4/t...

2019-04-16 10:48:56 1412 0

原创 Nginx 作为反向代理(proxy)时的一些buffer指令

Nginx 作为反向代理(ptoxy)时的一些buffer指令 Nginx处理请求的行为 Nginx 只要配置的proxy_pass 都会无条件执行 ngx_http_read_client_request_body尝试去读 client 的 body。 请求不携带body 常见于 GET/HEA...

2019-02-28 16:42:25 1801 0

原创 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#_...

2019-02-14 13:21:02 6984 5

原创 Nginx 假性内存泄露

Nginx 假性内存泄露 Nginx在使用中,发现其使用的VSZ和RSS都在不断变大,查看新增的代码,没有找到内存泄露的地方,ngx_palloc和ngx_pfree都是对称调用的。 Nginx 内存池机制 使用Nginx开发过的都知道,在Nginx里面普遍使用ngx_palloc/ngx_pna...

2018-12-27 10:37:58 1674 3

原创 隐藏动态库so中的符号(函数名)

隐藏动态库so中的符号(函数名) 正常的lib库生成 1.c int func1() { return 1; } 2.c extern int func1(void); int func2() { return func1(); } 编译成动态库 libfunc.so: gcc...

2018-11-29 19:35:50 5705 0

原创 通过代码获取Linux nameserver(域名服务器ip)

通过代码获取Linux 域名服务器ip /etc/resolv.conf 首先,/etc/resolv.conf定义了机器的域名服务器ip,例如 nameserver 1.1.1.1 nameserver 2.2.2.2 表示DNS服务器地址有2个。 当然,你可以人肉解析改配置文件...

2018-11-16 19:10:54 2443 0

原创 调用malloc时发生了什么(3) - 缺页中断

页表的创建 kmalloc内存使用了umapped内存,直接对地址偏移即可寻址物理内存,这里不考虑。 考虑用户态内存和vmalloc,都用到了虚拟内存,即需要通过页表查询的方式查询都物理内存。 例如 用户态通过brk申请了一块内存,后续访问这块内存的0x00007F88F16A4690这块地址会发...

2018-11-02 18:12:47 773 0

原创 大页内存 初始化

大页内存 初始化 hstates 所有的大页均放在 hstates 的全局变量中。 mm/hugetlb.c struct hstate hstates[HUGE_MAX_HSTATE]; 每个 hstates 数组的元素,均表示一种大小的page,其中 HUGE_MAX_HSTATE的值为2,这...

2018-11-02 16:41:37 667 0

原创 Linux 大页内存 的使用

Hugepage 大页内存 的使用 系统启用大页内存 下述操作,需要重启机器。 不建议 通过 设置 echo 1G &amp;amp;amp;gt; /proc/sys/vm/nr_hugepages的方式设置,因为系统不一定成功。 设置大页内存的PAGESIZE Centos ...

2018-10-31 16:49:39 3750 0

原创 perf 统计缺页中断 和TLB miss

perf 统计 内存相关event perf 可探测 的所有 event ,均可以使用命令perf list获得。 本文举几个和内存相关的性能的几个event例子 探测 进程 的缺页中断数(page fault) perf stat -e faults ./mem 能够统计 ./mem 执行 周期...

2018-10-30 10:00:48 2129 0

原创 socket源码分析之accept

socket源码分析之accept() 基于 kernel 3.10 之前有分析过TCP accept()的实现,但是太过于沉浸于代码本身,没有结合应用去分析accept()函数。 我们要解决如下几个问题: 1:accept()函数的实现,包括从全队列中取出sock。...

2018-09-12 09:02:04 1723 0

原创 TCP选项分析 之 SO_REUSEADDR

TCP选项分析 之 SO_REUSEADDR 首先 从工程角度考虑如下问题 问题: 1:Server 进行 bind(),listen(),accept(),然后进行等待Client连接。 2:Client 进行 连接。即,Server的accept()返回client_fd 3:S...

2018-09-12 08:59:56 398 0

原创 MQTT协议 几个重要的属性

MQTT 特性 MQTT协议其实还是挺简单的,从为数不多的项目中,简单的总结了下MQTT协议某些字段的特性 1:will(遗言) 包括 Will topic 、will message 、 will Qos、will retain。 一个Client异常断开连接的时候或者...

2018-09-08 18:21:36 4377 0

翻译 MQTT 3.1.1 规范

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html 2 MQTT Control Packet format 1.2 Structure of an MQTT Control Packet MQTT协议...

2018-09-08 18:00:33 767 0

原创 TLS 1.3 协议详解

TLS 1.3 握手流程详解 需要的背景知识: (1):对 TLS 1.2 协议有一定程度的了解,包括秘钥交换、会话复用等。 第一节 TLS 1.3 的握手概述 协议分析的第一步就是看报文。TLS 1.3的报文,有个特点,就是通过抓包发现,只能看到明文的Client Hello和S...

2018-08-09 10:46:08 17733 16

原创 签名算法中rsa_pss_pss_*和rsa_pss_rsae_*的区别

rsa_pss_pss_* 和 rsa_pss_rsae_* 的区别 对于签名来说 首先,对于签名来说,没区别。都是使用PSS流程进行签名。 对于公钥来说有区别 说先,加签方需要判断自己的 public key 什么类型,如果 public key是rsaEncryption类型,...

2018-07-19 16:44:19 1070 0

原创 SSL_write 发生了什么

SSL_write 发生了什么 以前在设计协议栈的时候,非常随意,因为包括下层的TCP到上层的应用处理,都是自己设计的,怎么样不麻烦这么约定。然而,如果将自己的协议栈放在通用平台,那么问题就显得比较微妙了,不是因为协议栈本身自己的实现的难度,而是使用协议栈的方式多样化导致接口设计需要变得非常复杂...

2018-07-16 09:26:24 5479 0

原创 Nginx源码分析之 HTTP阶段

typedef enum { /*最开始的阶段,貌似Nginx原生没有该阶段的handler*/ NGX_HTTP_POST_READ_PHASE = 0, /*配置在server块的rewrite指令,则会处理hander,否则,handler进去直接return*/ ...

2018-07-11 15:40:35 334 0

原创 Nginx源码分析之 配置结构1

个人认为,Nginx的配置结构复杂至极,比Nginx其他模块的都复杂,想要彻底搞清楚,还需要下功夫。下面是个人的一些理解。 if (cmd-&amp;amp;amp;gt;type &amp;amp;amp;amp; NGX_DIRECT_CONF) { /*&a...

2018-07-10 15:01:09 173 0

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