概念
Hyper Text Transfer Protocol 超文本传输协议
传输协议 : 定义了客户端和服务器通信时,发送数据的格式
特点
- 基于 TCP/IP 的高级协议
- 默认端口号:80
- 基于请求/响应模型的:一次请求对应一次响应
- 无状态的:每次请求之间相互独立,不能交互数据
历史版本
- 1.0:每一次请求响应都会建立新的连接
- 1.1:复用连接
请求消息数据格式
请求行
格式:
请求方式 请求 url 请求协议/版本
Get /login.html HTTP/1.1
请求方式:
Http 协议中有 7 种请求方式,常用的两种:
GET:
- 请求参数在请求行中,在 url 后
- 请求的 url 长度有限制
- 不太安全
POST:
- 请求参数在请求体中
- 请求的 url 长度没有限制
- 相对安全
请求头
客户端告诉浏览器一些信息
格式:
请求头名称:请求头值
常见的请求头:
User-Agent:浏览器告诉服务器,访问所使用的浏览器版本信息
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
Referer:告诉服务器,我(当前请求)从哪里来
作用:防盗链;统计工作
请求空行
空行,就是用于分割 POST 请求的请求头和请求体的
请求体(正文)
封装 POST 请求消息的请求参数
POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan
响应消息数据格式
响应行
格式:
协议/版本 响应状态码 状态码描述
响应状态码:服务器告诉客户端浏览器本次请求和响应的状态
- 状态码都是三位数字
- 分类:
- 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送 1xx 状态码
- 2xx:成功。代表:200
- 3xx:重定向。代表:302(重定向),304(访问缓存)
- 4xx:客户端错误。代表:404(请求路径没有对应的资源),405(请求方式没有对应的 doXxx()方法)
- 5xx:服务器错误。代表:500(服务器内部出现异常)
响应头
格式:
响应头名称:值
常见的响应头:
Content-Type:服务器告诉客户端本次相应数据格式以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应体数据
值:
- in-line:默认值,在当前页面内打开
- attachment;filename=xxx:以附件形式打开响应体。文件下载
响应空行
响应体
响应体内容就是传输的数据
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>
HTTP状态码
2XX Success(成功状态码) 请求正常处理完毕
- 200 OK:表示从客户端发送给服务器的请求被正常处理并返回
- 204 NO Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回)
3XX Redirection(重定向) 需要进行附加操作以完成请求
- 301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
- 302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL) - 303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
302与303的区别:后者明确表示客户端应当采用GET方式获取资源 - 304 Not Modified:表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是请求为满足条件的情况下返回改状态码;
- 307 Temporary Redirect:临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况);
4XX Client error(客户端错误) 客户端请求出错,服务器无法处理请求
- 400 Bad Request:表示请求报文中存在语法错误;
- 401 Unauthorized:未经许可,需要通过HTTP认证;
- 403 Forbidden:服务器拒绝该次访问(访问权限出现问题)
- 404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
- 405 : 服务器不支持对应http方法get/post
5XX Server error(服务器错误) 服务器处理请求出错
- 500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;
- 503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求;
HTTPS
HTTP + SSL 在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。
HTTPS数据加密,可保证数据私密性、完整性,防止中间人攻击。
流程
- 浏览器将自己支持的一套加密算法发给服务器,同时发一个浏览器随机数
- 服务器向浏览器发送选择的加密算法、服务器生成的随机数、服务器数字证书
- 浏览器收到证书后对证书的CA签名进行验证,如果验证通过,会从证书中拿到服务器的公钥
- 浏览器对浏览器随机数+服务器随机数进行处理,生成预备主密码
- 浏览器用服务器的公钥对预备主密码进行加密,发给服务器。
- 服务器收到后使用自己的私钥解密出预备主密钥
- 浏览器和服务器分别使用预备主密钥和两个随机数,生成共享主密钥
- 二者使用共享主密钥,使用对称加密算法加密数据