1.为什么要有网络协议?
现在,上网成了我们使用手机电脑的首要需求。但是我们编写关于网络的程序的时候出现了一堆莫名其妙的东西,IP,端口,套接字。为什么要有这些东西我们才能让我们编写的安卓程序,或者服务器程序通信呢?
所谓通信就是传输数据,拿最简单的例子来说。QQ登录程序。在我们看来QQ登录是个很简单的过程,我们只需要从用户那里得到账号密码,再将账号密码发给服务器,服务器检索数据库中有没有这个账户,以及密码是不是对的,再给客户端程序返回一个True或者Flase就可以了。但是其中有一个很大的问题。
在计算机中,所有的数据都是用0和1来表示的。所以数据传输遇到的第一个问题就是,我们怎么看这些0和1的组合。如果你写过跟网络有关的程序,你可能知道,我们一般传输的是一组字符串格式的数据流。在Java中char字符占16位,而在c语言和c++中char字符是只占8位的。
这就是说,如果我们安卓的客户端用的是Java编写的程序,它把数据传给c语言我们可能就不能识别传输的是什么了,因为Java中一个字符是用16个0或1的组合表示,而服务器的c程序是用8个0或1组合表示。Java里面的1个字符我们在c语言中可能识别成两个。
这个问题就相当于,你说汉语但你不会说英语,而我说英语,但我不会说汉语,所以我们就不能交流一样。
网络协议就相当于给我们之间找了一个翻译,它由我们两个商量着决定,yes表示‘是’,no表示‘不是’,当我们之间有了这个翻译之后我们就可以开始通信了。这个问题就是网络传输中应用层要解决的问题。
现在你看应用层之类的名词可能很陌生,不容易理解,就暂时先记住,计算机网络中的概念挺多的,先记住,知道他是做什么的,时间长了就习惯了。
然而,我们在传输过程中遇到的问题还有很多,为了把这些问题有条理的分类解决,我们给计算机网络协议分了一个层次,这就是我们说的TCP/IP的四层结构。
2.TCP/IP分层
现在就开始说实际的问题。其实网络传输和我们熟悉的物流是一样的道理。首先我要给你寄东西,第一个需要的就是路。
所以TCP/IP协议族规定的第一层是链路层,到底是用汽车给你送货还是用飞机还是轮船,对应到网络中就是,我是用电话线给你传数据,还是光纤,或者是无线。然后这些方式他对应的接口是什么,这个接口你可以理解为插座,如果你注意过的话,你肯定能发现,网线的接口和电话线的接口是不一样的。以前没有光纤入户时,我们直接用电话线接猫也是可以上网的,那时候叫拨号上网,现在用无线网卡插电脑上也是可以上网的。不同的方式我们上的是同样的网络。链路层就是规定了这些不同的传输媒质的物理接口细节。我们可以把这一层的作用想象为他在修路。
第二层是网络层。第一层把路修好了,我们要寄东西,还需要选择走哪一条路。网络层做的就是这个工作。网络世界中的路四通八达,我们可以认为每一个路由器都是一个路口,而且这个路口可能不止是十字路口,有可能连在这个路口上的路有几十上百条。那么我们把我们的包裹(数据)送到路由器中,我选哪一条路才能让我的包裹送到你的手里。而网络层就是解决了这个问题。
第三层是运输层。现在路选好了,我们现在要真正开始发包裹了。我不可能自己亲手带着包裹给你。我也进不到网络中去。所以我得找个物流公司帮我来做。物流公司做的第一件事就是打包。怎么打包才能方便传输,用盒子装还是用袋子装。我们发包裹也有两种情况我只把包裹发给你,但是包裹里面的东西并不值钱,所以我发给你就懒得管了,至于你收的到收不到,我都不想浪费时间去理会,我还有好多事情做。这种方式发数据叫做UDP,人们把这种传输方式称作面向无连接的服务。另一种包裹比较值钱,所以我寄给你了之后我必须要知道你是不是收到了包裹,然后我就会要求快递小哥把签有你名字的单子交给我,我要确定你收到了包裹,类似于这种数据传输的方式,我们把它叫做TCP,中文名字是传输控制协议,TCP提供面向连接的服务。
第四层是应用层。这一层的功能就好像我在淘宝上买裤子,我只用关心店家给我寄的是裤子而不是衬衫就行了,至于他怎么给我寄的过程我并不用理会。因为下面三层都给我做好了。放在程序里面就是我只需要考虑我使用http协议的时候我需要传输的网页是什么,使用ftp的时候我需要传输的文件是什么。或者自己写用于自己的服务的时候,我传什么数据是什么意思就够了。
TCP/IP的每一层对于上一层是透明的,只用给上一层提供接口使用就可以了。数据是在同一层之间传输的。意思就是我在写应用层的程序的时候并不用考虑运输层或者网络层链路层具体怎么传数据的,在两个我只需要使用下层提供的接口函数然后考虑同一层之间通信的内容就可以了,就好像下一层不存在一样,这就是透明的意思。
TCP/IP协议族是一组不同的协议组合在一起构成的协议族,通常称该协议族为TCP/IP.
分层是TCP/IP的结构,具体每一层的内容我会在后面慢慢讲清楚。这些概念的东西比较枯燥,但是是一个基础,让你更好的理解为什么要那样实现程序的基础。学习这些概念的时候最好想着为什么要这些协议,这些协议是为了解决什么问题,这样理解的会更加深刻一些。