DNS 解析与 DIG 工具

Photo by Caleb Kastein on Unsplash

当我们输入域名请求服务器真实 IP 或者用 DIG 工具排查域名相关时, 具体的解析过程以及 DNS 服务器解析原理 ,我想通过本文做个简单的阐述。

DNS 解析过程

我们可以通过在线 DIG 工具可以查看域名解析的结果甚至追踪域名解析的过程。假如我想查询某个 baidu.com 对应的 IP 地址,可以这样发出查询。

然后可以从服务器得到这样的响应。其中 ANSWER SECTION 返回两个 IP 地址,这就是 baidu.com 对应的 IP 地址。

继续阅读DNS 解析与 DIG 工具

公钥可以用来做什么

Photo by Mo on Unsplash

数据加密是为了确保传输信道上的信息不被泄露。数据认证是为了确保传输信道上的数据不被篡改。非对称加密算法中的公钥既可以用来进行数据加密也可以用来进行数据认证。它们都是用到了私钥加密公钥解密和公钥加密私钥解密这一非对称加密性质。

数据加密——公钥加密

传递公钥用于数据加密。在 HTTPS 中双方交换公钥,双方分别使用对方的公钥对某个对称密钥进行加密,对端再用自己的私钥进行解密。

为了防止中间人攻击权威证书机构 (Certificate Authority,简称 CA) 对合法的服务器公钥信息利用自身的私钥生成数字签名,交由服务端一并发送给客户端。客户端在收到证书信息之后,利用浏览器中内置的、由 CA 派发的公钥对数字签名进行解密。若解密的数字签名与证书中的信息的摘要相吻合,那么就可以认为服务器端公钥未被篡改,客户端可以通过这个公钥来加密信息。

继续阅读公钥可以用来做什么

JSON Web Token 认证原理

Photo by Andrew Ly on Unsplash

JSON Web Token(下面简称 JWT )常被用来作为认证凭据存储在浏览器本地。通过本文,我想阐述清楚 JWT 认证的实现过程和背后的原理。

JWT 中 header(头部信息)和 payload(载荷信息)使用 Base64URL 进行编码。和 Base64 编码一样,Base64URL 本身是一种编码算法,而不是加密算法,因此头部信息和载荷信息仍不能携带密码等敏感信息。

为此,我们可以在服务器端根据头部信息和载荷信息生成一个数字签名,放在 JWT 中发回给客户端进行储存。下次请求时,客户端携带这个 JWT 来与服务器进行交互。由于数字签名的引入,服务端可以检测这个 JWT 是否被篡改。若无篡改,则可直接取出 JWT 中用户名、账号等信息进行下一步判断。

继续阅读JSON Web Token 认证原理

TrueType 与贝塞尔曲线

Photo by Çağdaş Ermiş on Unsplash

TrueType字体中的字符(或字形)轮廓由直线和二次贝塞尔曲线(bézier)片段构成 —— 维基百科。当我们使用 ttf.js 来解析 TTF 字体的时候,可以得到每个文字所包含的轮廓点的信息。这个轮廓点信息由直线和贝塞尔曲线构成。我们可以利用这些轮廓点来生成 SVG 图片。

图中 Q 开头的坐标都是二阶贝塞尔曲线的控制点。通过控制点信息,依据二次贝塞尔曲线公式就可以渲染出轮廓线条。对其进行填充后,就能得到一个实心的字体或是图标。

继续阅读TrueType 与贝塞尔曲线

网络协议栈

Photo by Jonatan Pie on Unsplash

参考前面文章中利用思科模拟器模拟的抓包实验,可以清楚的看到网络协议栈的封装层次与报文结构。这边摘录如下。

数据链路层——数据帧

这里数据长度最大为 1500 字节。这也决定了上层协议所能封装的数据大小。交换机拆解数据帧,根据数据帧上记录的目标 MAC 地址转发给响应的端口。需要指出的是,IEEE 802.1Q 标准在 IEEE 802.3 帧的基础上可以支持 VLAN。这也给交换机了更强大的局域网规划功能。

继续阅读网络协议栈

源码角度理解 CORS

Photo by Museums Victoria on Unsplash

Cross-Origin Resource Sharing (CORS) 也叫做跨域资源共享。浏览器会自动判别一个 HTTP 请求是否跨域,并自动与后端服务协商。由后端服务来决定是否接受此跨域请求。学习 CORS 中协商过程需要两步,一是通过跨域资源共享 CORS 详解MDN 上的手册,二是通过源码。

koa 中有个中间件就叫做 @koa/cors。此中间件根据 CORS 协议规范,创建了一个与浏览器交互的 CORS 处理函数。本文从此中间件入手,结合手册详细讲述 CORS 的后端实现。

继续阅读源码角度理解 CORS

虚拟小机 MariaDB 配置

Photo by K. Mitch Hodge on Unsplash

当虚拟主机内存小于 1G 或者更小时,往往会遇到 MariaDB 数据库挂掉后不能由守护进程再次拉起,后台日志显往往如下所示显示内存不足的提示。这也是 WordPress 在小型虚拟机上部署会遇到最大的问题。

InnoDB: Fatal error: cannot allocate memory for the buffer pool

这种现象在分配虚拟内存之后故障发生率会明显降低,但仍偶发。目前最好的解决方法是在 MariaDB 配置文件中,在字段中 [mysqld] 块中关闭一个模式。

[mysqld]  
performance_schema = off
继续阅读虚拟小机 MariaDB 配置

使用 Node 原生方法处理 HTTP 请求

Photo by frdm . on Unsplash

koa 和 express 两种框架都对原生的 HTTP 进行了封装方便用户快速地开发 Web 应用。但是对于 HTTP 请求体的解析都没有提供内置的处理。

在 Node 中 HTTP 请求对象被分装成了一个流对象,因此需要使用读取流的方法去处理。当然,开源社区为这两种框架都提供了 body-parser 中间件,极大了简化了 HTTP 请求体解析的流程。但是 Node 原生方法是 body-parser 中间件的基础,让我们一起来探索吧。

继续阅读使用 Node 原生方法处理 HTTP 请求