在HTTP连接中消息报文分为Request请求和Response响应两种,每种报文在HTTP首部会有不同的字段来标识不同的用途。
HTTP协议使用TCP协议进行传输,在应用层协议发起交互之前,首先是TCP的三次握手。完成TCP三次握手后,客户端会向Web服务器发出一个请求报文。
典型的HTTP请求消息格式
- 请求方法:
GET
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host www.hostname.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer www.hostname.com
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
- 请求方法:
POST
POST / HTTP1.1
Host:www.hostname.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
客户端发送的HTTP请求到Web服务器时,请求消息主要包含四部分:
- 请求行
- 请求头
- 空行
- 请求体
1. 请求行 request-line
请求行用于说明请求类型,以及要访问的资源和使用的HTTP版本。
请求行以一个方法符号开头,以空格分隔,后跟请求的URI和协议的版本。
例如:GET /562f25980001b1b106000338.jpg HTTP/1.1
例如:POST / HTTP1.1
HTTP定义了很多于服务器交互的方法
-
GET
向Web服务器请求一个文件 -
POST
向Web服务器发送数据,并让Web服务器进行处理。 -
PUT
向Web服务器发送数据,并存储在Web服务器内部。 -
HEAD
检查一个对象是否存在 -
DELETE
从Web服务器上删除一个文件 -
CONNECT
对通道提供支持 -
TRACE
跟踪到服务器的路径 -
OPTIONS
查询Web服务器的性能
可以使用一个URL地址来描述一个网络上的资源,而HTTP的GET
、POST
、PUT
、DELETE
对应着对这个资源的查、改、增、删四个操作。
什么是URL呢?
URL全程Uniform Resource Location统一资源定位,用于描述网络上的一个资源。
URL基本格式如下:
schema://host[:port#]/path/.../[?query-string][#anchor]
-
schema
指定底层使用的协议类型,如HTTP、HTTPS、FTP... -
host
HTTP服务器的IP地址或域名 -
port
HTTP服务器的端口,默认80可省略。 -
path
访问资源的路径 -
query-string
发送给HTTP服务器的数据 -
anchor
锚点
2. 请求头 headers
请求头headers
用于指定服务器要使用的附加信息
HOST
- HOST表示请求的目的地,也就是请求的Web服务器域名地址。
- HOST请求报头域主要用来指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来。
用法:Host www.hostname.com
User-Agent
- User-Agent记录着HTTP客户端运行的浏览器类型的详细信息,Web服务器可通过User-Agent判断当前HTTP请求客户端浏览器的类别。
- User-Agent表示服务器和客户端脚本都能够访问它,是浏览器类型检测逻辑的重要基础。
- User-Agent由浏览器来定义且会在每个请求中自动发送
用法:User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
Accept
- Accept的作用是向Web服务器申明客户端浏览器可以接收的媒体类型(MIME)的资源,简单来说就是表示浏览器支持的MIME类型。
- Accept媒体类型中的先后次序表示客户端接收的先后顺序
- Accept中可以使用通配符
*/*
表示任意类型的数据
用法:Accept:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
MIME
MIME全程Multipurpose Internet Mail Extension多功能互联网邮件扩展服务,是一种多用户网际邮件扩展协议,于1992年应用于电子邮件系统,后应用于浏览器。媒体类型又称为内容类型。
媒体类型格式为type/subtype
,其中type
指定大的范围,subtype
是type
中范围更为明确的类型,即大类中的小类。例如text/html、application/xhtml+xml、application/xml...
Text是指用于标准化表示的文本信息,文本消息可以是多种字符集或多种格式。
-
text/html
表示HTML文档
Application是指用于传输的应用程序数据或二进制数据
-
application/xhtml+xml
表示xHTML文档 -
application/xml
表示XML文档
Accept-Language
Accept-Language指定HTTP客户端浏览器用来返回信息时优先选择的语言
用法:Accept-Language: zh-cn,zh;q=0.5
含义:浏览器支持的语言分别是中文和简体中文,优先支持简体中文。
说明:
-
zh-cn
表示简体中文 -
zh
表示中文 -
q
表示权重系数,范围0~1,q值越大请求越倾向于获取;
之前的类型所表示的内容,若没有指定q值则默认为1。若q值为0则用于提醒服务器哪些是浏览器不接受的内容类型。
Accept-Encoding
- Accept-Encoding指定客户端浏览器可以支持的Web服务器返回内容压缩编码的类型
- Accept-Encoding允许Web服务器将输出内容发回客户端之前进行压缩,以节约带宽。这里设置的就是客户端浏览器所能够支持的压缩格式。
简单来说,就是Web服务器在给客户端返回页面数据之前,将数据以gzip格式进行压缩,也节省带宽,加快传输。
用法:Accept-Encoding: gzip,deflate
含义:浏览器有能力解码的编码类型为gzip和deflat
说明:
-
gzip
是GNU zip的缩写,是GNU自由软件的文件压缩程序,也用来表示gzip
文件格式。 -
deflate
使用LZ77算法于哈夫曼编码(Huffman Coding)的一种无损压缩算法
Accept-Charset
Accept-Charset指定浏览器可以接受的字符编码集
用法:Accept-Charset: gb2312, utf-8; q=0.7, *;q=0.7
含义:浏览器支持的字符编码分别是gb2312、utf-8和任意字符,优先顺序为gb2312、utf-8、*。
Content-Type
Content-Type表示HTTP请求提交的内容类型,只有在POST方法提交时才需要设置此属性。
用法:Content-Type: application/x-www-form-urlencoded;charset:UTF-8
当使用POST方式提交数据时,Content-Type属性值支持两种编码类型:
- application/x-www-form-urlencode
默认缺省的编码类型,表单向Web服务器提交数据时所采用的编码类型。
当向Web服务器发送大量文本、包含非ASCII字符的文本、二进制数据时采用这种编码方式效率很低。
- multipart/form-data
文件上传时所使用的编码类型,它既可以发送文本数据,也支持二进制数据上传。
在Content-Type属性中还可以指定提交内容的Charset字符编码
Content-Length
Content-Type是请求体内容的长度,单位字节(byte),并不包含请求行和请求头的数据长度。
Connection
Connection表示是否需要持久连接,如果Web服务器接收到Connection的属性值为Keep-Alive,或者请求所使用的协议版本是HTTP 1.1(默认持久连接),此时就会采用持久连接。
可以利用持久连接的优点,当页面包含多个元素时,可以显著的减少下载所需的时间。要实现这一点,Web服务器需要在返回给客户端的HTTP头信息中加入Content-Length信息正文的长度。
用法:Connection: keep-alive
当一个Web页面打开时,客户端和Web服务器之间用于传输HTTP数据库的TCP连接不会关闭,如果客户端再次访问Web服务器上的网页,会继续使用这条已经建立的连接。
用法:Connection: close
close表示一个Requset请求完成后,客户端和Web服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request请求时,需要重新建立TCP连接。
Keep-Alive
早期的HTTP请求是一站式连接,从HTTP协议1.1版本之后就开始支持长连接。长连接简单来说,就是在Keep-Alive规定的时间内连接不会断开。
Keep-Alive指定HTTP持久连接的时长,用来保证客户端到服务器的连接持续有效。当出现对服务器的后续请求时,Keep-Alive可以避免重建连接。
用法:Keep-Alive:300
Cookie
由于HTTP是无状态的,同一个客户端的这次请求和上次请求是没有关系的,对HTTP服务器来说,它并不知道这两个请求是否来自同一个客户端。为了解决这个问题,Web程序引入了Cookie机制来维护状态。
Cookie用于存放一些用户信息以便于让Web服务器辨别用户的身份,比如cookie会存储用户的账户和密码,当用户登录后就会在客户端产生一些cookie来存储相关信息,这样浏览器通过读取cookie中的信息,然后去Web服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。
当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储在cookie里面,例如sessionid等。
当HTTP请求发送时,会把保存在该请求域名下所有cookie值,一起发送给Web服务器。
Refer
Refer包含了一个URL,表示用户从该URL页面触发访问当前请求的页面。
例如:个人主页中的外链,外链所在服务器可以根据Refer统计出每天从个人主页达到的访客数量。
Pragma
Progma: no-cache
可应用于HTTP1.0和HTTP1.1
Cache-Control
Cache-Control用于指定请求和响应遵循的缓存机制,在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包含:
-
no-cache
指示请求或响应消息不能缓存,只能应用于HTTP1.1。 -
no-store
用于防止重要的信息被无意的发布,在请求消息中发送将使得请求和响应消息都不使用缓存。 -
max-age
指示客户端可以接收生存期不大于指定时间的响应,以秒为单位。 -
max-stale
指示客户端可以接收超出超时期间的响应消息,如果指定max-stale消息的值,那么客户端可以接收超出超时期指定值之内的响应消息。 -
min-fresh
指示客户端可以接收响应时间小于当前时间加上指定时间的响应 only-if-cached
响应消息中的指令包含
-
public
指示响应可以被任何缓存区缓存 -
private
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。它允许服务器仅仅描述当前用户的部分响应消息,此响应消息对于其它用户的请求无效。 no-cache
no-store
no-transform
must-revalidate
proxy-revalidate
max-age