分层协议模型
- 物理层,用电压高低表示0/1,以及光的闪灭进行信号物理化
- 链路层(MAC头)代表驱动。如wifi/以太网等传输协议,以太网协议规定,一组电信号构成一个数据包,我们把这个数据包称之为帧。每一个桢由包头(Head)和数据(Data)两部分组成。把网络层的包再打包成物理层传输帧。
- 网络层(IP头),主要是IP协议工作的层,不能让所有通信都用广播的形式,通过子网与IP完成了通信目的地的确定。
- 传输层(TCP头/UDP头),主要简历端口到端口的通信,使得数据给到正确的进程。
- 应用层(http头),http,ftp都是应用层协议
可细分会话层保持通信,表示层转码,应用层软件使用。
TCP
连接排队
目前浏览器同域名页允许6-8个连接,如果满则排队,不满直接连接。
TCP连接,握手挥手
- 客户端发送,SYN为1,Seq=x;进入send状态太等待确认
- 服务器接收SYN,确认后ack=x+1,SYN为1,Seq为y;打包发送
- 客户端接收,ack为y+1,发送ACK成功后连接成功。
TCP流量控制,窗口滑动机制
用于防止发送方发送过快而造成丢包等问题。
主要使用窗口滑动机制解决,被动方接收时带有ack+rwnd,主动方只能从ack位置向后的rwnd长度内的内容选择发送。
发送后启动一个计时器,如果没有被返回ack则重发。如果发送了rwnd长度满了没有新的窗口,则暂停发送。
TCP拥塞控制
慢开始
防止一开始就注入大量接收方难以接收的数据。rwnd从一个小值开始,如果通信成功则使得窗口变大一般为指数级增长。
拥塞避免
ssthresh
规定一个长度,如果cwnd超过这个长度则不适应慢开始改为拥塞避免。
慢开始cwnd指数级增加,改为线性增加避免拥塞。
一旦发生了网络拥塞,如丢包则把这个值变为拥塞发送时候的窗口值的一半。并把cwnd重置为1开始。
快重传与快恢复
报文段1/2/3/4
如果报文3丢失,如何让发送方快速知道丢失而不必等待计时器到期?
快重传规定在接收2后,如果接收到了4/5而不是3,则重复确认2,当发送方接到连续的三个报文2的确认则认定为3丢包了,立即重传3;
快恢复
此时重传发生了丢包,按理更改ssthresh阈值后窗口长度从1开始。
快恢复规定不从1开始,直接设置为ssthresh直接进入拥塞避免的线性增加阶段。
http
无状态连接,在请求完需要的数据后立刻挥手不再保持连接。
(1.1加入了长连接,保持连接可以省区建立连接的过程)
code
- 1XX 请继续
- 2XX 成功
- 3XX 重定向
304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况,如使用缓存情况下
输入baidu.com后,最终打开的是www.baidu.com 因为301重定向了 - 4XX 客户端错误
403 forbidden,表示对请求资源的访问被服务器拒绝
404 not found,表示在服务器上没有找到请求的资源 - 5XX 服务器错误
500 internal sever error,表示服务器端在执行请求时发生了错误
503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
版本
-
1.0 单次连接只进行一次交互
-
1.1 可以长连接一次连接多次交互,并可以管道化。
除了get/post/head之外,引入了put/delete/patch/option等。
强化了缓存管理和控制Cache-Control、ETag/If-None-Match -
2.0 多路复用,头压缩,转为二进制协议。 二进制帧
它把TCP协议的部分特性挪到了应用层,把原来的"Header+Body"的消息"打散"为数个小片的二进制"帧"(Frame),用"HEADERS"帧存放头数据、"DATA"帧存放实体数据。HTP/2数据分帧后"Header+Body"的报文结构就完全消失了,协议看到的只是一个个的"碎片"。
头压缩
应用交互上百个通信,头部中很多重复字段,压缩规定客户端与服务器共同维护一个字典,存下常用头内容,后续传输使用字典索引代表相应内容。哈夫曼编码表示长字符串。
多路复用
原先一个域名允许创建6-8个连接进行并行通信。
现在HTTP2建立一个TCP连接,一个连接上面可以有任意多个流(stream)不需要新开新的TCP。
且因为二进制帧消息分割成一个或多个帧在流里面传输。帧传输过去以后,再进行重组,形成一个完整的请求或响应。解决队头阻塞。所有信息可以随便发送不用排队。(这版HTTP可以带一个31bit的优先值)
一个堵了全嘎掉
因为重传机制和乱序互传,一个丢包链接里所有数据全得重传。
HTTPS
就是HTTP使用了TLS证书进行安全验证
综合使用了对称加密、非对称加密、身份认证
非对称加密运算速度比对称加密快很多
TLS采用使用非对称加密交换对称加密密钥的方法实现,服务器发送公钥,客户端用公钥加密一个对称加密钥还给服务端。
重点在于如何在交换过程中确定密钥发送是来源于可信的服务器而没有被拦截
或者说如何确保拿到的公钥没有被掉包
CA证书
将上文中的公钥存在一个证书中,为了确保公钥没有被掉包,规定一起新人证书颁发机构,让他帮忙。
证书在颁发时用CA私钥加密了证书的所有者以及其他明文信息以及公钥的哈希文,生成了只有自己有私钥的密文签名。
客户端拿到后对密文进行CA公钥解密,解密后带有证书的来源所有者和对应公钥,与目标服务器信息比对(哈希文比对),相等则没有被掉包;