这篇文章简单描述一下HTTP请求的过程。
当我们在浏览器输入网址之后都发生了什么呢?
以访问http://www.jianshu.com/users/b1a98bffbff5/latest_articles这个网址为例。
大概的过程分为DNS域名解析
-> TCP三次握手
-> 发起HTTP请求
-> 服务器响应数据
-> 浏览器解析html代码并再次请求图片,CSS,JS等等
-> 再次得到数据之后渲染页面
一、DNS域名解析
域名对应到主机就是利用DNS这个服务来做到的。
如果找到了,就跳出这一步,如果没找到,就进行下一步,如果到了最后都没找到,就返回404
1.浏览器查询自身DNS缓存
2.查询操作系统DNS缓存
3.查询本机hosts文件
4.查询宽带运营商DNS服务器
5.宽带运营商迭代查询DNS服务器
顺序是 -> / -> com -> jianshu.com
DNS服务器会返回给浏览器一个IP地址,然后进行下一步
二、TCP三次握手
下面是tcp三次握手的过程
![tcp三次握手](http://ohc4a8012.bkt.clouddn.com/tcp.png)
tcp三次握手
其实简单翻译过来就是:
客户:咱们俩聊聊。
服务器: 可以。
客户:好,那开聊吧!
三、发起HTTP请求
TCP三次握手之后已经确定可以可以连接了,然后浏览器就向服务器发起http请求:
HTTP请求头(Request Headers)部分:
GET /users/b1a98bffbff5/latest_articles HTTP/1.1
Host: www.jianshu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: //太长了,删除了
If-None-Match: W/"696182938902d4185e2b3398a08d787d"
四、服务器响应数据
响应头(Response Headers)部分:
HTTP/1.1 200 OK
Server: nginx
Connection: keep-alive
Date: Mon, 28 Nov 2016 03:41:45 GMT
Cache-Control: private, max-age=0
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
响应体就是页面的HTML部分了,然后里面出现的有src之类的属性,浏览器会再次发起请求,服务器再次响应,浏览器得到数据之后就会渲染HTML了
![浏览器再次请求其他文件](http://ohc4a8012.bkt.clouddn.com/brower%20http.png)
浏览器再次请求其他文件
五、浏览器渲染页面
得到数据之后,浏览器按照自己的工作机制,来渲染页面。
这方面的知识可以看这个链接
每一个部分我准备再各写一篇文章详细描述一下这个过程,欢迎持续关注。
参考: