网络流是什么?为何网络流中须要存在缓存数据?为何PF中要采用缓存网络数据的机制?带着这几个疑问,让咱们好好详细的了解一下在网络数据交互中咱们容易忽视以及薄弱的一块。该部分为PF现有的网络流模型,可是在这里只讲解最本质的概念,而没有详细说明代码,若是有兴趣的不妨先看了这部分再去看下代码,一切或许会豁然开朗。html
若是你不知道计算机中流数据模型的定义,那么你就能够试想一下河流,有着固定起点和终点的河流。将流水从某一个地方送向另外一个地方的通道,咱们现实中通常叫作渠道,这种渠道在计算机之间就是网络,而其中的流水便称之为网络流,其实同其余的数据流并无什么本质上的区别。与现实中的河流不同的,就是通常河流只有一个方向,可是网络中流向能够是从起点到终点,也能够从终点向起点,是一个双方向的流。经过下图,咱们看下网络流简单的模式:c++
缓存的概念是相对于网络流的,若是是单纯的网络流,是不须要任何的缓存数据。在咱们创建一个链接,打开了双方之间的双通道的时候,咱们就能够向对方传输/接收数据。那么咱们为何会依赖它,若是没有这步不是更简洁么?的确增长这个机制会使咱们的代码看起来复杂,可是复杂和简单是想依赖的,有些时候为了简单咱们须要复杂。那这又是为何呢?下面一步步慢慢讲解。git
这并非一个新的事物,如今已经普遍的被运用在各类应用中,这就是为何有些人常常说net buffer。c/c++的朋友们应该很了解,这里的buffer让咱们容易联想到内存,而这里的缓存当前也就是内存,在其余脚本中咱们每每用到temp的机制,这些一样的也是内存的机制。网络流缓存就是基于内存的一段反复可被利用的数据,也能够说是一段专为处理网络流服务的内存。github
头位置用来记录当前发送/读取到的数据位置,当数据发送/读取的时候该位置向后移动(如同算术右移)。缓存
数据位置用来记录当前接收/写入的数据位置,当数据的接收/写入的时候该位置向后移动(如同算术右移)。网络
空闲数据段,指的是这段数据出于空闲的状态,在有网络数据的接收和写入的时候能够利用的内存段。并发
有效数据段,指的是当前这段数据已被占用,与空闲数据相对。咱们发送和读取的数据,必须是有效的数据。性能
下图中橙色的部分为有效数据,白色为空闲数据,在这里咱们展现的是输出流的内存缓存状态。对应输出流的状态基本一致,只不过将这里的写入换成接收,将发送换成读取。加密
1)最初始的时候,整个内存为空白的状态,此时头位置和内容位置重叠,当写入数据后内容位置向后移动spa
2)内存中有了有效数据后,咱们就能够将有效数据经过套接字发送出去,这个时候头位置向后移动(第一个框为头位置,第二个为内容位置)
3)接着第2步,咱们这个时候若是再向内存中写入一段数据,则内容位置继续向后移动(第一个框为头位置,第二个为内容位置)
4)接着第3步,咱们这个时候若是向内存中读取一段数据并发送,则头位置继续向后移动(第一个框为头位置,第二个为内容位置)
5)在第4步后,没有写入新的数据,咱们接着发送内存中的有效数据,直到头位置和内容位置重叠,这个时候整个缓存都为空闲状态(第一个框为头位置,第二个为内容位置)
6)通过屡次写的操做后,可能咱们的内容位置已经超出了整个空闲内存的大小,这个时候咱们就须要重复使用前面的内存了(第一个框为内容位置,第二个为头位置)
一是为了不频繁的操做套接字接口形成性能上的问题;二是为了方便控制处理网络数据,如数据加密压缩,咱们每每都放在缓存中,当咱们从里面读取和写入的时候不须要特殊的去处理它。
开篇语
咱们没有大神,只有解决问题的人。
咱们没有强悍的技术,只有一颗向往简单的心。
咱们没有惊人的理论,只有一堆难以想象的妄想。
咱们不须要复杂,只须要够简洁。
咱们不须要固定的思惟,只须要你能想获得。
核心成员资格需求
一、精通或熟练掌握一门语言
二、可以接受和听从谷歌C++代码风格
三、灵活而大胆的思考问题
四、可以在规定时间段内完成本身分配的模块(能够灵活调度)
五、有坚持不懈的动力(很重要)
核心成员项目优点
一、无限制的使用商业版到本身的项目中,若是是别的项目则须要和全部成员商量
二、在过程当中,你能够获得飞通常的技术提升
三、商业版若是有盈利核心成员的利益将会最大
名额有限,若是你们想加入的话,请发送一段本身熟悉的语言利用plain framework(简称PF)风格的代码到邮箱viticm.ti@gmail.com,咱们将尽快的在15年前肯定人选,由于商业版的计划从15年1月份开始。
PF托管地址
https://github.com/viticm/plainframework1
PF安装教程
http://www.cnblogs.com/lianyue/p/3974342.html
PF交流QQ群
348477824