OSI七层模型 :
![](https://img.haomeiwen.com/i12856424/567523fe4d858939.png)
Socket :
套接字,传输层端到端的协议,本质是一套封装了TCP/UDP/IP的API接口
不需要我们直接操作封装TCP/UDP/IP数据,通过调用Socket API ,自动把数据封装成TCP/UDP/IP数据
HTTP :
超文本传输协议,无状态协议,明文传输,基于Socket协议封装的一套应用层协议,对Socket进行了封装
HTTPS :
超文本传输安全协议,基于HTTP协议,通过SSL/TLS等对数据进行加密,用于安全的HTTP数据传输
HTTP版本:
HTTP 1.0,HTTP 1.1,SPDY,HTTPS,HTTP 2.0
HTTP版本区别:
HTTP 1.0 和 HTTP 1.1 区别:
1.缓存处理
1.0:只有If-Modified-Since,Expires
1.1:引入了Entity tag : If-None-Match(If-Match)
If-Unmodified-Since,If-Modified-Since等更多字段
2.断点续传
1.0:不支持
1.1:支持,header -> range:bytes=start-end
3.错误通知
1.1:增加了新的错误状态码:如409 , 410
4.Host头处理
1.0:默认一个IP对应一个服务器,一个服务器只有一个WebServer
1.1:增加 header -> Host: www.baidu.com
由于技术发展,现在一台服务器可以配置多个WebServer,这些WebServer共享一个IP地址
没有Host字段报400(bad request)
5.长连接
1.0:默认每次请求完毕后关闭连接(即每次都进行三次握手和四次挥手)
1.1:增加 header (Connection: keep-alive)
在规定的时间内保持连接状态,再次发送数据不用三次握手,四次挥手
连接保持时间(不可靠) : Keep-Alive: timeout=5, max=1000
关闭keep-alive : Connection: Close
通过发送空数据包确认链路是否连接状态(探测报文服务端可以设置)
SPDY :
Google开发的协议,不是代替HTTP协议,而是增强HTTP协议
SPDY 和 1.1 区别
1.多路复用
1.1: 每个不同的HTTP Request 都会建立一个TCP连接
SPDY:一个TCP连接上可以同时存在多个HTTP Request
2.优先级
在多路复用的情况下,设置某些请求的优先级,提前处理(比如用户登录和请求普通网页)
3.HTTP报头压缩:
SPDY压缩请求和响应HTTP报头,从而减少传输的数据包数量和字节数
4.HTTPS
强制使用SSL,让SSL协议在现存的网络设施下有更好的安全性和兼容性
5.服务端推送
1.1:client -> 请求数据,server -> 返回数据,server -> 无法主动推送数据
SPDY:允许服务器在需要时发起对客户端的连接并推送数据
HTTP 2.0 和 SPDY区别:
1.HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
2.HTTP2.0 消息头的压缩算法采用 HPACK ,而非 SPDY 采用的 DEFLATE
HTTP 2.0 和 HTTP 1.1 区别:
1.二进制分帧
帧:HTTP2.0通信的最小单位,所有帧都共享一个8字节的首部
其中包含帧的长度,类型,标志,还有一个保留位
消息:比帧大的通讯单位,是指逻辑上的HTTP消息,比如请求,响应等
由一个或多个帧组成
流:比消息大的通讯单位.是TCP连接中的一个虚拟通道,可以承载双向的消息.
每个流都有一个唯一的整数标识符
2.Header 压缩
3.多路复用和优先级(SPDY原理)
4.服务器推送
HTTP 三次握手
client->
SYN = 1(确认位,不携带数据)
seq = x(序号,随机数)
status = SYN-SEND(同步状态已发送)
server->
SYN = 1
ACK = 1(应答报文,不携带数据)
ack = x+1(client seq+1)
seq = y(序号,随机数据)
status = SYN-RCVD(同步收到状态)
client->
ACK = 1
ack = y+1(server seq+1)
seq = x+1
status = ESTABLISHED(已建立连接状态)
为什么不是两次:
client发送请求到server,中间由于路由延迟等原因导致超时
client重新发送请求,此时顺利与server建立连接
中间路由网络恢复,请求到达server
server如果不确认即建立连接会导致资源消耗(client永远不会发数据,因为已经超时)
HTTP 四次挥手
client->
FIN = 1
seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1)
status = FIN-WAIT-1
server->
ACK = 1
ack = u+1
seq = v
server -> CLOSE-WAIT
server端不再接受新的数据,但是如果存在没有传输完毕的数据,会继续传输
client->(收到server的应答后)FIN-WAIT-2
server->
FIN = 1
ack = w+1
seq = u+1
status = LAST-ACK
(server最后的数据发送完毕,向client发送结束包)
client->
ACK = 1
status = TIME-WAIT
(此时并没有断开,而是等到2*MSL(最长报文段寿命)后,才close(),超时后也会close())
为什么要等待2*MSL:
1.防止client端发送的结束数据server没有收到,此时server会再次发送FIN报
2.清理网络中旧的请求报文,防止新的请求中出现旧的报文
为什么是四次:
client发送断开连接信息,server收到后就判断当前数据是否已经传输完毕
如果没有传输完毕,只是确认收到断开请求,此时不会断开,而是继续发送数据
发送完毕后再发送断开请求,client确认后断开
HTTPS
摘要算法(数字指纹)
根据hash函数对数据生成128位(固定长度)的数字摘要
数字签名
摘要算法和非对称加密的应用
使用摘要算法生成128位的数字摘要
使用私钥对摘要信息进行加密
传递后对方通过摘要算法对公开信息进行hash,获取摘要信息
用传来的公钥对加密的信息进行解密,比较摘要信息
相同,表示证书没有被修改
数字证书
保证证书的合法性,防止中间人攻击
服务器把公钥和其他信息发给CA机构,机构对数据进行认证,并生成公钥和私钥
CA机构通过私钥对信息进行加密,生成数字签名
浏览器内置了各种顶级的CA证书,使用公钥解密并且解密后摘要相同,表示证书已被认证
单向认证
client->
ssl协议版本(SSL/SSLv1/SSLv2/TLSv1...)
加密算法(RSA)
随机数,以及其他信息
server->
检查是否支持ssl协议版本,不支持直接断开
支持则返回:SSL协议的版本号,加密算法,随机数,证书,其他信息
client->
检验证书
客户端根据server发来的证书中的算法对公开的信息hash,获取摘要信息
根据server证书内的公钥对证书的数字签名进行解密,获取摘要信息
比较摘要信息是否相同:相同,证书没有被擅改
通过浏览器内置的CA证书证明证书的合法性(对证书内的数字签名进行验证)
验证证书是否在有效期内
验证证书的域名是否正确
生成随机数,用server中的公钥进行加密,发送加密后的数据
server->
获取到加密后的数据,用秘钥对数据进行解密
通过对三个随机数进行操作获取对称加密的秘钥
发送数据
双向认证
client 验证完server的证书后,对随机数进行加密,并把client自己的证书发送给server
server收到加密数据后解密,并验证client的证书是否在自己的信任库中
其他步骤不变
HTTP 缓存机制
强缓存
Request:
Expires->
限定资源的过期时间(绝对值),超过后做网络请求(如果当前计算机时间不准确,会受到影响)
Cache-control->(优先级高于Expires)
max-age = 相对值(单位秒)
max-age = 0 == Response no-cache || max-age = 0
表示不管response怎么设置,在重新获取资源之前,先检验ETag/Last-Modified
public (可以被任意对象缓存,客户端和代理服务器)
private (不能被代理服务器缓存)
no-cache
Request 中设置 no-cache,效果类似于no-store,无论如何都会重新请求资源
no-store 不缓存资源
协商缓存
Response->
last-Modify : 文件最后修改时间
Request->
if-Modified-Since:
从字面上看,就是说:如果从某个时间点算起,如果文件被修改了....
1. 如果真的被修改:那么就开始传输,服务器返回:200 OK
2. 如果没有被修改:那么就无需传输,服务器返回:304 Not Modified.
用途:
客户端尝试下载最新版本的文件. 比如网页刷新, 加载大图的时候.
很明显: 如果从图片下载以后都没有再被修改, 当然就没必要重新下载了!
if-Unmodified-Since:
从字面上看,意思是:如果从某个时间点算起,文件没有被修改.....
1.如果没有被修改:则开始"继续"传送文件:服务器返回:200 OK
2.如果文件被修改:则不传输, 服务器返回:412 Precondition failed (预处理错误)
用途:
断点续传(一般会指定Range参数)
Response->
eTag : 文件的字符串(优先级高)(last-Modify 改进版)
1.文件需改的时间是按秒计算,请求太快,会造成错误
2.文件虽然已经修改,但是内容没有发生改变,结果认为没有修改
Request->
if-None-Match : 服务器返回的ETag信息
生成规则:
文件编号
文件大小
文件最后修改时间
最后做hash计算
网友评论