HTTP请求过程

参考:HTTP POST GET 本质区别详解

假设请求URL: http://www.helloworld.com:8080/page/index.html

可以采用Fiddler或者浏览器内置的开发者工具进行抓包查看请求以及响应内容。

1. 建立连接

首先DNS会解析 www.helloworld.com,把它映射到相应的IP地址。

如果URL里面有端口号,则使用该端口号。否则端口号使用该协议的默认端口号。比如HTTP协议的默认端口号是80。

有了IP地址以及端口号,就开始通过三次握手建立TCP连接。

2. 客户端发送请求

连接成功建立后,客户端就可以开始向服务器发送请求。这个请求类型一般是GET或POST,还有一些不常用的PUT、DELETE等。

请求的格式:

<request line>

<headers>

<blank line>

<request body>

说明:

1)request line: 在HTTP请求中,第一行必须是一个请求行,用来说明请求类型、要访问的资源以及使用的HTTP版本。

2) header:用来说明服务器要使用的附加信息。

3) blank line: 用来分隔header和request body。

4)request body:主体,可以添加任意的其他数据。

GET请求示例:

# request line,请求的类型是GET,要访问的资源是“/books/?sex=man&name=Professional”,使用的HTTP版本是1.1 
GET /books/?sex=man&name=Professional HTTP/1.1     
#下面全部是header。说明了要访问的host,使用的浏览器是“Mozilla/5.0”等等。
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

POST请求示例:

# request line,请求的类型是POST,要访问的资源是“/”,使用的HTTP版本是1.1
POST / HTTP/1.1
# header, 说明了要访问的host,使用的浏览器,Body部分传送的格式以及长度。
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
#blank line
#request body
name=Professional%20Ajax&publisher=Wiley

备注:

1)GET请求的Params。

GET请求的参数会直接显示在URL里面,我们在request line中也可以看到参数。

URL采用?来分割前面的部分和后面的传输参数。多个传输参数用&连接。

参数采用key-value对的方式。

例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。

2) URL的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在URL中包含任何非ASCII字符,所有非ASCII字符均需要编码再传输。

3) GET请求的数据一般放置在URL里面,而POST请求的传输数据放置在 request body中。

4) Content-type

这个表面body返回的文件格式。比如POST的Content-type 是“application/x-www-form-urlencoded ”,表明传输的是表单格式的数据。其他的还有“text/xml”,表示body部分是xml格式。

3. 服务器应答

服务器收到请求后,会进行相应的处理并返回数据进行响应。

HTTP响应的格式:

<status line>

<headers>

<blank line>

<response body>

说明:

1)status line:用来说明HTTP版本,以及应答状态码。

常用的状态码:

200(OK):找到了该资源,并且一切正常。

304(NOT MODIFIED):该资源在上次请求后没有任何修改。通常用于浏览器的缓存机制。

401(UNAUTHORIZED):客户端无权访问该资源。这通常会使浏览器要求用户输入用户名和密码,以登录到服务器。

403(FORBIDDEN):客户端未能获得授权。这通常是在401之后输入了不正确的用户名和密码。

404(NOT FOUND): 在指定的位置不存在所申请的资源。

示例:

HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

4. 关闭连接

一般情况下,一旦服务器向浏览器发送了应答数据,它就要关闭TCP连接。关闭TCP连接采用四次分手。

然而如果浏览器或者服务器在其头信息中加入了“Connection: keep-alive”,TCP连接在发送后将仍然保持打开状态,于是浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

posted @ 2016-07-12 08:47  微微微笑  阅读(283)  评论(0编辑  收藏  举报