从输入一个网址,到页面加载完毕,这中间发生了很多的事,今天把这部分又好好得学习了一下。
整个流程主要经历以下几步:
1. 域名解析
2. 建立TCP连接
3. 客户端发送HTTP请求
4. 服务端发送HTTP响应
5. 页面加载,关闭连接。
1、域名解析
在访问一个网站时,通常会输入一个网址,这时就需要利用DNS解析得到正确的目的IP地址。
域名解析过程如下:
1、首先查看浏览器缓存是否有域名IP地址映射关系;
2、如果没有,查看本机host文件,看是否有对应缓存;
3、如果没有,则查询本地DNS服务器,一般都是接入的运营商的本地区DNS服务器;
4、如果没有,查看root根服务器,根服务器会告诉你去哪个域服务器去找,比如.com,.cn,.org等等。
5、随后域服务器会告诉你去哪个下一层的服务器寻找,这样,一级一级的就可以找到了。
现在用dig看一下,我的网站的查找过程。
第一个是A记录:
dig +trace hbnnforever.cn
; <<>> DiG 9.16.1-Ubuntu <<>> +trace hbnnforever.cn
;; global options: +cmd
. 3122 IN NS c.root-servers.net.
. 3122 IN NS k.root-servers.net.
. 3122 IN NS a.root-servers.net.
. 3122 IN NS g.root-servers.net.
. 3122 IN NS e.root-servers.net.
. 3122 IN NS d.root-servers.net.
. 3122 IN NS j.root-servers.net.
. 3122 IN NS b.root-servers.net.
. 3122 IN NS l.root-servers.net.
. 3122 IN NS h.root-servers.net.
. 3122 IN NS f.root-servers.net.
. 3122 IN NS m.root-servers.net.
. 3122 IN NS i.root-servers.net.
;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 16 ms
cn. 172800 IN NS ns.cernet.net.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS g.dns.cn.
cn. 172800 IN NS f.dns.cn.
cn. 86400 IN DS 57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn. 86400 IN RRSIG DS 8 1 86400 20201221050000 20201208040000 26116 . Bt0Yf0CeeC/9AafdfSBivhcGMf7k3tbuI92oUQUG1TeNlCItIm3PgniD M+1PGKX4zbneu/B5PMG7X+884UdtYXxbv3K+In0rjs+LJHXZoUWJ37wU cgkfx2C9sTfFMlSCs5Q5cL0uuf1Ts/hryouvyQDQWhd3rh7fYIlUDvMJ 6QQwRvZN4l5plPIrGkFRz+4+8DzbkqHLEdc9fLOV5nRU5VvDOyHIsYMu 2UQRkAKd+t7l2wJBED5Cwqmo/6AcYwBFcKkEZ3uADid0g//G7A5vXN+v fz6/c7mPdEOdfMW0pfo2PcKDrM3Ux8/G1sPjreN6Aw20OXN48dFTyZ1p T+ae4Q==
;; Received 733 bytes from 192.5.5.241#53(f.root-servers.net) in 12 ms
hbnnforever.cn. 86400 IN NS dns2.hichina.com.
hbnnforever.cn. 86400 IN NS dns1.hichina.com.
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QLMP0QRNQ96G5AFGOPNB7U7IJ4MBP4B NS SOA RRSIG DNSKEY NSEC3PARAM
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN RRSIG NSEC3 8 2 21600 20210106001635 20201206231816 38388 cn. c4eBcYQSzGLGK1s/SbpMwSq1CD2uIQJo/tY+GsY2Q4DL/ZVclo3nwIta qv88EsmSAyyfX+YrZEiXLFWk6Fb/mZH2nkZbo3n0HYWI4Vwzv4Q90RV9 EWPNqXKPGeT45amkSC0sNaSfwkd+dL9x5TGA693PHs7H6mAY29YQi3sK SYA=
G29L1Q5P2FLON5ARBIS332EPQ5E7S24D.cn. 21600 IN NSEC3 1 1 10 AEF123AB G2FC9AFANPVPJQFNHVGRR4M6V3OEDISR CNAME RRSIG
G29L1Q5P2FLON5ARBIS332EPQ5E7S24D.cn. 21600 IN RRSIG NSEC3 8 2 21600 20210105231022 20201206230935 38388 cn. crISjeAV7sXG79IM07f6sXCUh837RvW2Aivq4B1RjVawhbTDkWPS5OzS XlkLM+lPJR1O4ViVjthXboyIzL9F/JdwvmJ5wAgzS56eFgnaYR6GWHkZ wsfM3c+pKp6PyFKo8K772dBGh6N5m0+8tnXHaHxwWaBtJt/BbOU/9ggz A08=
;; Received 583 bytes from 195.219.8.90#53(f.dns.cn) in 240 ms
hbnnforever.cn. 600 IN A 129.28.184.162
;; Received 59 bytes from 106.11.211.64#53(dns2.hichina.com) in 8 ms
第二个是CNAME记录:
dig +trace hbnnforever.cn
; <<>> DiG 9.16.1-Ubuntu <<>> +trace hbnnforever.cn
;; global options: +cmd
. 3122 IN NS c.root-servers.net.
. 3122 IN NS k.root-servers.net.
. 3122 IN NS a.root-servers.net.
. 3122 IN NS g.root-servers.net.
. 3122 IN NS e.root-servers.net.
. 3122 IN NS d.root-servers.net.
. 3122 IN NS j.root-servers.net.
. 3122 IN NS b.root-servers.net.
. 3122 IN NS l.root-servers.net.
. 3122 IN NS h.root-servers.net.
. 3122 IN NS f.root-servers.net.
. 3122 IN NS m.root-servers.net.
. 3122 IN NS i.root-servers.net.
;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 16 ms
cn. 172800 IN NS ns.cernet.net.
cn. 172800 IN NS b.dns.cn.
cn. 172800 IN NS d.dns.cn.
cn. 172800 IN NS c.dns.cn.
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS a.dns.cn.
cn. 172800 IN NS g.dns.cn.
cn. 172800 IN NS f.dns.cn.
cn. 86400 IN DS 57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn. 86400 IN RRSIG DS 8 1 86400 20201221050000 20201208040000 26116 . Bt0Yf0CeeC/9AafdfSBivhcGMf7k3tbuI92oUQUG1TeNlCItIm3PgniD M+1PGKX4zbneu/B5PMG7X+884UdtYXxbv3K+In0rjs+LJHXZoUWJ37wU cgkfx2C9sTfFMlSCs5Q5cL0uuf1Ts/hryouvyQDQWhd3rh7fYIlUDvMJ 6QQwRvZN4l5plPIrGkFRz+4+8DzbkqHLEdc9fLOV5nRU5VvDOyHIsYMu 2UQRkAKd+t7l2wJBED5Cwqmo/6AcYwBFcKkEZ3uADid0g//G7A5vXN+v fz6/c7mPdEOdfMW0pfo2PcKDrM3Ux8/G1sPjreN6Aw20OXN48dFTyZ1p T+ae4Q==
;; Received 733 bytes from 192.5.5.241#53(f.root-servers.net) in 12 ms
hbnnforever.cn. 86400 IN NS dns2.hichina.com.
hbnnforever.cn. 86400 IN NS dns1.hichina.com.
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QLMP0QRNQ96G5AFGOPNB7U7IJ4MBP4B NS SOA RRSIG DNSKEY NSEC3PARAM
3QDAQA092EE5BELP64A74EBNB8J53D7E.cn. 21600 IN RRSIG NSEC3 8 2 21600 20210106001635 20201206231816 38388 cn. c4eBcYQSzGLGK1s/SbpMwSq1CD2uIQJo/tY+GsY2Q4DL/ZVclo3nwIta qv88EsmSAyyfX+YrZEiXLFWk6Fb/mZH2nkZbo3n0HYWI4Vwzv4Q90RV9 EWPNqXKPGeT45amkSC0sNaSfwkd+dL9x5TGA693PHs7H6mAY29YQi3sK SYA=
G29L1Q5P2FLON5ARBIS332EPQ5E7S24D.cn. 21600 IN NSEC3 1 1 10 AEF123AB G2FC9AFANPVPJQFNHVGRR4M6V3OEDISR CNAME RRSIG
G29L1Q5P2FLON5ARBIS332EPQ5E7S24D.cn. 21600 IN RRSIG NSEC3 8 2 21600 20210105231022 20201206230935 38388 cn. crISjeAV7sXG79IM07f6sXCUh837RvW2Aivq4B1RjVawhbTDkWPS5OzS XlkLM+lPJR1O4ViVjthXboyIzL9F/JdwvmJ5wAgzS56eFgnaYR6GWHkZ wsfM3c+pKp6PyFKo8K772dBGh6N5m0+8tnXHaHxwWaBtJt/BbOU/9ggz A08=
;; Received 583 bytes from 195.219.8.90#53(f.dns.cn) in 240 ms
hbnnforever.cn. 600 IN A 129.28.184.162
;; Received 59 bytes from 106.11.211.64#53(dns2.hichina.com) in 8 ms
2、建立TCP连接
的
当获取到IP地址后,就开始与服务器建立TCP连接,默认的端口为80。
##3、客户端发送HTTP请求
当建立成功之后,客户端会向服务器发送HTTP请求信息,请求相应的资源。
一个完整的HTTP请求信息格式:请求行,请求头,空行和请求数据
1)请求行
请求行的格式为:请求方法 请求URL HTTP版本 中间用空格分开。
如: GET /article HTTP/1.1
HTTP规范定义了8种可能的请求方法:(最常见的就是 GET 和 POST 两种方法)
- GET 检索URI中标识资源的一个简单请求
- HEAD 与GET方法相同,服务器只返回状态行和头标,并不返回请求文档
- POST 服务器接受被写入客户端输出流中的数据的请求
- PUT 服务器保存请求数据作为指定URI新内容的请求
- DELETE 服务器删除URI中命名的资源的请求
- OPTIONS 关于服务器支持的请求方法信息的请求
- TRACE Web服务器反馈Http请求和其头标的请求
- CONNECT 已文档化但当前未实现的一个方法,预留做隧道处理
2)请求头:
Host:www.baidu.com. 服务端的主机名
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4
(KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 客户端浏览器信息
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
客户端能接收的mine类型
Accept-Encoding:gzip,deflate,sdcn 是否支持流压缩
Accept-Charset:UTF-8,*;q=0.5 客户端字符编码集
一个完整的HTTP请求信息包:
Get /url/ HTTP/1.1
User-Agent:Mozilla/5.0 (Windows NT 6.1) chrome/22.0.1229.94 Safari/537.4
Accept: text/html; */*
Referer: http://www.XXX.com/a.html
4、服务器发送HTTP响应包
服务器端接受请求,处理数据后生成响应返回数据到客户端 。
一个响应包的格式为:状态行 响应头 空行或数据。
1)状态行
状态行由三个标记组成:HTTP版本、响应代码和响应描述。
HTTP1.1 100 continue ------继续追加后继内容
HTTP/1.1 200 OK --------一切正常
响应代码:
1. 1xx:请求收到,继续处理
2. 2xx:操作成功收到,分析、接受 200成功返回
3. 3XX 重定向 - 要完成请求必须进行更进一步的处理
4. 4XX 客户端错误 - 请求有语法错误或请求无法实现
5. 5XX 服务器端错误 - 服务器未能实现合法的请求
2)响应头:
和请求头差不多
3)数据
数据内容
完整例子:
01 HTTP/1.1 200 OK
02 Server: Microsoft-IIS/5.1
03 X-Powered-By: ASP.NET
04 Date: Sun, 06 Jul 2008 11:01:21 GMT
05 Content-Type: text/html
06 Accept-Ranges: bytes
07 Last-Modified: Wed, 02 Jul 2008 01:01:26 GMT
08 ETag: “0f71527dfdbc81:ade”
09 Content-Length: 46
5、页面加载
浏览器先解析状态行,然后解析响应头,最后解析body数据。
当解析到HTML DOM里面的图片连接,css脚本和js脚本的链接,
浏览器就会自动发起一个请求静态资源的HTTP请求,获取相对应的静态资源,
然后浏览器就会渲染出来,最终将所有资源整合、渲染。
在HTTP1.0中,解析后会关闭连接,在HTTP1.1不会立即关闭TCP连接,它设置了一个Keep-alive。
在下面介绍一下HTTP的无状态和keep-alive的区别:
HTTP协议是无状态的和Connection: keep-alive的区别
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。
从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(面对无连接)。
从HTTP/1.1起,默认都开启了Keep-Alive保持连接特性。
简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭
,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的TCP连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同服务器软件(如Apache)中设置这个时间。
至此一个完整的HTTP请求流程结束了。
|