HTTP请求过程
假设请求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连接在发送后将仍然保持打开状态,于是浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。