跳到主要内容

HTTP学习笔记1_基本常识

HTTP协议是重中之重,要好好研究下

免费2015-05-24#HTTP#http入门#http常识#http学习

试读

##零.额外的常识

OSI(Open System Internetwork)参考模型:

  1. 应用层

给应用程序提供网络通信接口

  1. 表示层

  2. 会话层

  3. 传输层

数据传输单元是报文

  1. 网络层

数据传输单元是分组

  1. 数据链路层

数据传输单元是

  1. 物理层

数据传输单元是比特bit

OSI7层是用来研究的理论模型,实际应用起来太繁琐,所以有了TCP/IP参考模型:

P.S.此处的TCP/IP指协议体系,或者说是协议族,包含各种网络协议,如SNMP、ICMP、UDP、DNS等等

  1. 应用层

如HTTP、FTP、DNS

  1. 传输层

如TCP、UDP

  1. 网络层

如IP

  1. 数据链路层

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优先的语言(自然语言)
AuthorizationWeb认证信息
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-AgentHTTP客户端程序的信息
响应首部字段
首部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location另客户端重定向至指定URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP服务器的安装信息
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》

评论

暂无评论

提交评论