# 网络基本功(二十一):细说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定义了多种类型的首部字段。通过功能分组,除了主机头以外,几乎所有首部字段都是可选的。格式如下:<header-name>:<header-value>。
**主体**也是可选的,包含客户端和服务器通信所需的一系列信息,如响应的详细错误消息。更加常见的是承载文件或其他资源,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
- 介绍
- 网络基本功(一):细说网络传输
- 网络基本功(二):细说交换机
- 网络基本功(三):细说VLAN与Trunk
- 网络基本功(四):细说路由(上)
- 网络基本功(五):细说路由(下)
- 网络基本功(六):链路聚合
- 网络基本功(七):细说IP地址与子网
- 网络基本功(八):细说TCP滑动窗口
- 网络基本功(九):细说TCP重传
- 网络基本功(十):细说TCP确认机制
- 网络基本功(十一):TCP窗口调整与流控
- 网络基本功(十二):细说Linux网络配置(上)
- 网络基本功(十三):细说Linux网络配置(下)
- 网络基本功(十四):细说诊断工具ping
- 网络基本功(十五):细说网络性能监测与实例(上)
- 网络基本功(十六):细说网络性能监测与实例(下)
- 网络基本功(十七):细说tcpdump的妙用(上)
- 网络基本功(十八):细说tcpdump的妙用(下)
- 网络基本功(十九):细说NAT原理与配置
- 网络基本功(二十):细说ICMP和ARP
- 网络基本功(二十一):细说HTTP(上)
- 网络基本功(二十二):细说HTTP(下)
- 网络基本功(二十三):Wireshark抓包实例诊断TCP连接问题
- 网络基本功(二十四):Wireshark抓包实例分析TCP重传
- 网络基本功(二十五):Wireshark抓包实例分析TCP重复ACK与乱序
- 网络基本功(二十六):Wireshark抓包实例分析TCP窗口及reset
- 网络基本功(二十七):Wireshark抓包实例分析HTTP问题(上)
- 网络基本功(二十八):Wireshark抓包实例分析HTTP问题(下)
- 网络基本功(二十九):Wireshark抓包实例诊断数据库常见问题
- 网络基本功(三十):细说DNS(上)
- 网络基本功(三十一):细说DHCP