在 OpenSSL中一共有两种类型的BIO,一种是源/目的类型的,另一种是过滤类型的,其实可以统一到一种类型,那就是统一都是过滤类型,这种说法的前提 是一个古老的概念,早在unix时代,人们通常将程序看做一个过滤器,简单的给它一个输入就会得到一个输出,具体会得到什么输出就看程序员的意图了,那个 时候,程序没有现在如此庞大,也没有如此之多的智能和行为逻辑,就是简单的过滤功能,unix提出的一切皆文件的伟大思想就是在这个古老而又淳朴的概念之 上提出来的,unix将设备抽象成文件,将显示器和键盘抽象成文件,按照程序即过滤器的思想是十分合理的,程序的输入和输出两端都连接一个文件,数据从文 件中来经过过滤器到文件中去,显示器是文件,磁盘是文件,键盘也是文件,甚至内存也是文件,想想标准输入和标准输出的概念就会很容易理解了,程序是过滤 器,被过滤的东西的载体就是文件,unix靠这个思想而稳定地运行到了今天。如此一来,考虑源/目的类型的BIO,其实也是一种过滤类型的BIO,所谓过 滤器就是一个输入加上过滤逻辑得到一个输出,源/目的类型的BIO的输入就是源端,过滤逻辑就是直通,而输出就是目的端,过滤逻辑不在乎输出结构有没有使 用者以及使用者是谁,它只要将输出放到一个地方就可以。理解是可以按照统一的方式去理解,但是事实上openssl还是区分了两种类型的BIO,在过滤类 型的BIO数据结构中,一般都提供了一个缓冲区,比如加密/解密BIO,对于write,就是加密数据,然后放到缓冲区中,就到此为止了吗?不,因为过滤 数据只不过是IO的一个阶段而已,openssl的BIO接口提供了BIO链机制,并且规定一个过滤类型的BIO必须是BIO链的一个中间环节,这就是 说,最终必须将这些数据写入一个源/目的的BIO,因为在openssl中的BIO机制中,只有源/目的类型的BIO才是真正的数据载体,而过滤类型的 BIO仅仅提供数据缓冲区作为中间数据载体,这在下面的代码体现明显:
static int buffer_write(BIO *b, const char *in, int inl)
{