首页 > 代码库 > 浅析HTTP协议

浅析HTTP协议

====================================请求消息
例:http://www.baidu.com:80/index.html

*******请求方法
GET /index.html HTTP/1.1<CRLF>
*******请求头
Host: www.baidu.com
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140903 Firefox/24.0 Iceweasel/24.8.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
********请求主体/查询字符串
Datetime=2014-12-15%2010:45:35
datetime=2014-12-15+11%3A57%3A52&loginNum=&LoginLb=xs&Account=1001070111xx&Password=*******&B1=%A1%A1%C8%B7%B6%A8%A1%A1

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

telnet测试:
telnet www.baidu.com 80
HEAD / HTTP/1.1
Host: www.baidu.com

 

***********头域
HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由‘域名: 域值‘三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在下一行行开始处,使用至少一个空格或制表符。

通用头(Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via)是请求和响应消息都支持的头域

请求头(Accept、Accept-Charset、Accept-Encoding、Accept-Language、 Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If- Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、 Range、Referer、User-Agent)是只能在请求消息中使用的头域

响应头(Location Server)只能用于响应消息

实体头(Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、 Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、 extension-header)

********请求主体/查询字符串
POST请求才有,通常包含要提交的表单信息,用于用户登录或数据查询等


=====================================响应消息
********状态行
HTTP/1.1 200 OK<CRLF>
********响应头
Date: Sun, 28 Sep 2014 04:57:41 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Keep-Alive
Cache-Control: private
Expires: Sun, 28 Sep 2014 04:57:41 GMT
Content-Encoding: gzip
Server: BWS/1.1
BDPAGETYPE: 2
BDQID: 0x8b34333900036ffa
BDUSERID: 363501010
Set-Cookie: BDSVRTM=94; path=/
Set-Cookie: BD_HOME=1; path=/

*********相应主体

<html>

xxxx

</html>

 

分析:
*********状态代码
三位数字,第一个数字定义了响应的类别,且有五种可能取值:
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 //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

例:Authorization验证方式(一般用于家用路由登录方式,数据库形式的登录通常使用POST提交):
浏览器发送GET请求(没有Authorization header)
服务器端检查request里面有没有"Authorization",没有就返回401和登陆页面
浏览器显示认证对话框,用户输入帐号密码点击确认
浏览器再次发出GET请求(带着Authorization header)
服务器端验证Authorization头部信息,通常格式为"Authorization: Basic xxxxxx",xxxxxx是‘username:password‘形式的base64加密结果,认证通过就返回200和管理页面

 

*******响应主体

通常是html和js代码给浏览器解析

浅析HTTP协议