HTTP请求报文(request message)
客户端和服务器建立TCP连接以后,客户端随后会发送一个HTTP请求报文到服务器,请求服务器的服务;
HTTP请求报文的格式一般如下:
请求行(request line)(起始行)
“请求行”是HTTP请求报文的第一行,只有三个内容(字段):
- 方法(参见HTTP 请求方法)
- URL;请求资源的URL,即请求目标,表明了要操作的资源;它和报文头(请求头)的 Host 属性(字段)组成完整的请求 URL;
- 协议名称及版本号,即HTTP的版本号
报文所使用的HTTP版本,格式为:HTTP/<major>.<minor>;其中主要版本号(major)和次要版本号(minor)都是整数
三个字段之间都以空格分隔开,最后的“CR”和“LF”分别代表“回车”和“换行”,表示一行的结束;
HTTP 报文的第一行用于区分当前报文是请求报文还是响应报文,在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line);
HTTP请求报文和响应报文格式的区别就是开始行不同;
请求头部(header,首部、头部)
请求头部用来说明一些信息(例如描述客户端或者服务器的属性、被传输的资源以及应该实现连接);
请求头部可以有好几行,每一行都表示一个头部(header)信息,但也可以不使用;
- 每一头部(header)信息都由字段名和它的值组成,标准规定字段名是大小写不敏感的,但是不同程序在解析字段名时可能是大小写敏感的;
- 字段名和它的值用冒号(:)分隔,即格式为:“属性名:属性值”;而且在冒号后(域值前)可以添加任何数量的空格(一般会有一个空格);
- 每一行在结束的地方都要有“回车”和“换行”,表示一个头部信息的结束;
<name>:<value><CRLF>
HTTP 请求报文的头部字段主要分为(详细参见:HTTP头部字段):
整个请求头部结束时,还有一空行(“CR”和“LF”)将请求头部和后面的报文主体分开;
请求数据(请求体、报文主体(message body))
报文主体是报文要发送的数据,是第一个空行以后的所有部分;详细参见:实体、实体主体和报文主体
在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段;
注意:
- 由于HTTP是面向文本的(text-oriented),因此报文中的起始行和首部都只能是一些ASCII文本;而报文主体是一个可选的数据块,与起始行和首部不同的是主体可以是由任意数据组成的数据块(例如:文本或二进制数据),也可以为空;
- 若HTTP首部字段重复了的话,不同的浏览器处理机制不一样;有些浏览器会优先处理第一次出现的字段;有些浏览器会优先处理最后一次出现的字段
实例讲解
下面是一个完整的HTTP请求报文的例子:
GET /dir/index.htm HTTP/1.1 {请求行使用了相对URL} Host: www.xyz.edu.cn {此行是首部行的开始,这行给出主机的域名} connection: close {告诉服务器发送完请求的文档后就可释放连接} User-Agent: Mozilla/ 5.0 {表明用户代理是使用火狐浏览器Firefox} Accept-Language: cn {表示用户希望优先得到中文版本的文档} {请求报文的最后还有一个空行} |
请求资源的URL是相对URL(即省略了主机的域名),因为首部行(第2行)给出了主机的域名;
第3行是告诉服务器不使用持续连接,表示浏览器希望服务器在传送完所请求的对象后即关闭TCP连接;
这个请求报文没有实体主体;
浏览器地址栏输入www.baidu.com,打开控制台,查看Request Headers,看到如下信息:
GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Referer: 百度安全验证..... Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8 Cookie: BIDUPSID=670A04B660AAF2716D3120BEAF946A11; BAIDUID=2454D4.... RA-Ver: 3.0.8 RA-Sid: CA623F7A-20150914-060054-2b9722-5fde41 |
第一行为请求行: GET / HTTP/1.1 方法是GET,协议版本http1.1