1. 什么是HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
2. 消息结构
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
2.1 首行
2.1.1 请求首行
- 三要素:请求方法、URL、协议版本,且三要素以空格间隔,并以 \r \n作为结尾
- 请求方法(多种):GET(向服务器请求html数据) / POST(向服务端提交数据) / HEAD / PUT / DELETE / OPTION / PATCH
- GET:没有正文的,提交数据通过url中的查询字符串完成;
- POST:提交表单数据到正文中,正文没有数据限制;
- HEAD:获取资源,没有正文,但是head在获取资源的时候时不要正文的,只获取头部信息;
- URL(统一资源定位符):长度是有限制的1k, 4k
- 协议:HTTP/1.1 ( 0.9 -> 1.0 -> 1.1 -> 2 )
2.1.2 响应首行
- 以空格进行间隔包含三大要素:协议版本、响应状态码、状态码描述 以 \r \n 作为结尾;
- 响应状态码:五大类:1xx / 2xx / 3xx / 4xx / 5xx;
- 1xx:描述信息;2xx:请求正确处理;3xx:重定向;4xx:客户端错误;5xx:服务端错误;
2.2 头部 - 头部中都是一个个key(键值对): val形式的键值对,并且键值对之间以 \r \n 作为间隔(每一键值对都以 \r \n 作为结尾);
- key:val \r \n。
【HTTP常见的header】
- Content-Type:正文数据类型(text/html等);
- Content-Length:Body的长度;
- Host:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent:声明用户的操作系统和浏览器版本信息;
- Referer:当前页面是从哪个页面跳转过来的;
- Location:搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能;
2.3 空行
- \r \n 间隔头部与正文,接受http数据的时候,头部的结尾就是两个连续的\r \n \r \n。
2.4 正文
- 客户端提交给服务端的数据/服务端响应给客户端的数据。