Http请求全过程简述

客户端获取URL - > DNS解析 - > TCP连接 - >发送HTTP请求 - >服务器处理请求 - >返回报文 - >浏览器解析渲染页面 - > TCP断开连接

一、 DNS解析

什么是DNS解析?当用户输入一个网址并按下回车键的时候,浏览器得到了一个域名。而在实际通信过程中,我们需要的是一个IP地址。因此我们需要先把域名转换成相应的IP地址,这个过程称作DNS解析。

浏览器首先搜索浏览器自身缓存的DNS记录。
或许很多人不知道,浏览器自身也带有一层DNS缓存。Chrome 缓存1000条DNS解析结果,缓存时间大概在一分钟左右。

(Chrome浏览器通过输入:chrome://net-internals/#dns 打开DNS缓存页面)

如果浏览器缓存中没有找到需要的记录或记录已经过期,则搜索hosts文件和操作系统缓存。
在Windows操作系统中,可以通过 ipconfig /displaydns 命令查看本机当前的缓存。

通过hosts文件,你可以手动指定一个域名和其对应的IP解析结果,并且该结果一旦被使用,同样会被缓存到操作系统缓存中。

Windows系统的hosts文件在%systemroot%\system32\drivers\etc下,linux系统的hosts文件在/etc/hosts下。

3) 如果在hosts文件和操作系统缓存中没有找到需要的记录或记录已经过期,则向域名解析服务器发送解析请求。

其实第一台被访问的域名解析服务器就是我们平时在设置中填写的DNS服务器一项,当操作系统缓存中也没有命中的时候,系统会向DNS服务器正式发出解析请求。这里是真正意义上开始解析一个未知的域名。

一般一台域名解析服务器会被地理位置临近的大量用户使用(特别是ISP的DNS),一般常见的网站域名解析都能在这里命中。

4) 如果域名解析服务器也没有该域名的记录,则开始递归+迭代解析。

这里我们举个例子,如果我们要解析的是mail.google.com。

首先我们的域名解析服务器会向根域服务器(全球只有13台)发出请求。显然,仅凭13台服务器不可能把全球所有IP都记录下来。所以根域服务器记录的是com域服务器的IP、cn域服务器的IP、org域服务器的IP……。如果我们要查找.com结尾的域名,那么我们可以到com域服务器去进一步解析。所以其实这部分的域名解析过程是一个树形的搜索过程。

在这里插入图片描述

根域服务器告诉我们com域服务器的IP。

接着我们的域名解析服务器会向com域服务器发出请求。根域服务器并没有mail.google.com的IP,但是却有google.com域服务器的IP。

接着我们的域名解析服务器会向google.com域服务器发出请求。…

如此重复,直到获得mail.google.com的IP地址。

为什么是递归:问题由一开始的本机要解析mail.google.com变成域名解析服务器要解析mail.google.com,这是递归。

为什么是迭代:问题由向根域服务器发出请求变成向com域服务器发出请求再变成向google.com域发出请求,这是迭代。

5) 获取域名对应的IP后,一步步向上返回,直到返回给浏览器。

Http请求全过程简述_第1张图片

二、TCP连接
与目的主机进行TCP连接(三次握手)

向目的主机发送TCP连接请求报文;

  1. 该TCP报文中SYN标志位设为1,表示连接请求;
  2. 该TCP报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
  3. 目的主机收到数据帧,通过IP->TCP,TCP协议单元回应请求应答报文;
  4. 该报文中SYN和ACK标志设为1,表示连接请求应答;
  5. 该TCP报文通过IP(DNS)->MAC(ARP)->网关->我的主机;
  6. 我的主机收到数据帧,通过IP->TCP,TCP协议单元回应请求确认报文;
  7. 该TCP报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
  8. 目的主机收到数据帧,通过IP->TCP,连接建立完成。

发送与收取数据(浏览器与目的主机开始HTTP访问过程)

只有建立连接后才能开始传输数据。

  1. 浏览器向域名发出GET方法报文(HTTP请求);
  2. 该GET方法报文通过TCP->IP(DNS)->MAC(ARP)->网关->目的主机;
  3. 目的主机收到数据帧,通过IP->TCP->HTTP,HTTP协议单元会回应HTTP协议格式封装好的HTML形式数据(HTTP响应);[ 从请求信息中获得客户机想访问的主机名。从请求信息中获取客户机想要访问的web应用(web应用程序指提供浏览器访问的程序,简称web应用)。从请求信息中获取客户机要访问的web资源。(web资源,即各种文件,图片,视频,文本等)读取相应的主机下的web应用,web资源。用读取到的web资源数据,创建一个HTTP响应。]

  4. 该HTML数据通过TCP->IP(DNS)->MAC(ARP)->网关->我的主机;
  5. 我的主机收到数据帧,通过IP->TCP->HTTP->浏览器,浏览器以网页形式显示HTML内容。

三、发送Http请求

只有建立连接后才能开始传输数据。

  1. 浏览器向域名发出GET方法报文(HTTP请求);
  2. 该GET方法报文通过TCP->IP(DNS)->MAC(ARP)->网关->目的主机;
  3. 目的主机收到数据帧,通过IP->TCP->HTTP,HTTP协议单元会回应HTTP协议格式封装好的HTML形式数据(HTTP响应);[ 从请求信息中获得客户机想访问的主机名。从请求信息中获取客户机想要访问的web应用(web应用程序指提供浏览器访问的程序,简称web应用)。从请求信息中获取客户机要访问的web资源。(web资源,即各种文件,图片,视频,文本等)读取相应的主机下的web应用,web资源。用读取到的web资源数据,创建一个HTTP响应。]

  4. 该HTML数据通过TCP->IP(DNS)->MAC(ARP)->网关->我的主机;
  5. 我的主机收到数据帧,通过IP->TCP->HTTP->浏览器,浏览器以网页形式显示HTML内容。

HTTP协议

HTTP请求:http请求由三部分组成,分别是:请求行、消息报头、请求正文

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF  
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

请求方法(所有方法全为大写)有多种,各个方法的解释如下:

  • GET     请求获取Request-URI所标识的资源
  • POST    在Request-URI所标识的资源后附加新的数据
  • HEAD    请求获取由Request-URI所标识的资源的响应消息报头
  • PUT     请求服务器存储一个资源,并用Request-URI作为其标识
  • DELETE  请求服务器删除Request-URI所标识的资源
  • TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT 保留将来使用
  • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
状态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:

  • 200 OK      //客户端请求成功
  • 400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
  • 403 Forbidden  //服务器收到请求,但是拒绝提供服务
  • 404 Not Found  //请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error //服务器发生不可预期的错误
  • 503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

eg:HTTP/1.1 200 OK (CRLF)

消息报头:

常用的请求报头
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。这个报头域不是必需的。

常用的响应报头
Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
Server
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是
Server响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出服务器对请求资源采用的是基本验证机制。

四、TCP断开连接

与目的主机断开TCP连接(四次挥手)
TCP连接释放过程:

浏览器向目的主机发出TCP连接结束请求报文,此时进入FIN WAIT状态;
该报文FIN标志位设为1,表示结束请求;
TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
目的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文;
当前只是进行回应,因为目的主机可能还有数据要传,并不急着断开连接;
该报文中ACK标志位设为1,表示收到结束请求;
目的数据发送完所有数据后,向我的主机发出TCP连接结束请求报文;
该报文FIN标志位设为1,表示结束请求;
TCP结束请求报文通过IP(DNS)->MAC(ARP)->网关->我的主机;
我的主机收到数据帧,通过IP->TCP,TCP协议单元回应结束应答报文,此时进入TIME WAIT状态,因为不相信网络是可靠的,如果目的主机没收到还可以重发;
该报文中的FIN标志位均设为1,表示结束应答;
该TCP回应报文通过IP(DNS)->MAC(ARP)->网关->目的主机;
目的主机关闭连接;
TIME WAIT等待结束后,没有收到回复,说明目的正常关闭了,我的主机也关闭连接。
 

Http整个流程:

在这里插入图片描述

以上文章片段原创来源于以下几个博客文章:

https://blog.csdn.net/g291976422/article/details/88984859
https://blog.csdn.net/qq_40085084/article/details/81220631
https://blog.csdn.net/u012862311/article/details/78753232
 

你可能感兴趣的:(系统运维,http请求,http过程,http请求过程,网页访问过程,http)