要想打造互联网师姐的通天塔,只教给一台机器做什么是不够的,我们需要学会教给一大片机器做什么,这就需要网络协议。只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。
那么什么是网络协议呢?
我们通过一个简单的例子来说一说~
我们想在网上买个东西,常规的做法就是打开浏览器,输入购物网站的网址,浏览器就会给我们显示购物网站的页面。
而浏览器之所以能够为我们展示这个页面,是因为它收到了一段来自HTTP协议的发来的东西,以网易考拉为例,格式如下图所示:
1我们常用的网络协议有哪些?
接下来我们用双十一下单的过程来了解一下,在互联网世界的运行过程中,都是用了哪些协议。
首先我们在浏览器中输入了https://www.kaola.com,这是一个URL。
浏览器只知道名字是www.kaola.com,但不知道具体地点,所以不知道该如何访问。于是它打开地址簿去找。可以使用一般的地址簿协议DNS去查找,也可以使用另一种更加精准的地址簿查找协议HTTPDNS。
无论用哪一种方法,最终都会得到这个地址:106.114.138.24,它是IP地址。IP地址是互联网世界的门牌号。
OK,我们知道了目标的地址啦,拿到地址之后下一步就是打包我们要邮寄的东西~
对于普通的浏览请求,往往会使用HTTP协议,但对于购物的请求,往往需要加密传输,因而会使用HTTPS协议。无论是什么协议,里面都会写明“你要买什么和买多少”。
DNS、HTTP、HTTPS所在的层我们称为应用层。
如上图所示,最下面的框框是我们原始的信息,再往上一层是经过应用层封装的包~
经过应用层封装后,浏览器会将应用层的包交给下一层去完成,这个“交给”的过程通过socket编程来实现。
下一层是传输层。传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。对于支付来说,往往使用TCP协议。
所谓的面向连接就是,TCP会保证这个包能到达目的地,如果不能到达,就会重新发送,直到到达。
TCP协议里面有两个端口,一个是浏览器监听的端口,一个电商的服务器监听的端口。操作系统往往通过端口来判断它接收的包应该传给哪个进程。
经过传输层封装的包:
传输层封装好后,浏览器会将包交给网络层。网络层的协议是IP协议,在IP协议中会有源IP地址,即浏览器所在机器的IP地址和目标IP的地址(电商网站所在服务器的IP地址)。
经过网络层封装的包:
操作系统已经知道目标IP的地址,他就开始想着怎么拿着这个门牌号去找到目标机器,首先显然我们的目标机器是外地的。(从门牌号就可以看出来,电商网站不在本地机器上)
既然要去外地,就要经过一个地方叫做网关。
操作系统在启动的时候,就会被DHCP协议配置IP地址,以及默认的网关的IP地址192.168.1.1。
操作系统如何将IP地址发给网关呢?
既然都是一个地方的,问一声不就行了嘛~于是操作系统喊了声:“谁是192.168.1.1呀?”
“是我是我,我在这儿呢,六号楼一单元111室!”
这个本地地址就是MAC地址,而操作系统喊的那一声就是ARP协议。
OK,此时的包包又被MAC层封装了:
网卡将包发了出去,这个包里面是有MAC地址的,因此它顺利的到达了网关。
网关收到包后,会根据自己的只是判断下一步该怎么走。网关往往是一个路由器,到某个IP地址该怎么走,这个叫做路由表。
路由器有点像玄奘取经路过的一个个国家的一个个城关,每个城关都连着两个国家,每个国家都相当于一个局域网,每个国家的内部,都可以使用本地的地址MAC进行通信。
一旦跨越城关,就要拿出IP头来,里面写着贫僧来自东土大唐(源IP地址),欲往西天拜佛求经(目标IP地址)。下一步该怎么走呐?
城关都知道这些信息哒,因为两个临近的城关肯定会常常沟通。到哪里该怎么走,这种沟通的协议称为路由协议,常用的有OSPF和BGP。
对啦,在城关之间走用的都是当地的MAC地址~
就这样一路走着,一路问着,到达了最后一个城关,这个城关的人知道网络包要去往什么地方,最后,我们就拿到了一个目标的MAC地址,网络包过关后,通过这个MAC地址就能找到目标服务器了。
目标服务器发现MAC地址对上了,就将MAC头取下来,发送给操作系统的网络层。网络层发现IP也对上了,就取下了IP头。IP头里头会写上一层封装的是TCP协议,然后将其交给传输层,即TCP层。在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包并不是说这次下单请求的结果(比如购物是否成功、扣了多少钱),而仅仅是TCP层的一个说明,就是TCP层收到啦!这个回复会沿着刚才来的方向走回去,报个平安。
如果发送端浏览器那边过了一段时间还是没有收到这报平安的回复包,那么发送端的TCP层会重新发送这个包,过程还是和刚才一样,直到收到平安到达的信息。
这个重复的过程并不是说我们要重新在浏览器上下一次单,无需这样,下单只需一次就够了,只是TCP层在不断的重试。除非TCP这一层出现了问题,比如说连接断了,才轮到浏览器的应用层重新发送下单请求。
当网络包成功到达TCP层之后,TCP头中有目标端口号,通过这个端口号可以找到电商网站的进程正在监听这个端口号,假设一个Tomcat,将这个包发给电商网站。
电商网站的进程得到HTTP请求的内容,知道了要买什么东西,买多少。
往往一个电商网站最初接待请求的这个Tomcat只是个接待员,负责统筹处理这个事情,而不是所有事情都自己做。例如这个接待员会告诉专门管理订单的进程登记一下要买某个商品,要买多少个,然后告诉管理库存的进程,库存要减少多少,然后再告诉支付的进程,应付多少钱,etc.
告诉相关进程这些信息往往通过RPC调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互联的问题,会有RPC框架统一处理。RPC框架有很多种,有基于HTTP协议放在HTTP的报文里面的,有直接封装在TCP报文里面的。
当这些所有部门都处理完毕之后,就会回复一个HTTPS的包,告知用户下单成功。这个HTTPS的包会像来的时候一样,经过千难万险到达我们的个人电脑,最终进入浏览器,显示支付成功。
哇~原来我们购买一件东西的过程是如此的千辛万苦,瞬间觉得我们的网络真的好了不得呀!
2小结
一个简简单单的下单过程,中间要牵扯到这么多协议,而管理一大片机器,更是一件特别有技术含量的事情。除此之外,最近比较火的云计算、容器、微服务等技术也都需要借助各种协议,来达成大规模机器之间的合作。
刚刚的例子只是给了我们一个大体的框架,有很多协议在这个例子中还没有提到,很多细节都省略了,后面我们会一点一点去还原它们~
下图是我们后面要学习的协议们:
网友评论