HTTP协议报文格式

php笔记 2019年02月23日

本篇笔记记录了HTTP协议的简单概念,工作流程和特点,以及报文格式,请求行和响应行,通用报头,请求报头,响应报头,实体报头以及响应状态等相关信息

简介

HTTP是HyperText Transfer Protocol(超文本传输协议)的缩写,用于WWW万维网客户端与服务器间超文本传输,HTTP是一个客户端和服务器端请求和应答的标准协议,HTTP协议属于TCP/IP协议栈的应用层

工作流程

1.HTTP客户端与服务端建立一个TCP套接字连接
2.HTTP客户端通过TCP套接字,向服务器发送一个文本的请求报文
3.HTTP服务器解析请求,定位请求资源。服务器将处理结果写入TCP套接字,由客户端读取
4.HTTP客户端和服务端根据请求头connection决定关闭TCP套接字连接或保持连接
5.客户端解析状态行,如果响应成功。然后解析每一个响应头,显示响应数据

特点

1.HTTP协议是无连接的,每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接
2.HTTP协议允许传输任意类型的数据,数据的MIME类型由Content-Type标记
3.HTTP协议是无状态协议。对于事务处理没有记忆能力,这意味着如果后续处理需要前面的信息,则它必须重传,换言之,每次请求必须传输完整的数据

报文格式

请求报文
请求行 请求头部(通用报头 请求报头) 空行 请求数据
响应报文
状态行 消息报头(响应报头 实体报头) 空行 响应正文
URI和URL区别和联系
URI:(uniform resource identifier)统一资源标识符,用来唯一的标识一个资源
URL:(uniform resource locator)统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何获取这个资源
请求行
请求方法 URI HTTP版本号 \r\n
响应行
HTTP版本号 状态码 状态消息 \r\n
通用报头

名称作用
Date表示消息产生的日期和时间
Connection允许发送指定连接的选项,例如指定连接是持续的还是立即断开,keep-alive或close
Cache-Control用于指定缓存指令,请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age
Pragma用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同

请求报头

名称作用
Host请求的主机名和端口号(默认为80)
User-Agent发送请求的用户信息,浏览器,操作系统等
Accept客户端接受的内容类型,如:text/html
Accept-Encoding客户端接受的数据编码,如:gzip
Accept-Language指定客户端所支持的语言,如:zh-CN
Accept-Charset指定客户端接受的字符集,如iso-8859-1,gb2312
Referer访问当前请求的页面的来源URL

响应报头

名称作用
Location用于重定向客户端到一个新的URL
Server包含处理请求的原始服务器的软件信息,与User-Agent请求报头是相对应的,如:nginx/1.14.2

实体报头

名称作用
Content-Type服务器返回的响应正文的类型,如:text/html
Content-length响应正文的长度
Content-Language响应正文的自然语言,如:zh-cn
Content-Encoding响应正文的编码方式,如:gzip
Transfer-Encoding传输编码方式,如:chunked分块编码
Last-Modified指示资源的最后修改日期和时间
Expires响应过期的日期和时间

请求方法
HTTP1.0定义了三种请求方法:GET,POST,HEAD
HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE,CONNECT

名称作用
GET请求指定URI资源。
HEAD与GET类似,但不返回响应正文
POST请求指定的URI资源,并在资源后附加新的数据
PUT请求服务器在指定URI下存储一个资源
DELETE请求服务器删除指定的URI资源
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。

响应状态代码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

名称作用
1xx表示服务器已收到请求,等待客户端继续执行操作
2xx表示请求已被成功接收、理解、接受
3xx表示客户端请求已被重定向继续处理
4xx客户端错误,请求有语法错误或请求无法实现
5xx服务器端错误,服务器处理请求时发生错误

常见状态码

状态码状态消息含义
200OK客户端请求成功
400Bad Request客户端请求有语法错误,不能被服务器所理解
401Unauthorized请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403Forbidden服务器收到请求,但是拒绝提供服务
404Not Found请求资源不存在,输入了错误的URL
500Internal Server Error服务器在处理请求时发生错误
503Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常

请求和响应示例

请求头部

GET /blog-660.html HTTP/1.1
Host: www.jmsite.cn
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://www.jmsite.cn/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

响应报头

HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 23 Feb 2019 04:36:04 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/7.2.12
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Encoding: gzip