HTTP协议详解
2016-01-23 本文已影响3393人
fever105
HTTP协议详解
INDEX 原文地址
- 什么是HTTP协议
- URL
- HTTP消息结构
- HTTP方法
- 状态码
- Header Field
- 请求体格式
- 理解HTTP通讯方式
什么是HTTP协议
-
协议
是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规则。 -
超文本传输协议(HTTP)
作为其中一种,它允许将超文本标记语言文档
从web服务器传送给客户端。(由于使用MIME机制/多用途因特网邮件扩展,可以传输多种类型的文件)
URL
-
URL
(Uniform Resource Locator / 统一资源定位符)用于标记一个网络上的资源
。基本格式如下:
schema://login@host[:port#]/path/..../[?query-string][#anchor]
/*
scheme: 协议名(如http,https,ftp)
login: 登陆信息
host: 服务器IP/域名
port#:HTTP服务的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080
path: 资源路径
query-string: 发送给web服务器的数据
anchor: 片段标识符
*/
- 一个例子:
http://www.mywebsite.com/sj/test/test.aspx?name=sivergn&x=true#stuff
/*
schema: http
host: www.mywebsite.com
path: /sj/test/test.aspx
Query String: name=sviergn&x=true
Anchor: stuff
*/
HTTP消息结构
请求消息/Request
GET http://www.cnblogs.com/ HTTP/1.1
Host:www.cnblogs.com
Request Line | METHOD/path-to-resource HTTP/version-number |
---|---|
Request Header | Field1 : Value |
Request Header | Field2 : Value |
空行 | 空行 |
Request Body | data(optional) |
Request Line/请求行
- Method:请求方法,如GET/POST。
- path-to-resource:所请求的资源在web服务器上的
路径
。 - HTTP/version-number:HTTP协议版本号。
-
Request Header / 请求头
,记录请求行以外的重要信息。 -
Request Body / 请求体
,携带提交给web服务器的数据。使用GET方法时,为空。 - 注意,Body和Header之间
空一行
。
响应消息/Response
Response Line | HTTP/version-number status-code message |
---|---|
Response Header | Field1 : Value |
Response Header | Field2 : Value |
空行 | 空行 |
Response Body | data(optional) |
Response Line/响应行
- HTTP/version-number:HTTP协议版本号。
- status-code:状态码,反应服务器处理是否正常,告知出现的错误。
- message:状态消息,同状态码对应。
-
Response Header / 响应头
,记录响应体数据的相关信息。 -
Response Body / 响应体
,携带需要向web服务器发送的数据。使用GET方法时,为空。 - 注意,Body和Header之间
空一行
。
HTTP方法
-
用于告知服务器我的意图
-
GET
,从服务器上获取特定资源
。 -
POST
,上传请求体。 -
HEAD
,获取关于特定资源的响应头
。 -
GET和POST方法的
区别
数据存放位置
- GET:将数据放在URL之后,以?连接;参数之间以&进行拼接,例如:
EditPosts.aspx?name=test1&id=12345
- POST:数据放在Request Body中。
数据大小限制
- GET:所提交数据的大小有限制(因为浏览器对URL的长度有限制)。
- POST:没有限制。
安全性
- GET:所提交的数据以明文的形式显示在URL上。
- POST:由于保存在Request Body中,增加了安全系数。
缓存
- GET:缓存服务器返回的
响应
。 - POST:不缓存。
状态码
-
由三位数字和状态消息组成:
-
1XX(信息描述):接受的请求正在处理。
-
2XX(成功状态):请求正常处理完毕。其中206表示请求部分内容成功/
Range
。 -
3XX(重定向状态):需要进行附加操作以完成请求。
-
4XX(客户端错误):服务器无法处理请求。
-
5XX(服务器错误):服务器处理请求出错。
Header Field
Request Header Field / 请求头域
- User-Agent:客户端程序信息。
- Range:获取资源的范围(从0开始,末尾位置为
文件长度 - 1
),单位字节: - bytes=500-1000,从500开始,下载到1000。
- bytes=500-,从500开始下载,直至数据末尾。
- bytes=-500,从0开始下载到500。
Response Header Field / 响应头域
- Content-Length:Response Body数据的大小(字节)。
- Keep-Alive:服务器端的超时限制/
timeout
,最大同时连接数/max
。 - Content-Type:Response Body数据的的媒体类型(MIME)。注意,如果利用POST请求向服务器上传文件,则需遵从以下格式:
/*
1. form-data;和boundary=之间有一个空格。
2. boundary=之后的内容可以是任意字符串。
*/
multipart/form-data;(空格)boundary=---------------------------195362999817818974031690194806
请求体格式
- 单个文件上传
/*
原始boundary以及头尾部boundary的不同之处:
---------------------------195362999817818974031690194806 // oriBoundary,设置在Content-Type中
-----------------------------195362999817818974031690194806 // 头部boundary,--oriBoundary(前面2个-)
-----------------------------195362999817818974031690194806-- // 尾部boundary,--oriBoundary--(前后都有2个--)
*/
-----------------------------195362999817818974031690194806 // 头部boundary
Content-Disposition: form-data; name="userfile"; filename="vcpg" // 内容属性,form-data; name="服务器用于接收文件的参数名": filename="文件被发送给服务器时所使用的名称"
Content-Type: application/octet-stream // 万能文件类型
// 空行
// 文件内容开始
//...
// 文件内容结束
-----------------------------195362999817818974031690194806-- // 尾部boundary,其紧贴文件内容的结尾
- 上传多个文件 + 多个参数
-----------------------------418888951815204591197893077 // 文件1的头部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件1.md"
Content-Type: text/markdown
// 空行
// 文件1内容开始
// ...
// 文件1内容结束
-----------------------------418888951815204591197893077 // 文件2的头部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件2"
Content-Type: application/octet-stream
// 空行
// 文件2内容开始
// ...
// 文件2内容结束
-----------------------------418888951815204591197893077 // 文件3的头部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件3"
Content-Type: application/octet-stream
// 空行
// 文件3内容开始
// ...
// 文件3内容结束
-----------------------------418888951815204591197893077 // 参数username的头部boundary
Content-Disposition: form-data; name="username"
zhangsan
-----------------------------418888951815204591197893077 // 参数password的头部boundary
Content-Disposition: form-data; name="password"
zhangxx
-----------------------------418888951815204591197893077-- // 尾部boundary,表示结束
理解HTTP通讯方式
- 客户端和服务器的通讯是
有来有回
的,而且总是以客户端首先发起请求
,服务器进行响应
的形式发生。 - 所谓通讯就是
传输数据
,根据数据的大小
,可以将其分为三种类型:(c表示客户端;s表示服务器) -
c小:s小
,适用方法GET / POST。 -
c小:s大
,适用方法GET / POST。 -
c大:s小
,适用方法POST。 - 注意,对于客户端来说,不管是上传还是下载
大数据
,都需要解决内存管理问题
。