HTTP请求详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP请求详解相关的知识,希望对你有一定的参考价值。

一、协议介绍

  HTTP(HyperText Transfer Protocol,超文本传输协议)是一套计算机通过网络进行通信的规则,使HTTP客户端能够从HTTP服务器端请求到信息和服务,目前的版本号是1.1 是无状态协议,无状态是指从客户端发送HTTP请求到服务器,服务器接收到请求之后做出回应,这样链接就关闭了,在服务器端不需要保留客户端的相关信息。

二、协议过程

  HTTP通讯机制是在一次完整的HTTP通讯过程中,客户端和服务器之间建立连接分为以下几个步骤。

  1. 建立连接: 其中包括:域名解析,TCP三次握手。

    域名解析:将HTTP请求中的域名转化为IP地址,其中主要步骤有,以Chrome为例,访问www.baidu.com

    ① 首先,Chrome会搜索浏览器自身的DNS缓存(缓存较少),看自身有没有改域名的IP地址,如果有停止解析返回IP,如果没有继续解析。

      注解:Chrome中的DNS可以通过在浏览器中输入 chrome://net-internals/#dns 来进行查看浏览器DNS缓存。

     技术分享

 

    ② 如果在浏览器的自身的DNS缓存中没有找到,那么Chrome会搜索操作系统自身的DNS缓存,如果找到就停止,没有找到继续解析。

    注解:可以通过命令行  ipconfig /displaydns 来查看操作系统的DNS缓存。

     技术分享 

    ③ 如果chrome在操作系统的DNS缓存中没有找到,那么会尝试读取host(C:\\Windows\\System32\\drivers\\etc)文件,看看这里面有没有对应的DNS地址

    技术分享

    ④ 如果host文件中没有找到,那么chrome会发送一个DNS系统调用, 会首先向默认的DNS服务器发送域名解析(一般默认的是网络运营商的,通过UDP协议向DNS的53端口发送请求),如果网络运营商有该域名缓存,那么返回IP,如果没有,该运营商的DNS会发起一个迭代DNS解析请求,首先找到根域名的IP地址,即com域的IP地址。运营商会继续想com域发送域名解析请求,获得baidu.com域的IP地址,进而获得需要解析域名的IP地址(如果www.baidu.com 这么难访问,那么就离退休不远了)。

 

    TCP三次握手:拿到域名的IP之后,client会以一个随机端口向web服务器指定端口(默认为80端口,有时候也有用8080端口的)发送TCP链接请求。

    技术分享

    

  2. 发送数据:

    client与server建立连接之后,client向server端发送数据包其中数据包中包含以下信息

    ⑴ 请求方法 URI协议/版本

    ⑵ 请求头(Request Header)

    ⑶ 请求正文

    eg.

    

GET/index.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
 
username=jinqiao&password=1234

 

    ⑴ 请求方法 URI协议/版本

    请求的第一行 GET/index.jsp HTTP/1.1 

    “GET” 代表请求方法,“/index.jsp”代表URI协议,“HTTP/1.1”代表协议和协议版本,其中HTTP1.1 支持了七种方法,GET,POST,HEAD,PUT,DELETE,TRACE,CONNECT,OPTIONS. 下面主要说一下GET与POST方法。

    GET:默认的HTTP请求数据,只是对需要提交的信息进行了简单的编码,并将信息附加在URL地址之后 eg. Http://localhost/login.php?username=aa&password=1234 这样会产生将用户的信息暴露的危险。并且浏览器会对URL的长度进行限制,所以提交的信息也有限制。

    POST:主要作用是向web提交表单信息,克服了GET的不安全和数据长度限制的缺点,在发送数据时POST不会将数据附加在URL之后,相对GET方法安全(推荐使用POST方法)。

    ⑵ 请求头 

    请求第二行之后就是请求头,其中包含了客户端环境的相关信息,包含:浏览器所用语言,请求正文长度等。

    ⑶ 请求正文

    请求头结束之后有一个空行(空行表示请求头结束,请求正文开始)

 

  3. 返回数据:

    server端接收到client端的请求之后,开始响应client端,返回数据包。其中数据包包含如下信息

    ⑴ 协议状态版本代码描述

    ⑵ 响应头

    ⑶ 响应正文

    eg. 

    

 1 HTTP/1.1 200 OK
 2 Server:Apache Tomcat/5.0.12
 3 Date:Mon,6Oct2003 13:23:42 GMT
 4 Content-Length:112
 5  
 6 <html>
 7 <head>
 8 ...
 9 </body>
10 </html>

    ⑴  协议状态版本代码描述

    响应的第一行 “HTTP/1.1” 是协议版本, 200 OK 表示响应成功

    HTTP应答码也成状态码,反映了本次HTTP请求的状态,其中主要分为以下几种

    1XX -信息类,表示收到了请求进一步处理中

    2XX -成功类,表示用户的请求被正确接收正,理解,处理。例如200 OK

    3XX -重定向类,表示用户请求没有成功,客户端需要采取进一步动作

    4XX -客户端错误,表示客户端请求错误,其中404 NOT FOUNT 表示资源没有找到

    5XX -服务器端错误,表示服务器不能完成相对于的错误,一般是服务器内部错误。

    ⑵ 响应头

    与请求的类似

    ⑶ 响应正文

    响应头结束之后有一个空行,表示响应头结束,响应正文开始。

 

  4. 关闭连接:

    通过TCP四次握手断开连接。

  


以上是关于HTTP请求详解的主要内容,如果未能解决你的问题,请参考以下文章

HTTP请求返回状态码详解

HTTP请求返回状态码详解

HTTP请求返回状态码详解

HTTP请求返回状态码详解

各类 HTTP 返回状态代码详解

各类 HTTP 返回状态代码详解