Http填坑

什么是http

很多书或教程中都讲的很明白:http就是一种协议,计算机之间要共同遵守这个协议的规则才能相互之间通信。当然现在不局限于计算机,还包括手机、电视机、冰箱等智能终端。

这个协议使用中的大致流程是这样的:

1、http客户端发起请求,创建端口
比如用手机上的浏览器访问 www.baidu.com ,就创建了一个从浏览器到服务器指定端口的 tcp 连接(默认为 80 端口)

2、http 服务器在指定端口监听客户端的请求

3、一旦收到请求,http 服务器向客户端返回响应和内容
比如 200 的状态码,请求的文件、图片、json数据等。

这么说可能还不是很清楚,只是为了让你有一个大致的思路。

下面就以用 chrome 浏览器访问 www.baidu.com 为例,用通俗易懂的方式具体讲一下 当我们在浏览器地址栏输入网址并敲击回车后发生了什么??

http请求过程

1、chrome 浏览器搜索自身 dns 缓存。
查看 chrome 浏览器 dns 缓存的方法是在地址栏输入:chrome://net-internals/#dns。回车后就会看到类似下面这些信息

这些缓存信息不会保存很长时间,有的教程上说只保留一分钟,自己实验了一下,只有当浏览器关闭后才会清空(还有待考究)。

如果在浏览器自身的 dns 缓存中找不到我们需要的信息,或者信息过期了,就进行下一步

2、搜索操作系统自身的 dns 缓存
查看操作系统 dns 缓存的方法是:开始 > 运行 > 输入cmd > 运行ipconfig/displaydns 命令。就会看到以下信息:

或者查看 dns 缓存文件,保存在 C:\WINDOWS\system32\drivers\etc
下的 hosts.sam

如果没有找到,进行下一步

3、读取本地的 host 文件
host 文件应该都很熟悉,目录为 C:\WINDOWS\system32\drivers\etc 。他的作用也不用多讲了吧!!

如果没有对应的解析,说明本机已经无法搞定这个请求了,我们就要寻求帮助了,,具体找谁,请往下看。。

4、浏览器发起一个 dns 的系统调用
浏览器以系统的名义向本地宽带运营商的 dns 服务器发起一个域名解析的请求。具体是这样的:

1) 运营商服务器查找自身缓存,找到则返回,没有找到则进行下一步

浏览器: 老大哥,www.baidu.com 的 ip 地址是多少啊?
运营商dns服务器: 你先等会啊,我给你找一下。

2) 运营商服务器向 根域名服务器 发起一个域名解析请求

运营商 dns 服务器: hey,哥们,www.baidu.com 的 ip 地址是多少啊?
根域名服务器: 我怎么知道啊,我只知道 .com 域的 ip 地址,你去问一下它吧!

全球共有 13 台根逻辑域名服务器。这 13 台逻辑根域名服务器中名字分别为 “A” 至 “M”,真实的根服务器在 2014 年 1 月 25 日的数据为 386 台,分布于全球各大洲。根域名服务器中虽然没有每个域名的具体信息,但储存了负责每个域(如.com, .cn, .ren, .top等)的解析的域名服务器的地址信息。

详细信息请点击:根域名服务器 – 百度百科

3) 运营商 dns 服务器向 .com域 服务器发起一个域名解析请求

运营商 dns 服务器: hey,哥们,www.baidu.com 的 ip 地址是多少啊?
.com域 服务器: 我怎么知道啊,我只知道 baidu.com 的 ip 地址,你去问它吧!

4) 运营商 dns 服务器向 baidu.com域 的 dns 服务器发起一个域名解析请求

运营商 dns 服务器: hey,哥们,www.baidu.com 的 ip 地址是多少啊?
baidu.com域 服务器: 我擦,果然在我这。兄弟辛苦了,拿去吧!

这个 baidu.com 域 服务器是你的域名注册商提供的,比如万网等

5) 运营商服务器拿到了 www.baidu.com 的 IP 地址后,将其返回给我们的操作系统内核,同时缓存起来。

6) 内核在把这个结果返回给浏览器。

5、 浏览器拿到域名的 ip 地址后,发起经典的 HTTP “三次握手”。
浏览器拿着这个 IP 地址向 服务器的web程序 发起一个 tcp 连接请求,这个连接请求经过层层的路由设备到达 服务器端 后通过网卡进入内核的 tcp/ip 协议栈,还有可能要经过防火墙,最终这个tcp/ip 请求就建立起来了。

那么 三次握手 干了啥呢?

客户端: hey,哥们,你能听到我说话吗?
服务器端: 兄弟,我能听到,咱唠唠。
客户端: 好的,咱开始唠吧!

三次握手 – 百度百科

很蛋疼有没有,,但三次握手就是这样的。

6、tcp/ip 连接建立起来后,浏览器就可以向服务器发送 HTTP 请求了,比如说使用 get 方式请求一个域名。

7、服务器收到这个请求后,根据路径参数,再经过后端的一些处理,把结果返回给浏览器,这样我们就得到了该域名对应的整个页面的代码或者其他的数据。

8、浏览器拿到代码后,经过解析、渲染等,我们就看到了这个页面。
值得说的是,页面中的每一个 css 、js、图片等静态资源都需要一个 HTTP 请求。都需要上面的 七个步骤。

以上观点属个人粗浅的理解,如有错误请指出。。