## 概念
Hypertext Transfer Protocol, 超文本传输(转移)协议,是客户端和服务端传输文本制定的协议。构建WWW的具体的三项技术如下:
WWW: world wide web, 万维网
- HTML: Hypertext Markup Language, 超文本标记语言
- HTTP: Hypertext Transfer Protocol, 超文本传输(转移)协议 (HTTP是TCP/IP的应用层协议)
- URL: Uniform Resource Locator, 统一资源定位符号
> URI: Uniform Resource Identitier, 统一资源标示符号,URL是URI的子集
## TCP/IP
```
应用层(http/https/websocket/ftp...) => 定义:文本传输协议
|
传输层(tcp/udp) => 定义:端口
|
网络层(ip) => 定义:IP
|
链路层(mac&数据包) => 定义:数据包,MAC地址
|
实体层(光缆/电缆/交换机/路由/终端...) => 定义:物理
```
TCP/IP:
- 解释一:分别代表tcp协议和ip协议
- 解释二:如果按照网络五层架构,TCP/IP代表除了应用层其他层所有协议簇的统称
TCP/IP connect: TCP/IP的三次握手:
```
标有syn的数据包
------------->
标有syn/ack的数据包
client <------------- server
标有ack的数据包
-------------->
&#96;&#96;&#96;
TCP/IP finish: TCP/IP的四次握手:
&#96;&#96;&#96;
fin
<-------------
ack
client(或server) -------------> server(或client)
fin
------------->
ack
<-------------
&#96;&#96;&#96;
## HTTP 报文
HTTP 报文由三部分组成:
- Start Line
- Headers
- Entity Body
HTTP 报文分为两类:
- 请求报文
- 响应报文
### 请求报文Start Line
语法 : <方法> <请求URL> <版本>
#### HTTP Method
&#43; get: 获取资源&#xff0c;不携带http body,支持查询参数&#xff0c;大小2KB
&#43; post: 传输资源&#xff0c;http body, 大小默认8M&#xff0c;1000个input variable
&#43; put: 传输资源&#xff0c;http body&#xff0c;资源更新
&#43; delete: 删除资源,不携带http body
&#43; patch: 传输资源&#xff0c;http body&#xff0c;存在的资源局部更新
&#43; head: 获取http header,不携带http body
&#43; options: 获取支持的method,不携带http body
&#43; trace: 追踪&#xff0c;返回请求回环信息,不携带http body
&#43; connect: 建立隧道通信
### 响应报文Start Line
语法 : <方法> <状态码> <原因短语>
#### HTTP Status Code
&#43; 200: ok
&#43; 301: 永久重定向
&#43; 302: 临时重定向
&#43; 303: 临时重定向&#xff0c;要求用get请求资源
&#43; 304: not modified, 返回缓存&#xff0c;和重定向无关
&#43; 307: 临时重定向,严格不从post到get
&#43; 400: 参数错误
&#43; 401: 未通过http认证
&#43; 403: forbidden&#xff0c;未授权
&#43; 404: not found&#xff0c;不存在资源
&#43; 500: internet server error&#xff0c;代码错误
&#43; 502: bad gateway&#xff0c;fastcgi返回的内容web server不明白
&#43; 503: service unavailable&#xff0c;服务不可用
&#43; 504: gateway timeout&#xff0c;fastcgi响应超时
### HTTP Header Fields
常见通用头部
&#43; Cache-Control:
- no-cache: 不缓存过期的缓存
- no-store: 不缓存
&#43; Pragma: no-cache, 不使用缓存&#xff0c;http1.1前的历史字段
&#43; Connection:
- 控制不在转发给代理首部不字段
- Keep-Alive/Close: 持久连接
&#43; Date: 创建http报文的日期
常见请求头
&#43; Accept: 可以处理的媒体类型和优先级
&#43; Host: 目标主机域名
&#43; Referer: 请求从哪发起的原始资源URI
&#43; User-Agent: 创建请求的用户代理名称
&#43; COOKIE: COOKIE信息
常见响应头
&#43; Location: 重定向地址
&#43; Server: 被请求的服务web server的信息
&#43; Set-COOKIE: 要设置的COOKIE信息
- NAME: 要设置的键值对
- expires: COOKIE过期时间
- path: 指定发送COOKIE的目录
- domain: 指定发送COOKIE的域名
- Secure: 指定之后只有https下才发送COOKIE
- HostOnly: 指定之后Javascript无法读取COOKIE
&#43; Keep-Alive:
HTTP协议初期每次连接结束后都会断开TCP连接&#xff0c;之后HEADER的connection字段定义Keep-Alive&#xff08;HTTP 1.1 默认 持久连接&#xff09;&#xff0c;代表如果连接双方如果没有一方主动断开都不会断开TCP连接&#xff0c;减少了每次建立HTTP连接时进行TCP连接的消耗。
## COOKIE/Session
&#43; COOKIE: 工作机制是用户识别和状态管理&#xff0c;服务端为了管理用户的状态会通过客户端&#xff0c;把一些临时的数据写入到设备中Set-COOKIE&#xff0c;当用户访问服务的时候&#xff0c;服务可以通过通信的方式取回之前存放的COOKIE。
&#43; Session: 由于http是无状态的&#xff0c;请求之间无法维系上下文&#xff0c;所以就出现了session作为会话控制&#xff0c;服务端存放用户的会话信息。
## HTTPs
概念:在http协议上增加了ssl(secure socket layer)层。
&#96;&#96;&#96;
SSL层
|
应用层
|
传输层
|
网络层
|
链路层
|
实体层
&#96;&#96;&#96;
HTTPS 认证流程
&#96;&#96;&#96;
发起请求
---------------------------> server
下发证书
<--------------------------- server
证书数字签名(用证书机构公钥加密)
---------------------------> 证书机构
证书数字签名验证通过
client(内置证书机构证书) <--------------------------- 证书机构
公钥加密随机密码串(未来的共享秘钥)
---------------------------> server私钥解密(非对称加密)
SSL协议结束 HTTP协议开始
<--------------------------- server(对称加密)
共享秘钥加密 HTTP
---------------------------> server(对称加密)
&#96;&#96;&#96;
&#43; 核对证书证书&#xff1a; 证书机构的公开秘钥验证证书的数字签名
&#43; 公开密钥加密建立连接&#xff1a;非对称加密
&#43; 共享密钥加密
## Websocket
&#43; 基于http协议建立连接&#xff0c;header的upgrade字段转化协议为websocket
&#43; 全双工通信&#xff0c;客户端建立连接
## HTTP2
&#43; 多路复用&#xff1a;多个请求共享一个tcp连接
&#43; 全双工通信
&#43; 必须https://
&#43; 头部压缩
&#43; 二进制传输