深入理解HTTP协议

http是一种为分布式,协作式的,超媒体信息系统。它是一种通用的,无状态的协议,除了应用于超文本传输外,它也可以应用于诸如名称服务器和分布对象管理系统之类的系统。HTTP的特性就是数据表现形式可以定义的和可协商的,这就允许系统能够独立于数据传输被构建。它是面向应用层的协议。

整体操作

HTTP协议是一种请求/响应型的协议。客户端给服务器发送请求的格式是一个请求方法(request method),URI , 协议版本号,然后紧接着一个包含请求修饰符(modifiers),客户端信息,和可能的消息主体的类MIME(MIME-like)消息。服务器对请求端发送响应的格式是一个状态行(status line), 其后跟随一个包含服务器信息,实体元信息和可能的实体主体内容的类MIME(MIME-like)的消息。其中状态行(status line) 包含消息的协议版本号和一个成功或错误码。

大部分的HTTP通信是由(user agent)发起的,由应用于一个源服务器资源的请求构成。最简单的情形,这可以通过用户代理(UA)和源服务器(O)之间的单一连接(v)来实现。
请求链(Request chain)———————>用户代理(UA)—————-单一连接(v)————–源服务器(O) <————————–响应链(response chain)  

HTTP通信通常发生在TCP/IP链接上。默认端口是TCP 80,不过其它端口也可以使用。但并不排除HTTP协议会在其它协议之上被实现。HTTP仅仅期望的是一个可靠的传输(http一般建立在传输层之上);所以任何提供这种保证的协议都可以被使用。

协议参数

1http版本(HTTP-VERSION)
2通用资源标示符(URI)
3日期/时间格式(Date/Time Formats)
4字符集(Character Sets)
5内容编码(Content Codings)
6传输编码
7媒体类型
8产品标记
9质量值
10语言标签
11实体标签
12范围单位(Range Units)

HTTP消息

消息类型
HTTP消息由从客户端到服务器请求的消息和从服务器到客户端的响应消息两部分组成。两种类型的消息都由一个开始行(start-line), 零个或更多个头域(经常被称作”头”),一个指示头域结束的空行(也就是以一个CRLF为前缀的什么也没有的行),最后一个可有可无的消息主体(message-body)组成。为了健壮性,服务器应该忽略任意请求行(Request-Line)前面的空行。换句话说,如果服务器开始读消息流的时候发现了一个CRLF,它应该忽略这个CRLF。
一般一个存在问题的HTTP/1.0客户端会在POST请求消息之后添加额外的CRLF。为了重新声明被BNF明确禁止的行为,一个HTTP/1.1客户端不能在请求前和请求后附加一些不必要的CRLF。

消息头(Message Headers)
HTTP头域包括常用头域,请求头域,响应头域和实体头域。
消息主体
HTTP消息的消息主体用来承载请求和响应的实体主体(entity-body)的,这些消息主体(message-body)仅仅当被传输译码头域(Transfer-Encoding)指明的传输编码(transfer-coding)应用于实体主体(entity-body)时和实体主体相区别,其它情况消息主体和实体主体相同。
消息的长度(Message Length)
当消息主体出现在消息中时,一条消息的传输长度(transfer-length)是消息主体(message-body)的长度;也就是说在实体主体被应用了传输编码(transfer-coding)后。
常用头域(General Header Fields)
有一些头域即适用于请求消息也适用于响应消息,但是这些头域并不适合传输实体。这些头域只能应用于传输消息。

请求

一个请求消息是从客户端到服务端的,在消息首行里包含方法,资源指示符,协议版本。
请求行(Request-Line)
请求行(Request-Line)是以一个方法标记开始,后面跟随Request-URI和协议版本(HTTP-Version),最后以CRLF结束。元素是以SP字符分割。除了最后的CRLF,CR或者LF是不被允许的。
Request-Line  =Method SP Request-URL SP  HTTP-Version CRLF
请求资源的识别
请求资源的精确定位是由请求里的Request-URI和Host头域决定的。
请求头域
请求头域允许客户端传递请求的附加信息和客户端自己的附加信息给服务器。这些头域作为请求的修饰,这和程序语言方法调用的参数语义是等价的。

响应

接收和解析一个请求消息后,服务器发出一个HTTP响应消息。
response =Status-Line
*(( general-header)
| response-header
CRLF
[ message-body ]
状态行
响应消息的第一行是状态行(status-Line), 由协议版本以及数字状态码和相关的文本短语组成,各部分间用空格符隔开,除了最后的CRLF序列,中间不允许有CR或LF。
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
响应头域
响应头域允许服务器传送响应的附加消息,这些信息不能放在状态行里。这些头域给出有关服务器的信息以及请求URI指定资源的更进一步访问信息。

实体

如果不被请求方法或者响应状态码所限制,请求和响应消息都可以传输实体。实体包括实体头域(entity-header)与实体主体(entity-boty),而有些响应只包括实体头域(entity-header)。
实体头域(Entity Header Fields)
实体(entity-header)头域定义了关于实体主体的元信息,或在无主体的情况下定义了请求的资源的元信息。有些元信息是可选的;一些是必须的。
entity-header = Allow  
| Content-Encoding 
| Content-Language  
| Content-Length 
| Content-Location  
| Content-MD5  
| Content-Range  
| Content-Type  
| Expires  
| Last-Modified  
| extension-header
extension-header = message-head
扩展头机制允许在不改变协议的前提下定义额外的实体头域,但不保证这些域在接收端能够被识破。未被识破的头域应当被接收着忽略,且必须被透明代理(transparent proxy)转发。
实体主体(Entity Body)
由HTTP请求或响应发送的实体主体(如果存在的话)的格式与编码方式应由实体的头域决定。实体主体只有当消息主体存在时才存在。实体主体从消息主体根据传输译码头域(Transfer-encoding)解码得到,传输译码用于确保消息的安全和合适传输。

关于HTTP还有很多东西,这里暂时就讨论这么多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值