有一定网络知识的同学都知道,网络通信模型分为四层(但学校课本一般以七层讲解,为细分的情形),四层自上而下分别是应用层、传输层、网络层、数据链路层。
虽然《图解HTTP》一书主要讲的是应用层协议即HTTP协议相关的内容。但是在该书第一章,作者稍微铺垫了一些Web发展的历史,而后着重地将下层协议的内容、分层的意义、上下层的关系进行了系统的概述。头脑中有大致的分层概念有助于我们更好地理解HTTP协议。
从图中可以直观看出,客户端在发送数据的时候,除了我们需要传递的信息本身之外,还需经重重打包、添加一些辅助传递的内容。这个过程就像我们上课传小纸条时,需要将之折叠起来,并注明传给谁一样。
在互联网的“蛮荒”时代,各种各样的协议层出不穷,人们大都为了解决某一特定需求而定制一套通信协议。没有一个大家都接受的方案使得人们各自为政,难通有无,极大地阻碍了互联网的发展。
后来,人们根据大致的应用场景分类,抽象出通信四层模型。四层之间的数据传递的接口是固定的。也就是说,相邻的任意两层之间的数据传输并不需要关心对方内部具体采用什么协议来实现,而只是关心自己给出的数据能不能对接得上接口,也就是两层之间数据传输的格式。
这样有一个十分明显的好处就是人们设计协议的时候不再是蒙着头干自己的,而是面向接口来做设计,只要自己设计的协议能满足层级间的格式要求,那么就能做到协议满足自己需求的情形下还能保证协议的通用性,分层的概念提出后,互联网发展迎来了一个飞速发展期。
人们也在互联网生产中有了以下的经典实践:
应用层
应用层决定了向用户提供应用服务时通信的活动。
对于访问网页这种数据传输量小、内容少、但是并发量又要求大的应用场景,我们就有了HTTP(Hyper Text Transfer Protocol,超文本传输协议)协议(1.0)。该协议被设计成通信双方不保持连接且不保存双方信息的形式,使得网站服务器能够为尽可能多的客户端服务。此处特指了HTTP1.0协议是因为它虽然适应“古代”网站内容形式多为文字,图片都较少的情形,但是显然不适用于如今内容丰富的互联网情形了,此为后话。
传输文件,我们有FTP(文件传输协议,File Transfer Protocol)协议,不过这个协议提供的种种功能都能被HTTP协议所替换,因此,FTP协议被用在公司内部搭建文件服务器的场景很多,其余的应用场景倒是越来越少了。
传输层
传输层主要处理两台主机间的数据传输方式,是传一个数据包裹吆喝一声,还是只负责传出包裹,而不去管包裹是否到达由其中该层的协议自己定义。打游戏、听音乐,对数据完整性要求极高。注意这里的完整是由于数据在实际传输过程中是切分后编好顺序分次传输的,这样做的实际意义是提高传输效率与最小代价地重传(本书原文是“更好地传输”),但它是怎么做到的此处限于篇幅不再展开,此处只需要明白一个较大数据是拆分传输的。
那么这就要求一个协议来做数据完整性控制,它就是TCP(传输控制协议,Transmission Control Protocol)协议。它建立连接需要三次握手,断开连接需要四次挥手,到达一个数据包裹要求到达确认(吆喝一声)、包裹丢失又会要求重传、为了适应网络的不稳定情形又要有拥塞控制、同时服务器又需要维护连接 ...,这些都耗费珍贵的CPU资源。
不仅如此,“后发先至”(由下层IP协议的分组转发与路由导致的)这种暂时无法处理的数据以及数据量输送过多而无法及时处理的数据不得不先缓存而这又得耗费内存资源。但正因为TCP如此严格的设计,TCP对数据完整性方面的保证是极为优秀的,尤其是在网络情况较为糟糕的情况下TCP协议就更能发挥它的作用。
而视频通话、视频直播,对即时性要求极高,不要求数据完整性的,我们又有UDP(User Datagram Protocol,用户数据报协议)协议提升性能,这就对应只负责传出包裹而不理会是否到达。
它干脆就抛弃TCP协议采用的较为复杂的拥塞控制、缓存设计,抛弃TCP协议中强调的对数据是否完整到达的严格校验。它不对数据完整性做保证,这就使得为了传输数据而额外发送的数据包裹大大减少、也就不需要向TCP协议那样调用太多CPU资源与内存资源,甚至还节约了时间,达到提高性能的目的。
而且对于这个协议,大家在进行视频通话的时候可以直观的感受:假如某个时刻网络状态不好画面卡住了,在过了三四秒后网络状态转好时,一般应用处理的方式都是直接跳过这中间三四秒发送过来的内容(不论残缺与否)不予显示,直接显示对方当前这一刻发送过来的画面。
值得一提的是,随着现如今宽带硬件水平的不断提升,网络丢包情况越来越少见,TCP协议做的数据完整性校验由于太过复杂而被越来越多的人质疑是否是进一步提升效率的阻碍。
网络层
此层主要做的工作是在庞大的网络中,找到源主机与目标主机的发送数据的线路。由于IP(Internet Protocol,互联网协议)协议出色的寻址、路由的能力,在互联网高度发展的今天,在这一层反而出现了一统河山的情形,更何况IP协议的全名就叫“Internet protocol(互联网协议)”。
数据链路层
对于数据链路层,基于现在广泛使用的组网方式,则是以太网、令牌环网等局域网为主要情形,其中以太网甚至成了局域网的代名词,除此之外,所有与底层硬件相关的包括网卡、光纤等都属于数据链路层的范畴。
到这里为止,四层的大致内容就介绍完毕,由于水平实在有限,本文肯定是做不到原文那么言简意赅的,但是,我也在试图用一些通俗的例子讲明白一些概念。希望能使你得到一些好的启发,如果能帮助你在脑海中搭建出一个数据流转的大致形态那就再好不过了。
除了上述的分层网络,还有一些与这个分层网络密切相关的概念,就比如TCP协议是怎么来适应网络状态的,又是怎么来控制拥塞的,拆分传输的数据包裹传丢了接收方是怎么判定要求重传的,重传后之前判定丢失的包裹也到达了怎么办,由于IP路由选路不同导致的“后发先至”的情形又该如何是好 ... 诸如此类,实在是拉住了一条知识点的藤蔓能把整个一串地瓜给牵出来,这些都需要你带着疑问一一去书中找答案了。
书中没有费太多的笔墨在这些与HTTP协议不太相关的部分(毕竟此书是讲HTTP的嘛),而是着重介绍了ARP协议是怎么完成IP地址到MAC地址的映射的(我的另一篇文章有介绍哟)、IP协议是怎么选路的、TCP协议的三次握手与DNS域名解析服务。
除DNS以外,其他三个不在应用层,本文也不展开讲。此处仅稍微一提DNS域名服务。
DNS(Domain Name System),域名系统,它负责完成IP地址与字符的映射,类似于39.106.56.xx 映射为 www.abc.com,这么做是为了人类记忆的便捷。毕竟记住后面有规律的网址比记住签名的IP容易得多了。但是计算机恰恰相反,计算机它理解前面的IP地址反而更简单,所以每当我们人类使用网址访问目标网站的时候,都会先一步地查询域名解析服务器,得到该网址的IP地址,而后的通信实际上是基于这个IP地址来的。
需要说明的是,实际上的域名解析比上述更为复杂,它有一个优先级,首先计算机会查本地硬盘的HOSTS文件夹,本地硬盘查不到才会将查询请求提交本地区域名服务器否则返回,本地区在它的服务器中找,找得到返回,找不到就将请求转发到更高级的服务器中,返回最终结果。
该书第一章最后一节讲了URI与URL的内容
URI(Uniform Resource Identifier)统一资源标识符,它用来标识互联网上的所有资源,包括文档、音视频、文字等单一或多个的集合。
URL(Uniform Resource Locator)统一资源定位符,它仅仅用于记录网络资源的位置。
URI是用来标记资源的,URL是用来找到资源的,URL是URI的子集,他们二者十分相像,但我们不必过分纠结于二者的区别,理解他们的作用与应用场景即可。
本文到这里就结束了,如果想了解其他的内容,可以查看我的其他文档,感谢阅读。