您好,欢迎访问三七文档
HTTP通信协议解释(2006-9-7何红军)1.基本概念HTTP(HypertextTransferProtocol)是目前在Internet上应用最广泛的通信协议之一。简言之,HTTP通信协议允许用户提出HTTP“请求”(request),然后由服务器视实际处理结果传回HTTP“回应”(response),其基本运行方式为:当用户向Web服务器送出请求时,Web服务器将会开启一个新连接。通过这个连接,用户可以将HTTP请求传送给Web服务器。当Web服务器收到HTTP请求时,将进行解析与处理,并将处理结果包装成HTTP回应。最后,Web服务器会将HTTP回应传送至用户。只要用户接收到HTTP回应,Web服务器就会关闭这个连接,用户的执行状态将不会被保存。图1-1用户与Web服务器的交互关系注意:HTTP既可以使用非持久连接(nonpersistentconnection),也可以使用持久连接(persistentconnection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。对80端口监听2.HTTP请求消息下面是一个典型的HTTP请求消息:GET/somedir/page.htmlHTTP/1.1Host::Mozilla/4.0Accept-language:zh-cn(额外的回车符和换行符)首先,这个消息是用普通的ASCII文本书写的。其次,这个消息共有5行(每行以一个回车符和一个换行符结束),最后一行后面还有额外的一个回车特和换行符。当然,一个请求消息可以不止这么多行,也可以仅仅只有一行。第一行称为请求行(requestline),后续各行都称为头部行(header)。请求行有3个字段:方法字段、URL字段、HTTP版本字段。方法字段有若干个值可供选择,包括GET、POST和HEAD。HTTP请求消息绝大多数使用GET方法,这是浏览器用来请求对象的方法,所请求的对象就在URL字段中标识。本例表明浏览器在请求对象/somedir/page.html。版本字段是不言自明的;本例中浏览器实现的是HTTP/1.1版本。现在看一下本例中的各个头部行。头部行Host:定存放所请求对象的主机。请求消息中包含头部Connection:close是在告知服务器本浏览器不想使用持久连接;服务器发出所请求的对象后应关闭连接。尽管产生这个请求消息的浏览器实现的是HTTP/1.1版本,它还是不想使用持久连接。User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是Mozilla/4.0,它是Nelscape浏览器的一个版本。这个头部行很有用,因为服务器实际上可以给不同类型的用户代理发送同一个对象的不同版本(这些不同版本位用同一个URL寻址)。最后,Accept-languag:头部行指出要是所请求对象有简体中文版本,那么用户宁愿接收这个版本;如果没有这个语言版本,那么服务器应该发送其默认版本。Accept-languag:仅仅是HTTP的众多内容协商头部之一。我们接着看一下下图所示的请求消息的一般格式。HTTP请求形式(HTTPmethod)被请求的URIHTTP版本标头信息(RequestHeader)请求内容(MessageBody)图2:HTTP请求格式上面的请求消息例子符合这个格式,不过一般格式中还有一个位于各个头部(及额外的回车符和换行符)之后的“附属体”(body)。附属体不在GET方法中使用,而是在POST方法中使用。POST方法适用于需由用户填写表单的场合,如往google搜索引擎中填入待搜索的词。用户提交表单后,浏览器就像用户点击了超链接那样仍然从服务器请求一个Web页面,不过该页面的具体内容却取决于用户填写在表单各个字段中的值。如果浏览器使用POST方法提出该请求,那么请求消息附属体中包含的是用户填写在表单各个字段中的值。与GET方法类似的是HEAD方法,两者的差别只是服务器在对HEAD方法的响应消息中去掉了所请求的对象,其他内容则与对GET方法的响应消息一样。HEAD方法通常用于HTTP服务器软件开发人员进行调试。3.HTTP响应消息下面是一个典型的HTTP响应消息:HTTP/1.12000KConnectlon:closeDate:Thu,13Oct200503:17:33GMTServer:Apache/2.0.54(Unix)Last—Nodified:Mon,22Jun199809;23;24GMTContent—Length:682lContent—Type:text/html(数据数据数据数据数据…………)这个响应消息分为3部分:1个起始的状态行(statusline),6个头部行、1个包含所请求对象本身的附属体。状态行有3个字段:协议版本字段、状态码字段、原因短语字段。本例的状态行表明,服务器使用HTTP/1.1版本,响应过程完全正常(也就是说服务器找到了所请求的对象,并正在发送)。现在看一下本例中的各个头部行。服务器使用Connectlon:close头部行告知客户自己将在发送完本消息后关闭TCP连接。Date:头部行指出服务器创建并发送本响应消息的日期和时间。注意,这并不是对象本身的创建时间或最后修改时间,而是服务器把该对象从其文件系统中取出,插入响应消息中发送出去的时间。Server:头部行指出本消息是由Apache服务器产生的;它与HTTP请求消息中的User-agent:头部行类似。Last—Nodified:头部行指出对象本身的创建或最后修改日期或时间。Last—Nodified:头部对于对象的高速缓存至关重要,且不论这种高速缓存是发生在本地客户主机上还是发生在网络高速缓存服务器主机(也就是代理服务器主机)上。Content—Length:头部行指出所发送对象的字节数。Content—Type:头部行指出包含在附属体中的对象是HTML文本。对象的类型是由Content—Type:头部而不是由文件扩展名正式指出的。根据HTTP通信协议的规定,每个“HTTP回应”必须包含下列信息:HTTP版本HTTP状态代码(StatusCode)HTTP状态代码所对应的摘要文字(Reason-Phrase)标头信息(ResponseHeader)回应主体(MessageBody)图3:响应消息的一般格式●2000K;请求成功,所请求信息在响应消息中返回。●301MovedPermanently:所请求的对象己永久性迁移;新的URL在本响应消息的Location:头部指出。客户软件会自动请求这个新的URL。●400BadRequest;表示服务器无法理解相应请求的普通错误的状态码●404NotFound:服务器上不存在所请求的文档。●HTTPVersionNotSupport:服务器不支持所请求的HTTP协议版本。HTTP状态代码与其对应的摘要文字StatusCodeReason-PharseStatusCodeReason-Pharse100Continue404NotFound101SwitchingProtocols405MethodNotAllowed200OK406NotAcceptable201Created407ProxyAuthenticationRequired202Accepted408RequestTime-out203Non-AuthoritativeInformation409Conflict204NoContent410Gone205ResetContent411LengthRequired206PartialContent412PreconditionFailed300MultipleChoices413RequestEntityTooLarge301MovedPermanently414Request-URITooLarge302Found415UnsupportedMediaType303SeeOther416Requestedrangenotsatisfiabl304NotModified417ExpectationFailed305UseProxy500InternalServerError307TemporaryRedirect501NotImplemented400BadRequest502BadGateway401Unauthorized503ServiceUnavailable402PaymentRequired504GatewayTime-out403Forbidden505HTTPVersionnotsupported
本文标题:HTTP通信协议
链接地址:https://www.777doc.com/doc-2876496 .html