原文:https://heyingye.github.io/2018/02/27/Internet%E9%80%9A%E4%BF%A1%EF%BC%88%E4%B8%80%EF%BC%89/
概述
网络通信的过程十分复杂,本文只简单分析网络通信的过程以及相关的协议概述,从最常见的例子:”从浏览器输入url至呈现整个页面”。分析整个网络通信的过程,希望能对网络通信有个总体的认识,网络通信的整体认识对我们理解网络有非常大的帮助。由于文章过长,我将分为多个章节描述,如若描述有误,敬请指正。
在分析网络通信之前,我们不妨好好思考一下这个问题?
当我们在浏览器输入www.qq.com,点击Enter,至页面呈现,其中发生了什么?
这涉及到整个Internet通信的过程,涉及的范围非常大,我粗略归结为以下几个过程:
- DNS域名解析
- 确定接收方MAC地址
- TCP连接
- HTTP请求
- 浏览器渲染页面
在分析该过程之前,我们先了解一些网络的基本知识以及相关协议。
网络模型
网络可分为七层,四层或者五层模型,这里我们将网络分为五层,网络五层模型,如下图:
自上而下,分别为应用层,传输层,网络层,链接层和实体层(物理层),每层都有相关的协议和功能,并且都需要下一层的支持。他们的功能及依赖关系,我们可以大概了解,如图:
应用层HTTP协议的通信请求,规定应用程序的数据格式,基于传输层TCP协议的TCP连接
传输层的TCP连接,负责传输数据包,基于网络层的IP协议分配IP地址连通网络和链接层的MAC地址(网卡地址)确认接收主机
网络层的数据发送,基于链接层将实体层发出的电信号分组并解读,并通过ARP协议利用IP地址获取到MAC地址(网卡地址)
实体层(物理层),就是电脑间链接的介质,比如光纤,电缆等等,主要负责传送0和1的电信号
由此,我们不难得出Internet通信的前提是必须知道双方的IP地址和MAC地址(网卡地址,以太网的物理地址),IP地址负责确定接收方的子网,MAC地址负责确定接收方的主机地址。
MAC地址
以太网规定,连入网络的所有设备,都必须要有一块网卡,因为数据包必须从一块网卡传送到另一块网卡,而网卡的地址,就是数据包发送和接收的地址,这就叫做MAC地址。
每块网卡都拥有一个全世界唯一的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。如图:
IP地址
Internet通信的前提是必须知道双方的IP地址和MAC地址,己方的MAC地址是必然知道的,但是IP地址是否知道却分为两种情况:
- 静态IP地址
- 动态IP地址
静态IP地址
静态IP地址需要用户自己专门设置,如图
IP地址 – 互联网的协议地址
子网掩码 – 用于判断两个IP地址是否在同一个子网络中
默认网关 – 连接两个不同的子网络,转换协议
DNS服务器 – 用于DNS解析,将域名解析为IP地址
以上的四个参数缺一不可,使用手动设置的参数,每次计算机开机都可以使用相同的IP地址(如图使用的固定IP地址是:192.168.0.198)上网,所以这种情况被称为:”静态IP地址上网”,但是这样的设置是极少数人会做的,大多数人使用的都是”动态IP地址上网”。
注:通用的公共DNS服务器有Google的8.8.8.8和国内的114.114.114.114,当然也可以使用运营商提供的DNS服务器。
动态IP地址
动态IP地址,是每台计算机默认采用的上网方式,不需要用户手动设置,每次开机会自动分配一个IP地址,如图
动态分配IP地址,会使用到DHCP协议,该协议规定在每个子网络中都会一台计算机负责管理本网络的所有IP地址,该计算机叫做“DHCP服务器”,每台计算机开机时候都会向“DHCP服务器”发送一个“DHCP请求”数据包,申请IP地址和相关的网络参数(子网掩码,默认网关和DNS服务器等等)。但是问题来了。。。
DHCP服务器的MAC地址,IP地址和本机的IP地址都不知道,该如何通信?
DHCP协议对“DHCP请求”的数据包做了特定的规定,发出方发送的DHCP数据包:
发出方本机的MAC地址和本机未知的IP地址为0.0.0.0
由于接收方DHCP服务器的信息都不知道,所以接收方的MAC地址则填写为FF-FF-FF-FF-FF-FF,IP地址填写为255.255.255.255。
该数据包在以太网以广播的方式传输,在同一子网络的每台计算机都会接收到该数据包,并分析数据包的接收方IP地址是否与自己的IP地址相匹配,当DHCP服务器接收到该数据包,并分析到该数据包的发出方IP地址为0.0.0.0,接收方IP地址为255.255.255.255,则会确认该数据包是发送给自己的,接下来就会进行IP地址分配,再响应发送回去一个”DHCP响应”的数据包,新加入的计算机接收到该响应包,就可以确定了本机的IP地址,子网掩码,默认网关和DNS服务器等相关信息,然后就可以上网了。
有了以上的基础知识,我们回到以下这个问题
当我们在浏览器输入www.qq.com,点击Enter,至页面呈现,其中发生了什么?
呈现页面的数据必须通过网络来发送和接收数据,但Internet通信的前提是必须先知道双方的MAC地址和IP地址,本机的MAC地址是必然知道的,IP地址则可以使用静态和动态IP的方式确定,那么我们只需要确定对方的MAC地址和IP地址即可实现通信。
我们在浏览器输入的是www.qq.com,这是一个域名,域名在互联网中是没有什么意思的,只是为了方便用户记忆理解,但是在互联网中每个域名都可以通过DNS域名解析,解析成一个或者多个IP地址,解析确定对方的IP地址后,可以通过IP地址找到对应的主机,并确认该主机的MAC地址,最后实现通信,首先我们分析DNS域名解析的过程。
DNS域名解析
DNS(Domain Name System 的缩写)域名解析的作用是将域名解析为IP地址,具体过程如图
-
本机DNS解析
浏览器缓存中查找www.qq.com域名解析记录,若浏览器缓存中有www.qq.com域名解析记录,则域名解析完成,返回相应的IP地址,若无,则继续下一步解析
在本机操作系统的DNS缓存和host文件查找www.qq.com域名解析记录;若有,则域名解析完成,返回相应的IP地址;若无,则向本地DNS服务器转发解析请求
-
本地DNS服务器解析
本地DNS服务器的IP地址根据用户的静态IP地址和动态IP地址设置而定,首先客户端向本地DNS服务器(LDNS)发出域名解析请求
本地DNS服务器先在域名解析记录缓存中查找,是否存在www.qq.com域名的解析记录,若存在,则将域名对应的IP地址,域名解析结束;若不存在,则在本地DNS服务器管理的域名内进行DNS解析,查找是否存在www.qq.com域名;若存在,返回IP地址和TTL值(Time to live 的缩写),表示缓存时间,解析结束;若不存在,则向根域名服务器发出解析请求,使用递归查询的方法进行查询
-
根域名服务器解析
- www.qq.com域名真正的全称域名是www.qq.com.root,简写为www.qq.com。因为,根域名.root对于所有域名都是一样的,所以平时是省略的。根域名的下一级,叫做”顶级域名”,例如www.qq.com域名的顶级域名为.com。全球一共有十三组根域名服务器,从A.ROOT-SERVERS.NET一直到M.ROOT-SERVERS.NET。根域名服务器对www.qq.com域名进行解析查询,查找www.qq.com域名的顶级域名服务器.com的IP地址,并返回给本地DNS服务器,本地DNS服务器再向顶级域名服务器.com发出域名解析请求
-
顶级域名服务器解析
- 顶级域名服务器.com对www.qq.com域名进行解析查询,查找www.qq.com域名的次级域名服务器.qq.com的IP地址,并返回给本地DNS服务器,本地DNS服务器再向次级域名服务器.qq.com发出域名解析请求
-
次级域名服务器解析
- 次级域名服务器.qq.com对www.qq.com域名进行解析查询,查找www.qq.com域名的IP地址,并将该IP地址和和TTL值(Time to live 的缩写),表示缓存时间,返回给本地DNS服务器,本地DNS服务器将该结果缓存,再将IP地址返回给客户端,客户端将该解析记录缓存,至此DNS解析结束
DNS优化
由于DNS解析的过程十分复杂费时,所以DNS存在着多级缓存,提取DNS缓存的顺序大概如下:浏览器DNS缓存 – 系统DNS缓存 – 本地DNS服务器缓存 – 根域名服务器缓存 – 顶级域名服务器缓存 – 次级域名服务器缓存,解析记录的缓存时间由解析成功返回的TTL值(Time to live 的缩写)决定。
总结
至此,网络的基础知识和DNS域名解析讲完了,下节继续分析使用IP地址确定MAC地址和TCP连接。