本文摘自刘超的《趣谈网络协议》第一讲:为什么要学习网络协议
《圣经》中有一个通天塔的故事,大致是说,上帝为了阻止人类联合起来,就让人类说不同的语言。人类无法沟通,达不成“协议”,通天塔的计划就失败了。
后来出现了,一种“程序猿”的物种,敲着一种这个群体通用的语言,连接着全世界所有的人,打造着互联网世界的通天塔。
但是,要想打造互联网世界的通天塔,只教给一台机器做什么是不够的,需要教会一大片机器做什么,这就需要网络协议来进行。只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。
语法就是这一段内容要符合一定的规则和格式。
语意就是这一段内容要代表特定含义。
顺序就是先干啥,后干啥。
当你在浏览器中输入购物网站网址,回车后,浏览器就会出现购物网站缤纷多彩的商品页面,这个过程浏览器是如何做到的呢?它之所以能够显示缤纷多彩的页面,是因为它收到了一段来自http协议的“东西”。格式如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2018 16:50:26 GMT
Content-Type: text/html;charset=UTF-8
Content-Language: zh-CN
<!DOCTYPE html>
<html>
<head>
<base href="https://pages.kaola.com/" />
<meta charset="utf-8"/> <title> 网易考拉 3 周年主会场 </title>
上面这段http协议它符合协议三要素吗,答案肯定是呀。
首先,符合语法,只要按照上面的格式,浏览器才会认识,可简单分为:先状态,在首部,最后是内容。
其次,符合语义,就是要按照约定的意思来。例如,状态200,表示的意思是页面成功返回。例如,状态404,表示的意思是请求的资源不存在。
最后,符合顺序,输入网址,回车发送一个http请求,然后才有上面那一串http响应。
接下来我们就看看一个购物过程都用到了哪些网络协议。
DNS/HTTPDNS:你在浏览器中输入https//www.kaola.com,这是一个URL。对于浏览器来说他只知道名字是“www.kaola.com”,但是不知道具体的地点,也就不直到到怎么去访问。浏览器于是就去域名相关的y一般的地址薄–DNS,或者更加精准的地址薄–HTTPDNS去查询该名称具体对应的地址。
无论使用那种方式去查找,最终都会得到一个相同的地址:106.114.138.24,也就是常说的IP地址。这个IP地址就是互联网世界中的“门牌号”。
HTTP/HTTPS:知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用HTTP协议;但是对于购物的请求,往往需要进行加密传输,因而会使用HTTPS协议。无论什么协议,里面都会写明“你要买什么,买多少”。
DNS、HTTP、HTTPS所在的层我们称为应用层。经过封装之后,浏览器会将应用层的包交给下一层去完成,通过socket编程来实现,下一层就是传输层。
UDP/TCP:UDP/TCP都属于传输层协议,UDP是一种无连接的协议,TCP是一种面向连接的协议。对于支付来讲,往往使用TCP协议。所谓面向连接就是,TCP会保证请求的包会到达目的地,如果不能到达,就会重新发送(浏览器/用户是不感知该行为),直到包到达为止。
TCP协议里面会有两个端口,一个是浏览器监听的端口,一个是目标电商的服务器监听的端口。操作系统往往通过端口来判断,他得到的包应该给那个进程。
IP:传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层协议是IP协议,在IP协议里面会有源IP地址(浏览器所在机器的IP地址)和目标IP地址(电商服务器的IP地址)。
操作系统已经知道了目标IP地址,操作系统往往会进行判断,该IP地址是否是本地地址。(这里只说外地IP地址)操作系统知道要访问外地的IP地址就会去网关哪里问一下。而操作系统启动的时候,就会被DHCP协议配置IP协议,以及默认的网关的IP地址,譬如:192.168.1.1。
ARP:操作系统怎么将IP地址发给网关呢?在本地通信基本靠吼,于是操作系统大吼一声。谁是192.168.1.1啊?网关会回答它,我就是,我的本地址是多少,回答给大吼的人,这个本地址就是(MAC地址)。而大吼的那一声就是ARP协议。
于是操作系统将IP包交给下一层,也就是MAC层。网卡再将包发出去。由于这个包里面是包含MAC地址的,因此能够达到网关。
网关收到包之后,会根据自己的知识,判断下一步应该怎么走,网关往往是一个路由器,到某个IP地址怎么走,这个叫作路由表。
路由器有点像玄奘西行路过的一个个国家的城关。每个城关连接着两个国家,每个国家相当于一个居于网,每个国家内部,都可以使用本地的地址MAC进行通信。
一旦跨过城关,就需要拿出IP头来,里面写着贫僧来自东土大唐(源IP地址),欲往西天拜佛求经(目标IP地址)。路过宝地,借宿一晚,明日启程,请问接下来该怎么走?
OSPF/BGP:城关往往是知道这些“知识”的,因为城关和临近的城关也会经常沟通。到哪里应该怎么走,这种沟通的协议称为路由协议,常用的有OSPF和BGP
城关与城关之间是一个国家,当网络包知道下一不去哪个城关,还是要使用国家内部的MAC地址,通过下一个城关的MAC地址,找到下一个城关,然后问下一步怎么走,一直走出最后的一个城关。
最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标IP啊?目标服务器就会回复一个MAC地址。网络包过关后,通过这个MAC地址就能找到目标服务器。
目标服务器发现MAC地址对上了,取下MAC头,发给操作系统的网络层。发现IP地址也对上了,就取下IP头。IP头里会封装的是TCP协议,然后将其交给传输层,即TCP层。
在这一层里,对于收到的每一个包,都会有一个回复说明,说明包收到了。这个回复的包绝非是这次下单请求的结果,例如购物是否成功,扣了多少钱,而仅仅是TCP层的一个说明,即收到请求到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。
如果过一段时间还是没到,发送端的TCP层就会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。这个重试绝非浏览器重新将下单这个动作重新请求一个。对于浏览器来讲,就发送了一次下单请求,TCP会闷头重试。除非TCP这一层出了问题,例如连接断了,才会轮到浏览器的应用层重新发送这个下单请求。
当网络包平安到达TCP层之后,TCP头中有目标端口,通过这个端口号,可以找到电商网站的进程正在监听这个端口,假设Tomcat将这个包发给电商网站。
电商网站的进程得到HTTP请求内容,知道了要买的东西,买多少。往往一个电商网站最初接待请求的这个Tomcat只是个接待员,负责统筹处理这个请求,而不是所有事情都自己做。例如:这个接待员要告诉专门管理订单的进程来做具体的事情,而接待员只做转发任务。
如何告诉相关进程呢?往往通过RPC调用,即远程过程调用的方式来实现。RPC调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互联问题,会由RPC框架统一处理。
当接待员发现相应部门都处理完毕,就回复一个HTTPS包,告知下单成功。这个HTTPS包,会像来的时候一样,经过千难万险到达你的电脑,最终进入浏览器,显示成功。
以上就是浏览器的一次下单过程。