1. TCP
- 阮一峰
- 掘金
- Transmission Control Protocol
- 传输层协议
- SEQ:Sequence
- 可靠:通过
SEQ和ACK实现,ACK为期望收到的下一个报文的SEQ,连续三次收到同一个ACK后服务端会重传报文;或者报文超时没有收到ACK也会重传
- 慢启动:受硬件影响,发得快可能丢包越多,所以需要从低速慢慢加速,根据收到的
ACK和窗口大小确定速度
三次握手
- 客户端发送
SYN=1,seq = x
- 服务端接收到发送
SYN = 1,ACK = x+1,seq = y
- 客户端发送
ACK = y+1
四次挥手
(1)过程
- 假设
主机A发送FIN报文,意为主机A数据发送完了
主机B接收到后,发送ACK,主机A收到后进入FIN-WAIT-1状态
主机B发送完剩下的数据后,发送FIN
主机A收到后,发送ACK,进入TIME_WAIT状态,等待2MSL后正式进入CLOSED状态,服务端收到ACK后立刻进入CLOSED状态
(2)为什么需要四次
主机B可能仍有未发送完的数据,发送完了才能发FIN
(3)为什么需要等待2MSL
MSL:Maximun Segment Lifetime,报文的最大生存时间,即超时重传的时限
主机B没收到ACK会再次发送FIN,所以等待2MSL可以确保主机B已收到ACK
- 防止本次连接干扰其他连接,
2MSL后本次连接的所有报文都会失效
2. DNS
-
掘金
-
Domain Name System
-
域名->ip 或 ip->域名
-
查询过程是递归+迭代的过程
-
TLD:Top Level Domain
查询过程:
- 向
本地DNS服务器发送请求
本地DNS服务器向根DNS服务器发送请求
根DNS服务器返回TLD服务器列表
- 本地
DNS服务器随机挑选一台TLD服务器发送请求
TLD服务器返回权威DNS服务器列表
本地DNS服务器向其中一台权威DNS服务器发送请求
- 获得
ip地址,返回给请求的主机
3. HTTP
- 掘金
- 阮一峰
Hyper Text Transform Protocol
- 超文本,其中最常用的是
HTML
跨域
- 同源策略:浏览器会拦截非同源的请求
- 同源:协议
scheme、主机host、端口port都相同
(1)CORS:跨域资源共享
- 浏览器会自动在请求头当中,添加一个
Origin字段。服务器拿到请求之后,在回应时对应地添加Access-Control-Allow-Origin字段,如果Origin不在这个字段的范围中,那么浏览器就会将响应拦截。
Access-Control-Allow-Origin值为*则不会拦截
(2)JSONP
- 原理:
script标签可以通过src上的地址发出get请求,不受同源策略影响,并能通过回调拿到数据
script标签只能执行get请求,但兼容性好
<script src='http://aaa.bbb.com/something?callback=callbackFun' />
<script>
const callbackFun = data => {
}
</script>
(3)Nginx反向代理
- 原理:将前端和后端服务器都代理到
Nginx服务器上,所以它们就不跨域了
(4)其他方法
POST 和 GET 的区别
GET只支持ASCII字符,POST没有限制
GET全部参数都在URL上,不安全
- 实现时除了火狐浏览器,其他浏览器的
POST请求会分成两个TCP包,先发Header,收到100(CONTINUE)后继续发送Body
GET请求会被浏览器主动缓存,并留下历史记录,POST不会
GET是幂等的,POST不是
缺点
无状态,可能会传输大量重复的HTTP头部
明文传输,使用文本形式的数据,不安全
队头阻塞,HTTP/1.1允许TCP复用,但通信会依次进行,服务器只有处理完一个回应,才会进行下一个回应,如果前面的回应特别慢,则后面就会有许多的请求排队
优点
无状态,不用维持状态,减轻服务器压力
可靠传输
灵活可扩展,只规定了基本框架,语义自由,并且可以传输多种格式数据
请求-应答
4. HTTP/1.1
持久连接,TCP连接默认不关闭
管道,同一个TCP连接可发送多个请求
Content-Length,声明本次回应的长度,后面的字节即为下一个回应
分块传输编码,Transfer-Encoding: chunked允许分块传输数据,数量未定,每个数据块第一行为该块的长度,最后一个为0,表示本次数据传输完毕
5. HTTP/2
二进制协议
多工,可以同时发送多个请求或回应,避免队头阻塞
数据流。数据包不按顺序发送,需要标记来自哪个请求或回应。每个请求或回应里所有的数据包成为一个数据流。数据流发送到一半时,客户端和服务端都可以取消该数据流
头信息压缩,使用gzip或compress压缩,并且相同的信息不再发送,而是改为维护一张头信息表
服务器推送
常用状态码
| 状态码 | 含义 | 其他 |
|---|
| 200 | 成功 | |
| 204 | 处理成功,但无资源返回 | |
| 301 | 永久重定向 | |
| 302 | 临时性重定向 | |
| 304 | 服务器端资源未改变,可直接使用缓存 | |
| 400 | 请求报文语法错误 | 服务器无法处理 |
| 401 | 未认证 | 用于浏览器自己的认证 |
| 404 | 资源未找到 | |
| 500 | 服务器内部错误 | |
| 503 | 服务不可用 | 服务器忙不过来了或在停机维护 |
HTTP方法
| 方法 | 作用 | 其他 |
|---|
| GET | 获取资源 | |
| POST | 传输实体主体 | |
| PUT | 传输文件 | |
| HEAD | 获得报文首部 | 确认URI的有效性及资源的更新日期 |
| DELETE | 删除文件 | |
| OPTIONS | 询问支持的方法 | |
| TRACE | 追踪路径 | |
| CONNECT | 要求用隧道协议连接代理 | 主要用于SSL和TLS |
| | |