模型
- OSI 七层网络模型分为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
- TCP/IP 四层网络模型:应用层,传输层,网际层,网络接口层。
应用层:网络与用户之间的接口,报文
表示层:数据的加密,压缩,格式转换
会话层:管理主机间的回话进程
传输层:实现端到端的可靠传输,段
网络层:实现不同网络间的路由选择,数据包
链路层:实现物理设备的寻址,帧
物理层:提供一个传输数据的物理媒体,比特流
过程:应用层将数据报文发送给传输层,传输层添加上TCP头部信息,再将数据段发送给网络层,网络层加上IP头部信息,再将数据包发送给链路层,链路层加上Mac信息及校验码,再将帧发送到物理层,物理层以比特流的方式在网络中传输。
协议
- 应用层
基于TCP
- HTTP超文本传输协议:是一个简单的请求-响应协议,现在主要的场景是 web服务,就是网页的传输,默认使用tcp的80端口
- HTTPs:是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性,默认使用tcp的443端口
- FTP:文本传输协议,21端口
基于UDP
- DNS:域名系统,将域名映射为ip地址,53端口
- DHCP:动态主机配置协议,指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码,默认使用UDP的67和68端口
- 传输层
- TCP:传输控制协议。提供可靠的面向连接的服务,传输数据前须先建立连接,结束后释放。全双工信道。可靠、有序、无丢失、不重复
- UDP:用户数据报协议。发送数据前无需建立连接,不使用拥塞控制,不保证可靠交付,最大努力交付
- IP层
- IP协议:网络中互联的协议
- ARP:地址解析协议,将IP地址映射为MAC地址
- 链路层
- ppp:点对点协议
TCP协议
三次握手
客户端首先向服务端发送连接请求,服务端收到请求后回复ack,客户端收到ack后回复ack,此时客户端到服务端的连接建立。双方开始通信,每次收到data后都会给对方发送ack确认。
为什么要三次握手?
- 如果只有两次握手:
1.A给B发出请求连接信号
2.B接收到并发出请求连接
如果这时B发出的信号丢失,那么将会握手失败,所以A需要回复确认信息给B; - 如果有四次握手:
1.A给B发送请求连接信号
2.B收到回复确认信号
3.B发送请求连接信号
4.A发送确认信号
显然2,3两步可以合并;
四次挥手
客户端向服务端发起结束通信的请求,服务端收到请求后回复ack确认收到。当服务端发送完所有数据后请求断开连接,客户端收到请求后回复ack确认收到,服务器和客户端的通信断开。
为什么要等待2MSL后再断开?
- 若是客户端确认断开连接的ack丢失了,则服务器会重传FIN;无论是收到还是丢失,客户端都需要等待,如果丢失了ack,服务器会在2MSL的时间段内重传,如果2MSL时间段内没有收到信息,就可以确定断开连接了。
2MSL( Maximum Segment Life) = 去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。
为何一定要等2MSL?
- 如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的TCP报文可能与新TCP连接报文冲突,造成数据冲突,为避免此种情况,需要耐心等待网络老的TCP连接的活跃报文全部死亡,2MSL时间可以满足这个需求。
HTTP/HTTPS
http:超文本传输协议
http 1.0
上图一,使用短连接,即每次请求都会经历三次握手和四次挥手。
不足:
- 连接无法复用:即短连接。
- head of line blocking:队头阻塞,上图三。若之前的请求遇到了阻塞,则后面的请求即使处理完毕了也要等待阻塞的请求处理完毕。
http 1.1
上图二,支持长连接和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在http 1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
不足:head of line blocking(上图三)
http 1.*存在的问题
- 明文传输;
- 队头阻塞;
- header内容太长;
- server不能主动push;
http 2.0
http 2.0使用多路复用技术(Multiplexing),允许同时通过单一的连接发起多重的请求-响应消息。(上图四)
改进:
①二进制传输(进行了压缩)
②多路复用,单连接 + 帧
③header头部压缩
④server可以主动push
HTTPS
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,用SSL(Secure Sockets Layer)协议对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词。
对称加密 / 非对称加密
- 对称加密:加密秘钥和解密秘钥相同
f(k,data) = value
f(k,value) = data- 非对称加密:加密秘钥和解密秘钥不同
f(pk,data) = value
f(sk,value) = data
握手过程
- 浏览器将自己支持的加密算法,SSL版本发送给服务端。
- 服务端从中选择出一组加密算法,SSL版本,hash算法,并将自己的身份信息以证书的形式发给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
- 浏览器收到证书后:
①验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
②如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
③使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给服务器。 - 服务器收到数据后:
①使用私钥将信息解密取出密码,使用密码解密浏览器的发来的握手消息,并验证hash值是否与浏览器发来的一致。
②使用密码加密握手消息,发送给浏览器
5.浏览器解密并计算握手消息的hash,如果与服务器发来的hash一致,此时握手过程结束。
其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而hash算法用于验证数据的完整性。