1. HTTP
超文本传输协议; 是基于TCP
的;
常见方式有GET, POST, HEAD, PUT, DELETE, OPTIONS
;
特点:
- 1.无链接, 有建立链接和释放链接的过程;
- 2.无状态; 如果没有
session
或者cookie
即使是多次请求服务端也没法确认客户端的身份;
知识点:GET和POST的区别有哪些?
GET
POST
GET
请求参数以?
分隔拼接到URL
后面;POST
放在Body
中;GET
参数长度限制2048字节;POST
无限制;GET
是获取资源;POST
是处理资源;安全性, 幂等, 可缓存; 非安全性, 非幂等, 不可缓存; 安全性: 不引起服务端的任何状态变化;
幂等性: 同一个请求执行多次效果是否一样;
缓存性: 一个请求是否可以被缓存;
日常开发中常见的状态码:
200:正常相应;
404:请求错误;
500:服务器内部错误;
持久连接
持久连接有点:提升网络请求销量, 在一段时间内即使多次请求也只执行一次链接和断开操作;
持久连接头部字段设置
#允许客户端持久连接
Connection:keep-alive
#100s内有效, 不设置表示永久有效
Keep-Alive: timeout=100
知识点: 持久连接如何判断数据是否已经已经传输完毕?
1: 判断数据是否已经达到Content-Length
所设置的大小;
2: 如果分块传输数据, 根据chunked
编码数据判断, 如果chunked
编码的数据最后有chunked
的块, 则表示完成;
2.HTTPS
简单理解为安全的HTTP
; HTTPS
= HTTP
+ SSL/TLS
;
HTTPS使用了哪些加密方式?
建立链接的过程使用非对称加密(耗时);(非对称加密:公钥加密, 私钥解密)
后续通信采用对称加密;(对称加密: 只有一个密钥)
加密方式
3. TCP/UDP
TCP
:传输控制协议, 提供面向链接可靠的字流服务, 提供超时重发, 丢弃重复数据, 检测数据控制流量等功能, 正式收发数据之前需要建立三次握手;
建立链接三次握手:
- 1.客户端发送
syn
包,并进入syn_send
(请求链接)状态, 并等待服务器确认; - 2.服务器收到客户端的
syn
(序列编号)包后,也发送一个syn
(syn=k
, 即syn+ack
)包,并进入syn_reveive
状态; - 3.客户端收到服务器的
syn+ack
包,向服务器发送确认包ack(ack = k+1)
,此包发送完毕则和服务器进入建立链接(ESTABLISHED
)状态,完成三次握手;
为什么要三次握手?
假设只有两次握手, 那么加入客户端发发送的syn
包超时了, 客户端会启用重试策略再次发送syn
包, 后边的的syn
包先被接受, 然后链接成功, 接着最先发送的syn
被接受到了, 就会再次链接; 然而初衷只是建立一次链接; 三次握手有效解决这个问题;
断开连接的四次握手:
- 1.客户端发送
fin
包到服务器, 请求是否可以断开; - 2.服务器收到收发送
fin
包,确认可以断开; - 3.服务器发送
ack
包,并断开连接; - 4.客户端收到服务器的包并断开链接,同时发送
ack
包确认断开;
UDP
:用户数据报协议, 面向非链接, 不保证可靠性的数据传输服务, 没有超时重发等一系列等机制, 故而传输速度很快;
不与对方建立链接, 而是直接把数据包发送过去, UDP适用于一次只传送少量数据对可靠性要求不高的应用环境;
4. Socket
socket
是针对TCP/IP
协议的封装, socket
本身并不是协议, 而是一个API
,通过socket
我们才能使用TCP/IP
协议;
基于TCP
的socket
如何保证数据的完整性, 读到包头开始,直到读到相应的包尾,取出中间的buffr,认为是一个完整的数据包;
客户端的使用流程:
- 1.引入头文件;
- 2.创建socket;
- 3.建立链接(基于TCP, 三次握手流程);
- 4.发送数据到服务器;
- 5.从服务器接受数据;
- 6.关闭链接;
5. DNS
域名到IP地址的映射,DNS
解析请求采用UDP
明文数据报;
常见的查询方式有递归查询和迭代查询
DNS劫持
问题:由于采用UDP明文数据报, 这样就容易被钓鱼DNS
劫持
返回错误的IP
地址; 注意:DNS劫持
和HTTP
是没有关系的, 因为劫持是发生在HTTP
建立之前的;
可以通过HTTPDNS
和长连接
方案解决DNS
劫持问题;
6. Session&Cookies
Cookies
是保存在客户端用来记录区分用户状态的数据;
Session
是保存在服务器端用来记录区分用户状态的数据;
Session
依赖于Cookies
的机制;
名词解释及链接
ack 即确认字符, 在TCP/IP协议中如果接收方成功收到数据那么会回复一个ack数据(通常ack有自己固定的格式和长度大小, 由接收方回复给发送方);
syn即同步序列编号, TCP/IP建立链接使用的握手信号,TCP链接的第一个包; (syn攻击, 大量发送此类的包, 服务器);
fin带有标志位的数据包用来结束一个TCP回话,但对应的端口仍处于开放状态, 准备接收后续的数据;
参考文章
iOS HTTP chunked
HTTP的长连接和短连接
HTTP Keep-Alive模式
HttpDNS功能说明及实现