我们经常在浏览器中输入网址,然后就得到了想要的页面,可你知道从输入网址开始,直到显示页面的背后,究竟经历了哪些不为人知的过程吗?本文从网络数据传输的层面为大家揭开这一系列神秘的面纱。
场景假设:
我们使用自己的电脑与学校的以太网进行连接,然后访问www.anjuke.com网站。
流程说明:
- 获取客户机IP地址。
- 域名解析
- 地址转换
- 建立连接
- 数据返回
下面就按照上面的流程来讲解数据传输过程。
说明传输过程之前,我们先来简单说一下“五层因特网协议栈”,自上而下分别是:
应用层:应用程序,如浏览器
传输层:如TCP、UDP
网络层:IP
链路层
物理层
数据发送时,会从上到下依次传递,并最终由物理层对外发出,数据接收时相反。
1. 获取客户机IP地址
为什么要获取客户机IP地址?因为电脑想要连接到因特网,就必须要有一个自己的IP地址,否则无法与其他服务提供方进行连接,IP地址可以唯一的标识一台主机,并在不同主机间构建独立连接。
一般像学校、小区等区域都会架设一个局域网,并有一个网关路由器,域内的主机都通过这个网关路由器与外网进行连接。
当域内的主机连接到因特网时,网关路由器为其自动分配一个内网IP,访问网站时,电脑使用这个IP地址与网关路由器(具有外网IP)连接,进而与世界各地的外网主机进行连接。
1.1 内网IP地址分配
内网IP地址的分配是通过DHCP(动态主机配置协议)实现的,DHCP一般实现在网关路由器中,本地主机连接进来时,为其自动分配一个内网IP地址,大致过程如下:
- 本地电脑操作系统生成一个DHCP请求报文,并将这个报文发送出去。
- 网关路由器接收到这个请求,为其分配一个内网IP地址,发送回本地电脑,并记录下这个IP已配分配
这样本地电脑就有了自己的IP地址。
由于在刚开始连接的时候,本地电脑是没有IP地址的,并且也不知道网关路由器的IP地址,那么网关路由器是如何接收到这个请求的呢?
这里需要介绍两个特殊的IP地址,255.255.255.255和0.0.0.0。
本地电脑发送DHCP报文的时候,将DHCP报会被放置到一个具有255.255.255.255的目的地IP地址的IP数据报中,数据报的源地址为0.0.0.0。
255.255.255.255被称为广播IP,局域网内的所有主机都会收到这个请求,当然网关路由器也会受到这个请求,然后处理请求。
至于数据是如何传递到网关路由器,我们稍后再讲。
1.2 内网IP地址到外网IP地址的转换
这里需要提一点,所谓的内网IP一般指IP规范中预留的IP地址,如192.168.\*.\*、10.\*.\*.\*等,这部分IP不会被分配到外网直接使用。
那么就要考虑一个问题了,既然内网IP不是外网直接使用的,当内网主机访问外网其他主机时如何通过这个IP和外网主机进行连接呢?解决方案就是我们要讲的内网IP地址到外网IP地址的转换过程了。
一般网关路由器都实现了一种叫做NAT(网络地址转换)的协议,该协议负责将内网IP地址转换为外网IP地址。
- 内网主机发送一个数据报
- NAT路由器收到该数据报,并为该数据报生成一当前未被使用的新端口号并记录到NAT路由表中,如5001,将源IP地址(内网IP)更换为网关路由器地址(外网IP地址),然后将数据报发送出去。
- 目的地Web服务器接收到数据报,并生成响应报文,报文目的地IP地址为我们的网关路由器IP,目的地端口号为5001。
- 网关路由器接收到数据报后,使用数据报中的目的IP地址和目的地端口号(如5001)到NAT路由表中检索出该内网IP地址,并将数据报的目的IP地址和目的端口号改为该内网主机的IP地址和端口,然后发送
- 内网主机接收到响应报文并处理
2. 域名解析
在上节中我们提到了源IP地址和目的地IP地址的概念,源IP地址很好理解,就是我们自己的主机IP地址,但是目的地IP地址是怎么哪里来的呢?明明我们只是在浏览器种输入了一串网址字符串。这就是我们本节中将要讲的域名解析:如何将一个域名解析为一个IP地址。
2.1 为什么要做域名解析
在因特网中,两台主机之间的指定连接是由IP地址和端口号确定的,这里包括源IP地址+源端口号、目的地IP地址+目的地端口号。虽然我们在浏览器中输入的是网址,但是要促成和目的主机之间的连接,必须要知道网址背后代表的目的主机IP和端口号。
一般来说,提供web网站服务的目的主机应用程序使用的都是80端口,在我们输入网址时如果不指定端口号,默认就会使用80端口。
2.2 域名解析服务(DNS)
一个域名在注册后,如果想要对外提供服务,都需要解析到指定的IP地址,这样其他人想要访问该域名提供的服务时就可以获取到对应的IP地址。
域名解析使用的是DNS服务。
DNS服务是一种层级结构,分为以下几类:
- 根DNS服务器:目前只有13个。
- *域(TLD)服务器:负责*域如com、cn、edu等和所有国家*域如uk、fr、jp等。
- 权威DNS服务器:各大组织机构维护自己提供的公共服务DNS记录,如亚马逊、谷歌等。
另外还有一类称为“本地DNS服务器”,不隶属于DNS服务层次结构,一般由每个ISP(因特网服务提供商)部署,用来做DNS代理,可以缓存域名解析结果,加快解析速度。
域名解析的流程:
- 本地主机首先向本地DNS服务器发起DNS查询请求,请求报文中包含www.anjuke.com。
- 本地DNS服务器将该报文转发到根DNS服务器,跟DNS服务器发现其com前缀,于是返回负责com*域的IP地址列表。
- 本地DNS服务器收到后,再次向这些TLD服务器之一发送查询报文,TLD注意anjuke.com前缀,于是返回负责anjuke.com的权威DNS服务器的IP地址列表。
- 本地DNS服务器收到后,再次向这些权威DNS服务器之一发送查询报文,权威DNS服务器将www.anjuke.com主机名对应的IP地址返回。
- 本地DNS服务器接收到响应的IP地址后将其返回给本地主机,并缓存。
3. 建立连接
当操作系统有了明确的本机IP和目的地IP后,应用程序(浏览器)就可以开始发起与目的地服务器的连接了。
下述过程简化了一些细节,如TCP报文段封装、IP数据报封装、链路层帧封装,感兴趣的可以自己查资料。
- 浏览器向www.anjuke.com服务器发送请求报文,GET或POST等。
- 本地主机建立与服务器的TCP连接,生成TCP套接字。注:三次握手。
- 连接建立成功后,本地主机通过该TCP套接字向服务器发TCP报文段,该TCP套接字的报文段中包含源端口号(本机端口号,一般为随机启用,如65512)和目的地端口号(80端口)以及HTTP请求报文。
- 将该TCP报文放置到具有目的地IP地址的IP数据报中。
- 将该IP数据报放置到具有MAC地址为网关路由器的帧中,并发送
- 网关路由器修改源IP地址和端口号并转发该TCP报文段到www.anjuke.com服务器。
- 服务器收到该TCP报文段,并分解到与80端口相关联的TCP套接字。
- 服务器解析其中的HTTP报文,并生成响应数据。
- 响应数据报文发送到客户端网关路由器。注:发送过程同上述步骤。
- 本地网关路由器接收到IP数据报并修改其中的目的地IP地址和端口为本地主机内网IP地址和端口并发送。
- 本地主机通过TCP套接字接收TCP请求并分解到对应的应用程序(浏览器)。
- 浏览器接收到HTTP响应报文进行展示。
至此,整条链路的数据请求和接收过程就结束了,当然上述过程中还有一些细节和概念没有说明,如:
- TCP连接的关闭
- 链路层的连接(通过MAC地址)
- 子网掩码
大家可以自己查阅相关资料进行了解,这里就不再细说了。
另外补充一点,为什么会有内网和外网的概念,直接为每台主机分配一个唯一的外网IP不是更好吗?还省略了内网IP到外网IP的转换过程。
这里主要是因为IPV4的设计限制,在IPV4中,ip地址的长度为32比特,因此总共有2^32个可能的IP地址,差不多40亿左右,常用点分十进制记法,如121.2.31.89。随着因特网的发展,主机越来越多,IP地址就显得不够用了,所以才有了内网IP的用法,这样在每个局域网内可以*分配内网IP,只要在当前局域网内部不重复即可。