零.额外的常识
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》