本文为初见,Netplus快速开始之PingPong Example系列第一篇
[备注:通信是一个很大的话题,为了理解的直观性,以及严谨性,此通信专指TCP/IP通迅]
1. 网络中信息传递的基本问题
以IP:Port为ID的机器驻立于互联网之中,我们把这些机器统称服务器,或网络节点,它们是通信的主体。
- 机器与机器如果要传递信息,它们先要建立连接
- 已经建立连接的机器之间,可以互相传递消息
你是一个 ?但我坚持要为你单独开这一章,因为你值得!
2. 什么是信息,何为传递
还记得我们的基本问题吗?即,建立连接,传递信息。按字面意思进行理解,也大概能懂,但那始终是个模糊的概念,我觉得很有必要在这里进一步的聊一聊,我就斗胆来讲讲,讲得不好的地方,恳请指正。
2.1 信息
何谓信息,信息一词,中文里面又叫消息,英文为information。
我们来看看维基百科里面关于information一词是怎么说的:
Information can be thought of as the resolution of uncertainty; it is that which answers the question of "What an entity is" and thus defines both its essence and the nature of its characteristics
不好理解,好像又能理解 ,是不是有点玄,是的,信息本来面目如此(啊哈,又见信息)。
我来试图翻译一下(说人话):信息是用来描述我们这个世界的,它帮助我们把抽象的想象与具体的世界联系起来,比如看到桌子,我们知道这叫table、看到我们过去的照片、我们能回忆起一些过去的点滴、甚至,看到大海,能让我想起你。桌子,照片,大海都是具体的,但是table、回忆片段、以及脑中的你,这些都是抽象的东西,这是深深地存储在大脑里面,记忆中的东西,用手抓不住,眼睛看不到,但是,我们知道,它存在,它是信息。
信息存储在大脑里面,人死,尘归尘,土归土,信息归零。
不行啊,你欠我的钱还没还呢,还有,你快告诉我到底是哪家姑娘,怎么能归零!!!
后来,我们结绳计数,山洞里雕刻星空,竹简上记录地貌风情,烽火急前方军报,执纸笔共邀明月,旅行者更是携带来自地球的问候,正脱离太阳系,朝着银心前进。社会一直在进步,当信息的载体从大脑变成万物的时候,信息本身也终于进入了这个世界,它终于变成了我们想要的模样,我们能看到它,能触摸它,我死后,它不再归零。
网在,Netplus在,我在,究竟是哪家姑娘,只需去看看我曾留下的信息。
信息的形态也一直在演变,最初的想象力,后来的各色符号,再到文字,至网络时代,在经历无数先驱的奋斗之后,我们将文字变成01,终又将01变成文字,变成声音,图形,动画,变成万物,变成你。
什么是信息?现在你明白了吗?
信息即万物,信息即01,信息即我对你的思念,I love you 就是一条信息。01之下的世界是怎么回事,01往上又是什么,这里可以聊的东西太多,太多,我都想说与你听,但是,我们暂时止步于I love you吧,以后,我们有的是时间,到那时,再次让我引领你进入新的世界。
现在,我们知道什么是信息了,它在网络世界又具有什么形态呢?这当然与传递的方式有关,纸笔时代,我们将文字写在纸上,我们看到的是笔墨,是横竖撇点折,我们事先约定好,写成什么样,就读作什么字,什么样的字对应什么样的物象,这是一种事先协定,我们通过制定标准去达成共识,基于此共识去理解纸上奥义。今天,在网络时代,我们把这种共同的事先规定叫协议。
在协议的指引下,我们将光电信号变成01,将01变成文字,变成声音,变成图形,变成一切我们想要的。
现在是不是对信息的理解又加深了呢?回顾一下,再放飞一下思维。受我文字的鼓舞,你大脑通过生物放电产生的刺激信号,正在你的神经网络传递,啊,信息,你大脑可能突然自动冒出这二个字,是的,那信号正是信息,大脑不由自主,无时无刻地进行信息的处理和传递。
你将发现,信息无处不在,协议不处不在,好一个巧夺天工的世界,好一个精妙绝伦的你。
2.2 传递
关于传递,我想先致敬一下我们伟大的先驱
通迅的基本问题是,在一点精确地或近似地复现在另一点所选取的迅息。这些迅息往往都带有意义。
----克劳德 香农 《通信的数学理论》(1948)
在这里(我们指tcp/ip通迅),传递是指将一个信息从一台机器传递到另外一台机器上面,我们保证最终收到的信息与发出来的原始信息没有两样。
关于信息,我们在上一节已聊过,我们知道在网络时代,它即是01,通过协议,我们可以把文字变成01序列,我们也可以将01序列还原成文字。
在tcp/ip网络编程的世界里面,我们传递的最小单元是1byte(备注:在这里,1个byte == 8bit == 8个01位,但这不是此文要聊的),一个或更多的byte单元连在一起成为byte序列,即bytes,我们通过调用系统函数read从对端节点接收bytes,通过调用系统函数write将需要发送的bytes传递给对端。
因此,在tcp/ip网络编程里面,信息的形态是bytes,记住这个词,bytes。
传递和接收"I love you"这条信息,我们终于能有一个可描述的具体过程如下:
- 发送端,通过协议,将"I love you"变成bytes(注:这里的协议即ASCII)。
- 发送端,调用write函数,将bytes发送至目标,即write(bytes)。
- 接收端,调用read函数,将收到的bytes读取出来,即read(bytes)。
- 接收端,通过协议,复原成"I love you"。
至此,传递信息完,我们实现了从一台机器将"I love you"在另一台机器上完美复现。
任何复杂的信息,都可通过此四个步骤进行传递,只不过因协议的复杂程度不同,具体编程的工作量不同。大部分的场景下,我们需要将多个协议叠加使用,若把消息比做产品,协议即是流水线上的某一道工序,各种工序依次对商品进行初装,加工,包装,运输,最终投递到终端消费者,在Netplus对消息的处理,亦按此流程设计,这个流水线叫Pipeline,后面我们将详细介绍它。
2.3 连接
有没有想过,一定要先建立连接,才可以收发数据?
从收发数据的角度来看,不建立连接当然也可以。只不过,使用不当的话,效率就会极低,造成资源浪费,无连接的数据收发也有其适用场景,然,大部分的场景,都是依赖于连接的,这里指的连接,当然是tcp连接了,那么tcp建立连接的时候到底干了什么呢?
以人与人的对话为例,这是一个多方参与的活动,1对1是其最简单一种形景,自己与自己说话,这叫自言自语。当人与人之间对话的时候,我们要注意语速,音量,句子长度,听者位置,等等,每一个因素都会影响对话的效果,听者是否能听明白,听明白后是否能及时反应过来,若听者同一时间与多个人进行聊天,情况将变得更加复杂,听者可能听明白了,但因信息过载而导致大脑处理不过来,以至于她来不及反应,或反应过来了,但是她来不及回复你,最坏的情况下,她根本听不明白你说的是什么东西,因为同一时间跟他说话的人太多了,造成了噪音污染,最后,实在无法忍受,选择把自己关起来,拒绝所有对话,这特么显然是当机了,当机当然是一种非常不好的体验。这些情况,我们都知道,但是我们一般不会去注意到这些,因为这都已经是我们习已为常的生活场景,我们从生下来就在学习它,所有的一切,我们的大脑,我们的身体都以一种非常自然的姿态在帮助我们,使对话更有效。
电脑与电脑的之间的对话,与之类似,为确保高效可靠的进行对话,为确保不要当机,我们要注意信息发送的频度,单个信息的长度限制 ,累积未被取走的消息长度总和,需要为单个发送的信息进行编号 ,以确保按发送的顺序进行信息复现,需要重发,以应对网络数据出错或丢失,以及其它为使对话更高效而进行协商的参数,等等。
这种电脑与电脑之间对话所需要用到的资源,它的状态及相关参数,我们混总在一起,把它叫做连接,在建立tcp连接的时候,我们要做如下事情:
- 向操作系统申请相关资源,创建连接对象(TCB以及相关对象),初始化对象默认状态。
- 向操作系统申请用于监听数据的端口。
- 新连接在协商建立的阶段,我们还需设置与此连接相关的初始参数,如rcvwnd,sndwnd,mss,initial sequence number, 其它额外特性,如sack,等。
在Netplus里面,连接即Channel,它是我们与操作系统交互的接口合集,我们将在基本概念一节介绍它。
下文,我们将聊一下Netplus试图解决什么问题
写代码的冰冰