HTTP请求流程
- 域名解析
- 建立TCP连接(TCP三次握手)
- 浏览器发送HTTP请求
- 服务器响应HTTP请求,浏览器得到响应数据
- 浏览器解析数据,并请求静态资源(css/js等)
- 浏览器渲染页面,展示给用户
1.域名解析:获取域名对应的IP地址
- 浏览器先搜索自身的DNS缓存,如果没有找到,就下一步
- 搜索操作系统的DNS缓存,如果没有找到,就下一步
- 操作系统将域名发送给本地区域名服务器解析(Local DNS),例如学校DNS服务器
- 如果没有找到,LDNS会直接到RootServer域名服务器请求解析
- 根域名服务器返回给本地域名服务器一个所 查询域的主域名服务器(gTLdServer)地址
- 本地域名服务器(Local DNS Server) 再向上-步返回的gTLD服务器发送请求
- 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务
- NameServer域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个TTl值返回给DNS Server域名服务器
- 返回该域名对应的IP和TTL值,Local DNS Server 会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制
- 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,城解析过程结束
2.TCP连接
3.发送HTTP请求报文(HTTP请求)
-
请求报文组成
-
请求行
-
请求方法(get/post…)
-
URL
-
组成:<协议>://<主机>:<端口>/<路径>
端口和路径有事可以省略(HTTP默认端口号是80)
-
-
HTTP协议版本
-
-
请求头部
- 请求报文的一些附加信息
-
空行
- 表示请求头部结束
-
请求数据
- 一般在post方法中使用,因为get方法会将请求数据放在url中
-
完整的一个请求报文
POST /index.php HTTP/1.1 请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
空行
username=aa&password=1234 请求数据
-
4.服务器响应请求,浏览器得到HTML代码
-
响应报文
-
状态行
- 协议版本
- 状态码
- 状态码描述
-
响应头
-
空行
-
响应数据
-
完整响应
HTTP/1.1 200 OK 状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT 响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
空行
响应数据HTTP响应示例<title> Hello HTTP!
5.浏览器解析HTML代码,请求静态资源(css/js等)
- 当浏览器得到HTML后,并未断开TCP连接,因为有些静态资源要向服务器重新请求,此时Cinnection:keep-alive
6.关闭TCP连接,浏览器渲染页面给用户
附加
网络模型 作用 对应的网络协议 应用层 是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务 HTTP TFTP FTP NFS SMTP 表示层 可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取 Telnet SNMP 会话层 通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求 SMTP DNS 传输层 定义了一些传输数据的协议和端口号(WWW端口80等) TCP UDP 网络层 在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择 IP ICMP ARP 数据链路层 定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输 FDDI PDN SLIP PPP 物理层 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流 IEEE 802.1A IEEE 802.2到IEEE 802.11
-