Http请求及响应全过程
程序员文章站
2022-07-07 15:12:14
...
HTTP请求及响应过程
一、Http请求及响应过程总体介绍
第一步:解析域名,即解析输入框中的请求地址;
第二步:发起三次握手;
第三步:建立TCP连接后,发起Http请求;
第四步:服务器端接收请求并解析,处理请求后响应给客户端
第五步:客户端解析响应页面请求并进行页面渲染
二、Http请求及响应过程步骤解析(以谷歌浏览器为例)
第一步:解析域名
1、首先浏览器搜索自身的DNS缓存,查看缓存中是否有输入框中的请求地址并且缓存未过期,如果存在,则解析完成;否则,则进行下一步操作。
注:查看Chrome浏览器自身的缓存:chrome://net-internals/#dns
2、如果浏览器自身的缓存里面没有找到对应的请求地址,那么浏览器会搜索操作系统自身的DNS缓存。如果找到且缓存信息没有过期,则解析完成;否则进行下一步操作。
注:查看Windows操作系统自身的DNS缓存,可以在命令行下使用 ipconfig /displaydns
3、 如果系统缓存中没有请求地址信息,那么浏览器会尝试读取(Windows)hosts文件(位于C:\Windows\System32\drivers\etc),如果有则解析完成。
4、如果host文件中也没有请求地址的信息,浏览器会会向本地配置的首选DNS服务器发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。
5、如果上一步失败了,操作系统就会查找NetBIOS name Cache进行解析。如果成功,则解析完成,否则就进行下一步。
6、如果上一步也没有成功,那会查询WINS 服务器(NETBIOS名称和IP地址对应的服务器)
7、如果上一步也没有查询成功,那么客户端就要进行广播查找。
8、 如果上一步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)
9、如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。
第二步:发起三次握手
获取到解析后的域名后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。连接请求通过路由设备进入到网卡,然后是进入到内核的TCP/IP协议栈(有可能要经过Netfilter防火墙),最终到达WEB程序,建立了TCP/IP的连接。
三次握手协议如图所示:
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
第三步:发起HTTP请求
在三次握手成功之后,客户端向服务器发起HTTP请求。
HTTP请求报文内容如下:
请求行:如 GET /index.html HTTP/1.1 (请求的方法 请求的URL 请求所使用的协议/请求协议的版本)
请求头:User-Agent Host等成对出现的值
请求体
空行
消息体
第四步:服务器端处理请求并响应
服务器解析客户端发起的HTTP请求并处理,以报文的形式响应给客户端。
1)HTTP响应报文内容如下:
状态行:如 HTTP/1.1 200 OK (请求所使用的协议/请求协议的版本 响应状态 状态说明)
响应头:如 Content-Type:text/json;charset=UTF-8 ...
空行
消息体
2)响应状态码及其含义
1xx: 信息性状态码 100, 101
2xx: 成功状态码 200:OK
3xx: 重定向状态码
301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;
302: 临时重定向,显式重定向, Location响应首部的值为新的URL
304:Not Modified 未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可。
4xx: 客户端错误状态码
404: Not Found 请求的URL资源并不存在
5xx: 服务器端错误状态码
500: Internal Server Error 服务器内部错误
502: Bad Gateway 前面代理服务器联系不到后端的服务器时出现
504:Gateway Timeout 这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应
第五步:客户端解析响应页面并渲染
浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但显示的顺序并不一定是代码里面的顺序。浏览器再一次请求静态资源时,那么浏览器会直接读取本地的该资源的缓存文件。
详细的浏览器工作原理请参考:http://kb.cnblogs.com/page/129756/
附图:Chrome浏览器下,Http请求内容
本篇博客参考自 http://blog.51cto.com/linux5588/1351007
一、Http请求及响应过程总体介绍
第一步:解析域名,即解析输入框中的请求地址;
第二步:发起三次握手;
第三步:建立TCP连接后,发起Http请求;
第四步:服务器端接收请求并解析,处理请求后响应给客户端
第五步:客户端解析响应页面请求并进行页面渲染
二、Http请求及响应过程步骤解析(以谷歌浏览器为例)
第一步:解析域名
1、首先浏览器搜索自身的DNS缓存,查看缓存中是否有输入框中的请求地址并且缓存未过期,如果存在,则解析完成;否则,则进行下一步操作。
注:查看Chrome浏览器自身的缓存:chrome://net-internals/#dns
2、如果浏览器自身的缓存里面没有找到对应的请求地址,那么浏览器会搜索操作系统自身的DNS缓存。如果找到且缓存信息没有过期,则解析完成;否则进行下一步操作。
注:查看Windows操作系统自身的DNS缓存,可以在命令行下使用 ipconfig /displaydns
3、 如果系统缓存中没有请求地址信息,那么浏览器会尝试读取(Windows)hosts文件(位于C:\Windows\System32\drivers\etc),如果有则解析完成。
4、如果host文件中也没有请求地址的信息,浏览器会会向本地配置的首选DNS服务器发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。
5、如果上一步失败了,操作系统就会查找NetBIOS name Cache进行解析。如果成功,则解析完成,否则就进行下一步。
6、如果上一步也没有成功,那会查询WINS 服务器(NETBIOS名称和IP地址对应的服务器)
7、如果上一步也没有查询成功,那么客户端就要进行广播查找。
8、 如果上一步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)
9、如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。
第二步:发起三次握手
获取到解析后的域名后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。连接请求通过路由设备进入到网卡,然后是进入到内核的TCP/IP协议栈(有可能要经过Netfilter防火墙),最终到达WEB程序,建立了TCP/IP的连接。
三次握手协议如图所示:
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
第三步:发起HTTP请求
在三次握手成功之后,客户端向服务器发起HTTP请求。
HTTP请求报文内容如下:
请求行:如 GET /index.html HTTP/1.1 (请求的方法 请求的URL 请求所使用的协议/请求协议的版本)
请求头:User-Agent Host等成对出现的值
请求体
空行
消息体
第四步:服务器端处理请求并响应
服务器解析客户端发起的HTTP请求并处理,以报文的形式响应给客户端。
1)HTTP响应报文内容如下:
状态行:如 HTTP/1.1 200 OK (请求所使用的协议/请求协议的版本 响应状态 状态说明)
响应头:如 Content-Type:text/json;charset=UTF-8 ...
空行
消息体
2)响应状态码及其含义
1xx: 信息性状态码 100, 101
2xx: 成功状态码 200:OK
3xx: 重定向状态码
301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;
302: 临时重定向,显式重定向, Location响应首部的值为新的URL
304:Not Modified 未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可。
4xx: 客户端错误状态码
404: Not Found 请求的URL资源并不存在
5xx: 服务器端错误状态码
500: Internal Server Error 服务器内部错误
502: Bad Gateway 前面代理服务器联系不到后端的服务器时出现
504:Gateway Timeout 这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应
第五步:客户端解析响应页面并渲染
浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但显示的顺序并不一定是代码里面的顺序。浏览器再一次请求静态资源时,那么浏览器会直接读取本地的该资源的缓存文件。
详细的浏览器工作原理请参考:http://kb.cnblogs.com/page/129756/
附图:Chrome浏览器下,Http请求内容
本篇博客参考自 http://blog.51cto.com/linux5588/1351007
上一篇: Servlet生命周期(图解)
下一篇: Hack技术总结(二)之浏览器私有前缀