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