TCP四次挥手过程
TCP是面向连接的服务;三次握手(建立连接)和四次挥手(关闭连接);使用滑动窗口机制进行流量控制;TCP要保证在所有可能的情况下使得所有的数据都能够被投递,当你关闭一个socket时,主动关闭一端的socket将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态,这的确能够保证所有的数据都被传输。
1)首先A B端的TCP进程都处于established状态, 当A的应用程序传送完报文段,就会去 主动关闭 连接。A 会停止发送报文段(但是还会接收),并向B发送[FIN = 1,seq=u]数据,之后进入FIN-WAIT-1状态;
2)B接收到A发送的请求之后,会通知应用进程A已经不再发送数据,B会向A发送ACK确认数据[ACK=1,seq=v,ack=u+1],B进入 CLOSE-WAIT状态, A接收到B发送的数据之后,A进入FIN-WAIT-2状态;此时A到B方的连接已经关闭了。
3)当B的应用进程发现自己也没有数据需要传送,B应用进程就会发出 被动关闭 的请求,B此时向A发送[FIN=1,ACK=1,seq=w,ack=u+1]数据,并且进入LAST-ACK状态;【所以D不对】
4)A接收到B发送的数据之后,向B发送确认数据[ACK =1,seq=u+1,ack=w+1],进入TIME-WAIT状态,等待2MSL之后关闭连接进入CLOSED状态;B接收到A发送的确认之后进入CLOSED状态。B到A方的连接关闭
HTTP1.0 / HTTP/2.0
关键之一就是在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。首部信息封装到HEADER frame而Request Body则封装到DATA frame
- 单连接多资源的方式,减少服务端的连接压力,内存占用更少,连接吞吐量更大
- 由于TCP连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快
- 首部压缩,HTTP/1.1不支持首部压缩,出现了SPDY和HTTP/2.0,SPDY使用的是通用DEFLATE算法,HTTP/2使用HPACK算法
服务端推送,
HTTP/2是二进制(而文本)协议,因此更简洁高效;
- 它针对每个域只使用一个多路复用的连接,而不是每个文件一个连接;
- 首部使用特制的HPACK协议(而非SPDY中使用的gzip)压缩;
- HTTP/2设计了复杂的优先级排定规则,帮助浏览器首先请求最急需的文件,而NGINX已经支持(SPDY的方案要简单一些)。
- RFC7540 笔记(一)——概述 - laike9m’s blog HTTP/2的RFC文档
HTTPS交互过程
- 客户端发送“ClientHello”消息,消息包含 SSL 的版本、客户端支持的加密套件和数据压缩算法及随机数1。
- 服务器响应“ServerHello”消息,消息包含选定的加密套件、选定的数据压缩方法、会话标识,数字证书及另一个随机数2。
- 客户端( Web 浏览器)验证服务器的SSL数字证书的有效性,不通过则提示警告。
- 客户端发送“客户端密钥交换”消息。此消息包含 pre-master secret(用于生成对称加密密钥生的随机数3)。
- 客户端使用一系列加密运算将 [随机数1 随机数2 随机数3] 转化为 master secret,其中将派生出所有用于加密和消息认证的密钥。
- 服务器使用一系列加密运算将 [随机数1 随机数2 随机数3] 转化为 master secret,其中将派生出所有用于加密和消息认证的密钥。
- 客户端发出“更改密码规范”通知服务器端之后使用协商好的对称加密算法及密钥通信。
- 服务器发出“更改密码规范”通知客户端之后使用协商好的对称加密算法及密钥通信。
- SSL握手结束,使用对称加密算法进行加密通信。
关于http返回状态
302和301的区别就在于:302重定向是临时的,下次浏览器访问同样是访问原链接。而301重定向是持久的。下次浏览器会直接访问新链接。所以当确定某域名下已经实现了 HTTPS,可采用301重定向。
参考资料
就是要你懂 TCP
关于TCP 半连接队列和全连接队列
浅谈推进全站 HTTPS 项目-工程篇