零.额外的常识
OSI(Open System Internetwork)参考模型:
应用层
给应用程序提供网络通信接口
表示层
会话层
传输层
数据传输单元是报文
网络层
数据传输单元是分组
数据链路层
数据传输单元是帧
物理层
数据传输单元是比特bit
OSI7层是用来研究的理论模型,实际应用起来太繁琐,所以有了TCP/IP参考模型:
P.S.此处的TCP/IP指协议体系,或者说是协议族,包含各种网络协议,如SNMP、ICMP、UDP、DNS等等
应用层
如HTTP、FTP、DNS
传输层
如TCP、UDP
网络层
如IP
数据链路层
HTTP是应用层协议,内部是传输层的TCP和网络层的IP,所以HTTP也需要三次握手、四次挥手
所以存在建立/释放连接的消耗,作为性能优化HTTP/1.1版本默认都是持久连接,而HTTP/1.0并没有
此外,有必要简单区分一些概念:
代理
一种有转发功能的应用程序
网关
转发其它服务器通信数据的服务器
隧道
能够保持Client与Server之间的通信连接的应用程序
隧道
一.URI与URL
URI(Uniform Resource Identifier):统一资源标识符,用来标识特定互联网资源的字符串
URL(Uniform Resource Locator):统一资源定位符,用来标识特定互联网资源的地点的字符串
URL中必不可少的是模式(Scheme)、主机名(Host)和资源路径(URL Path)
所以URL是URI的子集,或者说URL是URI的一部分
二.HTTP方法
GET:获取资源
1.0/1.1支持,常用
POST:传输实体主体
1.0/1.1支持,常用
PUT:传输文件
1.0/1.1支持,一般网站不使用该方法,因为PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题
HEAD:获取报文首部
1.0/1.1支持,常用
DELETE:删除文件
1.0/1.1支持,存在与PUT方法相同的问题
OPTIONS:询问支持的方法
1.1支持
TRACE:追踪路径
1.1支持,配合Max-Forward首部字段检查路径
CONNECT:要求用隧道协议连接代理
1.1支持,配合SSL(Secure Sockets Layer安全套接层)、TLS(Transport Layer Security传输层安全)实现用隧道进行TCP通信
(LINK):建立和资源之间的联系
1.0支持,已被1.1废弃
(UNLINK):断开连接关系
1.0支持,已被1.1废弃
三.HTTP状态码
1XX:Informational(信息性状态码)
接收的请求正在处理
- 101:Switching Protocol,切换协议,配合Upgrade首部字段请求切换协议,不是很常见
2XX:Success(成功状态码)
请求正常处理完毕
200:OK,请求正常处理
204:No Content,请求处理成功但没有资源可返回(响应体为空)
206:Partial Content,请求部分内容,响应头中的Content-Range表明范围
3XX:Redirection(重定向状态码)
需要进行附加操作以完成请求
301:Moved Permanently,永久性重定向,浏览器应该自动更新书签
302:Found,临时性重定向,不更新书签
303:See Other,类似于302,但要求用GET方法访问新URL
注意:规范要求是遇到301、302不改变请求方法(本来是POST就接着用POST),但事实标准是几乎所有浏览器遇到301、302、303都会改用GET方法,这与规范不符
304:Not Modified,找到了资源,但不满足请求条件(If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since)
注意:虽然304属于3XX,但是和重定向没关系
307:Temporary Redirection,临时重定向,与302意义一样
为了纠正事实标准推出的状态码,希望严格遵守302不要改变方法,结果现在浏览器并不一定会这么做,标准再次失败
4XX:Client Error(客户端错误状态码)
服务器无法处理请求
400:Bad Request,请求报文存在语法错误
401:Unauthorized,表示需要认证(BASIC认证或者DIGEST认证)或者认证失败
403:Forbidden,对指定资源的访问请求被拒绝
404:Not Found,服务器无法找到请求的资源,可以代替不想说明理由的403响应
405:Method Not Allowed,方法不支持,不是很常见
412:Precondition Failed,前提失败,不是很常见
417:Expectation Failed,期望失败,不是很常见
5XX:Server Error(服务器错误状态码)
服务器处理请求出错
500:Internal Server Error,服务器在执行请求时发生了错误
503:Service Unavailable,服务器超负载或者正在维护
四.HTTP报文首部
HTTP报文首部 = 报文首部 + 空行(CR+LF) + 报文主体
= 起始行(请求行/状态行) + 首部 + 空行 + 报文主体
= 起始行 + 请求/响应首部字段 + 通用首部字段 + 实体首部字段 + 空行 + 报文主体
P.S.不要小看这个空行(CR+LF),HTTP首部注入攻击的存在就是因为有这个空行
1.起始行
起始行分为请求行和状态行(分别对应HTTP请求报文和响应报文):
请求行:说明请求使用的方法、URI和HTTP版本
状态行:说明返回响应的HTTP版本和状态码
2.首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言) |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
If-Range | 资源未更新时发送实体Byte的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与If-Modified-Since相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
*Referer* | Web认证信息 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 另客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其它协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 代替对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
P.S.其它首部字段以及更详细的首部字段信息请查看博客园:HTTP报文
参考资料:
- 《图解HTTP》