💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 网络基本功(二十一):细说HTTP(上) **转载请在文首保留原文出处:EMC中文支持论坛**[https://community.emc.com/go/chinese](https://community.emc.com/go/chinese) [![image001.gif](https://community.emc.com/servlet/JiveServlet/downloadImage/2-858387-105134/image001.gif)](https://community.emc.com/servlet/JiveServlet/showImage/2-858387-105134/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消息格式如下所示: ``` <起始行> <首部字段> <空白行> [<主体>] [<尾部>] ``` **起始行**包含消息的类型。请求消息中,这一行以方式的形式表明消息为请求类型,并制定一个URI(Uniform Resource Identifier)指明请求的对象资源。响应通过起始行来表明请求响应的状态信息。 **首部字段**HTTP定义了多种类型的首部字段。通过功能分组,除了主机头以外,几乎所有首部字段都是可选的。格式如下:&lt;header-name&gt;:&lt;header-value&gt;。 **主体**也是可选的,包含客户端和服务器通信所需的一系列信息,如响应的详细错误消息。更加常见的是承载文件或其他资源,HTTP标准中称为实体。由于大多数客户端请求服务器发送文件或其他资源,实体在响应信息中最为常见。 **尾部,**HTTP/1.1默认使用永久链接,消息在服务器与客户端之间以流的形式传输,需要标记消息的结束点和开始点。 **HTTP请求消息:** 客户端通过打开一个TCP连接发起与服务器的HTTP会话,之后发送HTTP请求信息 [![image002.jpg](https://community.emc.com/servlet/JiveServlet/downloadImage/2-858387-105135/image002.jpg)](https://community.emc.com/servlet/JiveServlet/showImage/2-858387-105135/image002.jpg) **起始行** 主要有三个用途: + 表明客户端想要进行的命令或行为 + 指定行为想要获取的资源 + 告知服务器客户端使用的HTTP版本 起始行的语法为: ``` <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://www.myfavoritewebsite.com:8080/chatware/chatroom.php),我们不需要发送http:到服务器。客户端将余下的信息拆分成URI /chatware/chatroom.php主机行会包括[www.myfavoritewebsite.com:8080](http://www.myfavoritewebsite.com:8080/)。因此,请求的开始内容如下: ``` GET /chatware/chatroom.php HTTP/1.1 Host: www.myfavoritewebsite.com:8080 ``` 这一准则的例外是当请求对象是代理服务器时。这时请求就要使用完整URL的形式,以使代理可以作为初始客户端来处理该请求。请求如下所示: ``` 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