自制 NAT 网关

前面的 Blog 也提到了,DHCP 服务只负责分配 IP,路由器里面 DHCP 服务并不是入网服务,那么真正的入网是哪一部份负责呢?

这里提一个大家都很熟悉的名字:网关。

网关

网关的在 Wiki 定义是:转发其他服务器通信数据的服务器,接受客户端发送来的请求时,它就像自己拥有资源的服务器一样对请求进行处理。

Read More

无损文件压缩

无损压缩(下简称”压缩”)是计算机存储方面很重要的一种课题(至少在过去是),这是一种典型的时间换空间的方案。

过去由于存储介质普遍很贵,所以压缩方式存储文件可以更大化的利用存储介质的空间(就问你有没有见过只有 40G 的 PC 硬盘,想想都可怕)。

压缩,顾名思义就是把大文件的体积变小,让他在存储的时候能够少用一点存储空间,而且压缩后的文件能保证可以反向解算出来并且内容不会变化,但是压缩后的文件不能直接被文件系统识别和读取,需要先对文件进行解压之后才能读取其中内容,解压的时候会消耗一定时间,所以说是时间换空间。

压缩存储其实也就是对文件进行了特殊编码然后存储,今天主要介绍两种压缩编码:哈夫曼编码、LZ77 编码。

Read More

有限集内 MD5/SHA1 可逆吗—— MD5、SHA1 算法

今天讲一讲 hash 算法。

hash 算法不可逆,大家都知道,因为这是一个一对多的问题,一个 MD5/SHA1 值理论上是可以对应多个原始数据的,所以 MD5/SHA1 是无法还原出原始信息的。

但是,如果我指定范围,你能通过 MD5/SHA1 倒推出原始数据吗?

举个例子:定义一个 hash 算法,取值在 255 下的模,这样的 hash 值也是不能直接反推数据的,但是如果我说我数据就是在 1 ~ 255 之间的值,那我给定一个 hash 值,无疑你是能得到原始数据的。

但是 MD5/SHA1 呢?

这里容我先卖个关子,今天主要是先介绍 MD5/SHA1 算法,最后我们会讨论这个问题。

Read More

AVL 树与红黑树

二叉树是一种很经典的数据结构,利用这种结构,我们可以构造出一个快速的数据查询结构,原理就是利用二叉树每个节点都有两个孩子这一性质,我们让每个树节点的左右孩子性质一样,比如左树都比父节点小,右树都比父节点大,这样的结构中我们从根查找一个数据的速度会加快很多,过程就是比当前值大就去右树找,比当前值小就去左树找。这种树我们叫做二叉排序树,它其实就是一个排序好的队列的二分查找过程的具像化结构。

这是一种很理想的数据存储结构,然而当任由数据随意顺序存储和插入的时候,有时候会出现很尴尬的结果:

Read More

排序算法

今天来说点简单的东西,排序算法。

排序问题应该是目前业务场景中出现的比较多的问题,程序员们学习编程算法所接触到第一个比较复杂也比较有用的算法应该就是冒泡排序算法了,所以说排序算法对于程序员们来说是既陌生又熟悉的存在。

很多编程教程中或者算法书中都对排序算法进行过一番介绍,而且对这些算法的性能作出比较,然后使用时间复杂度或者空间复杂度来描述他们的优劣,但是恐怕很多人都没有一个直观感受,但是只通过时间复杂度函数判断这些算法孰优孰劣的,这种做法有时候对一些算法是很不公平的。

Read More

AES 加密

AES 加密是一种对称加密算法,全称为 Advanced Encryption Standard,高级加密标准,在密码学中又称 Rijndael 加密法。它是一种区块加密标准,目前是最流行的一种对称加密算法。该算法为比利时密码学家 Joan Daemen 和 Vincent Rijmen 所设计,结合两位作者的名字,以 Rijndael 为名投稿高级加密标准的甄选流程。

AES 加密流程很简单,整体过程可以用下面这张图表示(点击可查看大图):

AES1

其中,中间的 9/11/13 轮分别是在秘钥长度为 128 bits、192 bits 和 256 bits 时使用的轮数。

图片上很多步骤如果不了解肯定是一脸懵逼,这些步骤都是在 AES 中定义好的一些操作,后面分开来讲一下每一步都要干嘛。

Read More

RSA 加密

今天主要介绍的是 RSA 加密。

RSA 加密是目前世界上最流行的非对称加密,它名字的来源于它的三位父亲:罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman),他们在1977年提出了 RSA 加密并且在1987年7月首次在美国公布,RSA 来源于他们的姓氏开头字母。

Read More

PPPoE 服务器编写

PPPoE(Point-to-Point Protocol Over Ethernet)协议是一个以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。
它是一个链路层协议,如果要想自己实现一个 PPPoE 服务器需要了解链路层编程的相关知识。
网络五层架构中:应用——传输——网络——链路——物理。链路层属于比较靠底层的一层,所以难度还是有的。编程的时候相当于是直接与网卡打交道,编写难度比较高。

Read More

DHCP 服务器编写

DHCP 协议(Dynamic Host Configuration Protocol)是一个网络层协议,主要用于给接入设备分配 IP,是目前所有路由设备中重要的协议之一。

本文主要记录博主以前编写 DHCP 时查询的所有资料和记录编写中遇到的坑,还有编写之后对于 DHCP 整个流程的理解,希望对后来者有些帮助。

Read More