ZingLix Blog

凡心所向,素履以往

TLS 握手究竟做了什么?

What happens in a TLS handshake?

随着 HTTPS 的普及,TLS 这一个单词也出现的更为频繁,那么什么是 TLS 呢?TLS 又如何使得 HTTP 传输变得安全呢? TLS,全称 Transport Layer Security,安全传输层协议,前身为 SSL (Secure Socket Layer,安全套接层),位于 TCP 与应用层之间。HTTPS 相对于 HTTP 来说,协议本身并未改变,而是在 TCP 与 ...

现代 C++ 中的类型推导

Type Deduction in Modern C++

模板类型推导 如下是一个普通的函数模板 1 2 template<typename T> void func(ParamType p); 当我们以 func(x) 方式调用时,编译器会帮我们自动推导出 T 和 ParamType 两个类型,且两者可能并不一样,因为 ParamType 可能会带有 const 或者 & 引用修饰符。 参数类型为引用或指针 1 2...

std::move() 与 std::forward()

移动语义与完美转发

移动语义 移动语义是 C++11 中新引入的一个概念,目的是当一个对象赋值给另一个对象后,自身不再被使用的情况。原本需要的操作是先调用新对象的复制构造函数再将原对象销毁,而有了移动语义后,则是将原对象的资源“移动”给新对象,例如 std::vector 将指向数组的指针赋值给新对象,而非申请一块新的内存再将原地址内容复制过去,这样就以避免昂贵的复制操作。在用到了临时对象(右值)时的赋值时这...

「CSAPP Lab」缓冲区溢出实验

Attack Lab

Lab Version: 1/11/16 Cookie: 0x59b997fa 缓冲区溢出 缓冲区溢出是指类似于 scanf 的函数,输入到一个字符数组中并不会检查溢出,所以用户输入的代码会影响到字符数组以外的内存空间,溢出的那部分可能就会产生一些意想不到的结果。这个实验就是展现缓冲区溢出的结果。 Part 1 如下是每次都会运行的函数,其中 getbuf() 是一个存...

「CSAPP Lab」二进制炸弹实验

Bomb Lab

Bomb Lab Version: 1/12/2016 二进制炸弹实验提供了一个可执行文件,要求用户输入 6 个密码才能够拆除炸弹,而密码并没有任何线索,所以只能够通过反汇编等方式确定。 1 2 3 4 5 6 7 8 9 input = read_line(); phase_1(input); phase_defused(); printf("Phase 1 defused. ...

动态规划

Dynamic Programming

动态规划与分治类似,都是通过拆分成子问题再组合来得到结果,但是分治将问题划分成了互不相关的子问题,而动态规划适用于子问题重叠的情况。动态规划通常用来求解最优解。 原理 对于适用于动态规划的问题,要求其满足 最优子结构 和 子问题重叠 两个要素。 最优子结构 最优子结构指的是对于一个规模的最优解,其包含的每个子问题都是最优解。有了这一性质就保证了我们可以先求解子问题的最优解,再用它来构...

8086 汇编指令集整理

8086 Assembly Instrution Cheatsheet

数据传送指令 通用数据传送指令 MOV 格式:MOV dst,src 功能:将src传送到dst 限制:段寄存器间不可直接相互传送,立即数不能直接送段寄存器,CS 不可作为目的操作数。 PUSH & POP 格式:PUSH src & POP dst 功能:将 src 压栈 & 出栈送入 dst 限制:CS 不可作目的操作数 ...

「OS」内存管理和虚拟内存

Memory Management & Virtual Memory

内存是计算机中一个重要的资源,需要被认真管理。理想的存储器是私有的、容量无穷的、速度极快的的且非易失的,不过显然这样的存储器是不存在的,但是人们提出了 分层存储器体系 使得我们可以近乎得到这个理想存储器。 在这个体系中,越接近 CPU 的容量越小但速度更快且易失,越远离的容量越大速度更慢但非易失。一般来说只有相邻的两层间会有数据交换。通过这一体系能保证有足够容量存储数据,在被使用时一步...

STL 解析 —— 无序关联容器

Unordered Associative Containers

从 C++11 开始,标准库中对于关联容器进行了扩充,提供了基于 哈希表 实现的关联容器。哈希表会占用比存储的元素更多的内存,换来的是均摊 \(O(1)\) 的性能。 哈希表 之前有过对于哈希表的 详细介绍,所以本文更侧重于实现 解决冲突的策略有很多,标准库中选择使用 分离链接法,即冲突的元素都会被放在一个位置,用一个链表存储。 数据结构 这里将哈希表中每个元素称为一个...

STL 解析 —— 关联容器

set、map、multiset & multimap

关联容器中最为常用的是 map,是一个存储键值对(key-value)的数据结构,提供 key 可以在 \(O(logN)\) 的时间内得到 value,因此称为 关联容器 (Associative containers)。除了 map 外,关联容器中还有 set,行为与 map 类似但是只存储键。这两个不允许键重复,所以标准库为还提供了允许键重复的 multiset 和 multimap。...