网络基本功(二十一):细说HTTP(上)

转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese
image001.gif

介绍

HTTP是一个由请求与响应组成的客户端与服务端交互协议。浏览器发送一个HTTP请求到指定的URL地址,持有此URL地址的WEB服务器将返回一个HTTP请求。请求的类型有GET, POST, HEAD, PUT, DELETE, OPTIONS和TRACE等。

更多信息

HTTP操作模式与客户端/服务器通信:

HTTP只关心一个功能:从web服务器到web客户端的超文本文件以及其他文件的传输。从通信的角度来看,客户端主要负责发送请求给服务器,服务器对请求作出响应。相比FTP和SMTP这样需要多个通信步骤和命令/响应序列的应用层协议,HTTP更像BOOTP和ARP。

基本的HTTP客户端/服务器通信:

最简单的HTTP操作包括一个使用web浏览器的HTTP客户端,和一个HTTP服务器,通常称为web服务器。在TCP连接创建之后,以下两步通信过程如下:

客户端请求:HTTP客户端根据HTTP协议标准发送HTTP请求信息,该信息指定客户端想要获取的资源或包括准备提供给服务器的信息。

服务器响应:服务器读取并解释该请求。对请求作出相应行为并创建HTTP响应信息,发回给客户端。响应信息包括该请求是否成功,也包括客户端请求的资源内容。

HTTP消息格式:

使用HTTP的设备通信都是通过HTTP消息来完成,其中只有两种类型:请求和响应。客户端通常发送请求和接收响应,服务器接收请求和发送响应。信息使用的是文本的形式。

常规HTTP消息格式如下所示:

  1. <起始行>
  2. <首部字段>
  3. <空白行>
  4. [<主体>]
  5. [<尾部>]

起始行包含消息的类型。请求消息中,这一行以方式的形式表明消息为请求类型,并制定一个URI(Uniform Resource Identifier)指明请求的对象资源。响应通过起始行来表明请求响应的状态信息。

首部字段HTTP定义了多种类型的首部字段。通过功能分组,除了主机头以外,几乎所有首部字段都是可选的。格式如下:<header-name>:<header-value>。

主体也是可选的,包含客户端和服务器通信所需的一系列信息,如响应的详细错误消息。更加常见的是承载文件或其他资源,HTTP标准中称为实体。由于大多数客户端请求服务器发送文件或其他资源,实体在响应信息中最为常见。

尾部,HTTP/1.1默认使用永久链接,消息在服务器与客户端之间以流的形式传输,需要标记消息的结束点和开始点。

HTTP请求消息:

客户端通过打开一个TCP连接发起与服务器的HTTP会话,之后发送HTTP请求信息

image002.jpg

起始行

主要有三个用途:

  • 表明客户端想要进行的命令或行为

  • 指定行为想要获取的资源

  • 告知服务器客户端使用的HTTP版本

起始行的语法为:

  1. <METHOD><request-uri><HTTP-VERSION>

Method

method就是客户端想要服务器做什么,三种比较常用:GET,HEAD和POST。

GET 从服务器向客户端发送发送命名资源
PUT 将来自客户端的数据存储到一个命名的服务器资源中去
DELETE 从服务器中删除命名资源
POST 将客户端数据发送到一个服务器网关应用程序
HEAD 仅发送命名资源响应中的HTTP首部

Request URI

Request URI是请求所申请资源的URI。目前URI通常值符合Web URL语法的HTTP URL。有趣的是,HTTP起始行所使用的URL形式通常与HTML文件或用户输入的不同。这是因为一个完整URL中的部分信息是用来控制HTTP本身的。这是用户和HTTP客户端通信所需,而不包括在客户端对服务器的请求中。在请求中指定资源的标准方式是在起始行中加入路径和文件名(以及可选的查询信息),同时在主机头字段指定主机。

例如:假设用户输入URL:http://www.myfavoritewebsite.com:8080/chatware/chatroom.php,我们不需要发送http:到服务器。客户端将余下的信息拆分成URI /chatware/chatroom.php主机行会包括www.myfavoritewebsite.com:8080。因此,请求的开始内容如下:

  1. GET /chatware/chatroom.php HTTP/1.1
  2. Host: www.myfavoritewebsite.com:8080

这一准则的例外是当请求对象是代理服务器时。这时请求就要使用完整URL的形式,以使代理可以作为初始客户端来处理该请求。请求如下所示:

  1. GET http://www.myfavoritewebsite.com:8080/chatware/chatroom.php HTTP/1.1

请求首部

在请求首部,提供给服务器关于请求的详细信息。所有请求首部都使用相同的结构,但按照以下功能分类:

普通报头普通报头通常指消息本身,通常用于控制其处理过程或提供给接收方额外信息。这类报头不限于请求或响应信息,所以两者都可能出现。同样,也与所承载的实体没有特别关系。

请求报头 这类报头告知服务器关于客户端请求的更多信息,给予客户端更多关于请求处理的控制。例如,一些请求报头用于指定条件请求,只有在特定条件时才执行。其他告诉服务器响应信息中客户端能够徐立的格式或编码。如:

Accept 告诉服务器端,接受哪些类型的信息。

Accept-Encoding 可接受的内容编码。

Accept-Lanague 指定一种自然语言。

Connection 表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时显著地减少下载所需要的时间。

Cookie 最重要的请求头信息之一, 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端。

Host host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来。

User-Agent用户代理,一般情况是浏览器。我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了客户端操作系统的名称和版本,所使用的浏览器的名称和版本,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。

参考

TCP/IP Guide

原文: https://wizardforcel.gitbooks.io/network-basic/content/20.html