HTTP报文结构

作者:陆金龙    发表时间:2018-05-27 13:18   


1 HTTP报文结构

起始行

报文头

空行

报文数据

2 HTTP请求报文

请求行、请求头(get请求无Content-type、Content-Length)、空行、请求数据(get请求无请求数据)

POST /index.html HTTP/1.1

Accept-Language:zh-CN

User-Agent:Mozilla/4.0(...)

Connection:Keep-Alive

Cache-Control:no-cache

Content-type: ...

Content-Length: ...

 

name=king@password@123456

 

请求行

请求方法 URL 协议版本\r\n

请求头

字段名:值\r\n

 

字段名:值\r\n

 

......

空行

\r\n

请求数据

......

 

get和post请求区别

1.提交数据的形式:

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),会直接展现在地址栏中,以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5 %A5%BD。

如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密

得出如:%E4 %BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。

 

而POST方法则会把数据放到请求数据字段中以&分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数

 

2.提交数据的大小

客户端或服务器的支持的不同限制URL长度:比如IE对URL长度的限制是2083字节(2K+35)

post方式HTTP协议规范中也没有限定,起限制作用的是服务器的处理程序的处理能力。

所以大小的限制还是得受各个web服务器配置的不同而影响。

 

3.提交数据的安全

POST比GET方式的安全性要高

通过GET提交数据,用户名和密码将明文出现在URL上,get方式安全性会比post弱:

(1)登录页面有可能被浏览器缓存

(2)其他人查看浏览器的历史纪录,就可拿到你的账号和密码

(3)当遇上跨站的攻击时,安全性的更差

 

3 HTTP响应报文

响应行、响应头、空行、响应数据(文本、html、字节流数据)

 

HTTP/1.1 200 OK

Server://服务器通过这个头告诉浏览器服务器的类型

Date://消息发送的时间

Allow:

Content-Encoding:

Last-Modified://指定服务器上保存内容的最后修订时间

Expires:

Location://配合302使用

Refresh://告诉浏览器隔多久刷新一次

Set-Cookie://设置和页面关联的Cookie

WWW-Authenticate:

response.setHeader("WWW-Authenticate", "BASIC realm=\""executives\"")

响应行

协议版本 状态码 描述\r\n

响应头

字段名:值\r\n

 

字段名:值\r\n

 

......

空行

\r\n

响应数据

......

 

状态码说明:

100~199:成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

200~299:成功接收请求并已完成整个处理过程。常用200

300~399:未完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(跳转到新地址),307和304(不响应资源,让客户端自己拿缓存)

400~499:客户端的请求有错误,常用404(请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

500~599:服务器端出现错误,常用500

 

其中三种禁止浏览器缓存的头字段:

Expires:-1或0

Cache-Control:no-cache

Pragma:no-cache