初学者如何理解网络协议编程
网络协议是什么?协议分层是怎么回事?什么是协议的实现?服务器
回想当年初识网络协议,被一张网络层次模型图中的“物理层、数据链路层、网络层、传输层……”搞得云里雾里。花了很长时间才搞明白网络协议大概是怎么回事,甚至己经作出了几个网络程序,但仍感受对网络协议的本质认识还不够清楚。网络
一直在思考这些问题,忽然有一天,我发现我对网络协议的认识已经变得明朗。直到今天,我心血来潮写下这篇文章,但愿对初学网络编程的朋友有所帮助。数据结构
第一部分 学习
1、网络协议通俗地讲就是网络上两台计算机之间通讯所要遵照的共同标准。spa
这么讲仍是不够通俗易懂,因此咱们能够打个比方:.net
有两我的,一个中国人,一个法国人,以下:计算机网络
(用英语交流)翻译
中国人------------------------------------法国人blog
(讲中文) (讲法语)
[会英语] [会英语]
<英语协议> <英语协议>
这两我的要想交流,必须讲一门双方都懂的语言。若是你们都不会讲对方的民族语言,那么能够选择双方都懂的第三方的语言来交流,好比“讲英语”。那么这时候“英语”实际上就成为一种“网络协议”。
把网络协议比作通用语言只是一种形象比喻,实际上协议自己比天然语言要简单的多,可是却比天然语言更严谨。协议规定了一种交流信息的格式或者说规范,好比:字符“LOVE”表示什么意思,第2个字节表示什么含义等……只要你们都按一样的规范来表达本身的意思,对方就能“听懂”你的意思。
同一种“规范”遵照的人多了,就成为一种事实上的“标准”。好比TCP/IP协议就成为了一种最流行的网络协议。
2、协议的实现
协议自己并非一种软件,它只是一种通信标准,但协议最终要由软件来实现。网络协议的实现就是在不一样的软件和硬件环境下,执行可运行于该种环境的“协议”翻译程序。这些程序可能在WINDOWS下,也可能在UNIX下,也可能运行于一台我的电脑,也可能运行于一台服务器,也可能在你的手机中,这些程序可能都不同,但却都会翻译同一种网络协议,好比(TCP/IP)协议。就如上图中的翻译都懂“英语”同样。
实现网络协议,听起来就象是给全部接入网络的设备配备了一个“通用语言翻译器”,这些翻译都懂通用语言“英语”,同时也懂得本国语言,这样就能实现不一样国家不一样环境的人接入同一个网络并进行交流了。
那么,能否选择“中文”做为网络协议呢?固然能够,但前提是你们都愿意遵照你的标准,都愿意说中文。实际上,“中文”也是一种网络协议,但它只是属于中国人的网络协议。
3、协议的分层
协议分层仅仅是为了技术上的便利所作的人为划分,并不是是协议天生必备的。
仍以上图为例,咱们再也不考虑中国人或是法国人,只考虑协议自己。
我用英语说:“How are you.” 不必定表示“你好!”,咱们能够事先约定,这句话表示“再看一遍”的意思。这就象是所谓的江湖“黑话”,或叫“专业术语”。实际上,这时咱们本身制定了一个新的通讯标准,一个新的“高层协议”己经诞生了。这个协议在“英语”的基础上,再制定本身的通讯标准,这种新的通讯标准就是基于“英语”这种“底层协议”的“高层协议”,咱们能够把这种协议取名为“讲课协议”。
之后你还能够在“讲课协议”之上创建“讲网络通讯课程的协议”等更高级的协议。
第二部分
再对比计算机网络:有以IP协议为基础的TCP协议,以TCP协议为基础的HTTP协议,以TCP协议为基础的FTP协议等。这里HTTP和FTP是同一层次的两种不一样协议。
以下图:
高层3:HTTP协议、FTP协议 (应用层)
中层2:TCP协议、UDP协议 (网络层
底层1:IP协议 (传输层)
咱们一般把上图中的底层1和中层2合在一块儿称为TCP/IP协议。因此,协议并不必定非要分层,有时候一种协议是几层协议的一个结合,事实上,协议分层并非必须的。
那么有没有比“英语”更底层的协议呢?固然有。但通常咱们不必把“英语”协议再分层。如今为了讲解的须要,我把“英语”这种协议人为再分一下,英语由“单词”构成,单词不考虑语法问题。“单词”就是比“英语”低一级的协议。“单词”又由“字母”构成,字母不考虑组合成词的问题,因此26个英文“字母”就成为比“单词”更低一级的协议。
现实意义:中国人和法国人通常都认识英文字母,法文字母跟英文字母有不少都相同,但咱们从小认字母当拼音,人家认来组单词。因此能够说,在字母这一层协议上,中国人和法国人是能够交流的,换个说法:中国人写的字母法国人也认识。可是,这没有太多实际意义。因此才须要更高一级的“英语”协议来支持。
一样道理,上图中“底层1:IP协议”如下还有更底层的协议。“高层3:HTTP”协议以上还能够有更高层的应用协议。咱们能够任意一层协议为基础制订本身的更高一层的协议。
好比:咱们能够以字母这一层为基础,从新创立一种新的语言。也能够以IP协议为基础,制定本身的传输协议。
不一样的设备能够安装不一样的协议,识别不一样层次的协议。
好比:
一、能够安排一我的,只要能识别字母“a、b、c……”就成。这是最低层协议的实现。
二、再安排一我的,可以识别字母组成的单词,并删除错误单词。这就是第二层协议的实现。
三、再安排一我的,可以识别单词组成的句子,并理解句子。这就是第三层协议
四、再安排一我的,这我的可以翻译英语“黑话”,这个就最第四层协议了
五、还能够安排更高层的人,可以把黑话中隐藏的更专业的意思解读出来
根据须要,你能够随时发明本身的协议,若是这种协议高效易用,被大众所认同,那就成为了一种流行标准。
说到底:协议是人规定的一套通讯规范,因此任何人均可以规定本身的协议,只要通讯的双方可以共同遵照,你就实现了你的协议。
事实上协议自己是能够无所谓分层的概念,分层只是为了方便人们处理复杂的协议而人为作出的划分。
因此,初学者请不要网络协议深遂的面孔吓倒,更不要被网络分层的假相所迷惑。你只要认清了网络协议的本质,大胆得去实践,你彻底能够创造出属于你本身的网络协议。
旧的协议日益成熟,新的协议层出不穷,正是那些敢于创新的开拓者们创新了突飞猛进的网络世界。向发明网络协议的创新者们致敬!
以我本身的经历:网络通讯技术初学者接解到的第一本网络教程,应该首先避免过多技术层次的东西,少用专业术语,最好能经过接近生活实际的例子,将网络技术的基本原理解释清楚。我认为初学者越早搞懂网络协议的本质,学习后续网络课程就会越容易。
后记:
从事软件开发多年,最先接触网络协议是在20年前,那个时候没有老师教,彻底靠啃教材自学。固然,教材的做者就是个人老师。但是这些教材无一例外上来就是专业术语、技术性太强。什么协议标准,协议分层,什么数据结构,让初学计算机没几年的我云里雾里。花了很长时间也没把网络协议这东西搞清楚,网络编程因而成为令我感到“难”的一件事情。
事实上,大概不少人都认为网络编程是很“难”的。的确,当我弄清楚网络协议和网络编程是怎么回事之后,反而更加深入得理解了网络编程的难度。不过回过头来看一看,若是当年能有遇到一本深刻浅出的教材帮我很快理解网络协议的本质,若是这本书能让我感受网络协议很简单,那么我学习的速度和效率将会高得多。
以上只是本身一些我的经验,跟你们交流,有不足之处,欢迎批评指正!谢谢。
参考:http://blog.csdn.net/fyl_077/article/details/17557853