本篇笔记记录了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资源 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
响应状态代码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
名称 | 作用 |
---|---|
1xx | 表示服务器已收到请求,等待客户端继续执行操作 |
2xx | 表示请求已被成功接收、理解、接受 |
3xx | 表示客户端请求已被重定向继续处理 |
4xx | 客户端错误,请求有语法错误或请求无法实现 |
5xx | 服务器端错误,服务器处理请求时发生错误 |
常见状态码
状态码 | 状态消息 | 含义 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在,输入了错误的URL |
500 | Internal Server Error | 服务器在处理请求时发生错误 |
503 | Server 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