OSI(开放式系统互联通信)参考模型分为应用层
、表示层
、会话层
、传输层
、网络层
、数据链路层
、物理层
、;
TCP/IP模型分为应用层(应用层,表示层,会话层)
、运输层
、网际层
、网络接口层(数据链路层、物理层)
五层参考模型分为应用层
、传输层
、网络层
、数据链路层
、物理层
HTTP
TCP报文段结构
TCP报文段结构包含TCP首部和TCP数据部分
TCP首部=源端口+目的端口+
序号(seq)
+确认号(ack)
+数据偏移(标记相同序号下的不同数据段)+保留+标志位+窗口(流量控制)+检验和+选项(长度可变)+填充;标志位=URG(紧急指针位)+
ACK(确认位)
+PSH+RST(复位)+SYN(同步序列位)
+FIN(结束位)
其中除了
选项
和填充
其余的字段固定长度为20个字节
运行原理
- 发起HTTP请求
建立TCP连接(建立逻辑连接,保证数据可靠),也叫做三次握手
- 客户端发出请求报文段,首部包含
SYN(同步序列位)=1,seq(序号)=x;
客户端状态为SYN-SENT
; - 服务端收到并同意请求,返回确认报文段,即:
ACK=1(确认位),ack(确认号)=x+1;
同时向客户端发送同步请求,报文段首部包含SYN=1,seq(序号)=y;
服务端状态由LISTEN
变为SYN-RCVD
; - 客户端收到后进行回复确认,报文段首部包含:
AKC=1(确认位),ack(确认号)=y+1,seq(序号)=x+1;
客户端状态由SYN-SENT
变为ESTABLISHED
, - 当服务端再次收到确认报文后,连接建立成功;服务端状态变
SYN-RCVD
变为ESTABLISHED
;
- 客户端发出请求报文段,首部包含
数据传送
关闭TCP连接(客户端和服务端都可以发起关闭请求),也叫做四次挥手
- 若客户端不再向服务端发送数据时,客户端首先发送请求报文段,首部包含
FIN=1(结束位),seq(序号)=x;
客户端状态由ESTABLISHED
变为FIN-WAIT-1
; - 服务端收到后回复确认,报文段首部包含:
ACK(确认位)=1,ack(确认位)=x+1,seq(序号)=y;
服务端状态由ESTABLISHED
变为CLOSE-WAIT
; - 客户端收到回复后状态由
FIN-WAIT-1
变为FIN-WAIT-2
; - 一段时间后,服务端确认不再向客户端传输数据,再次向客户端发送请求报文段,首部包含:
FIN(结束位)=1,ACK(确认位)=1,ack=x+1,seq(序号)=z;
服务端状态由CLOSE-WAIT
变为LAST-ACK
; - 客户端收到后进行回复确认,报文段首部包含:
ACK(确认位)=1,ack(确认号)=z+1,seq(序号)=x+1;
客户端状态由FIN-WAIT-2变为TIME-WAIT - 服务端收到报文后状态由
LAST-ACK
变为CLOSED
- 两分钟后,客户端断开连接,状态由
TIME-WAIT
变为CLOSED
- 若客户端不再向服务端发送数据时,客户端首先发送请求报文段,首部包含
扩展
HTTP/2相比HTTP/1.1改变了哪些?
1.兼容HTTP/1.1
2.头部压缩
3.二进制帧
4.并发传输
5.服务器主动推送资源
在上面的TCP三次握手和四次挥手过程中存在一些问题,例如
第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN的时机是什么?
第三次握手,如果服务器永远不会收到ACK,服务器就永远都留在 Syn-Recv 状态了吗?退出此状态的时机是什么?
第三次挥手,如果客户端永远收不到 FIN,ACK,客户端永远停留在 Fin-Wait-2状态了吗?退出此状态时机是什么时候呢?
第四次挥手,如果服务器永远收不到 ACK,服务器永远停留在 Last-Ack 状态了吗?退出此状态的时机是什么呢?
如果客户端 在 2SML内依旧没收到 FIN,ACK,会关闭链接吗?服务器那边怎么办呢,是怎么关闭链接的呢?
以上问题对于大部分前端工程师来说不是必须掌握的知识点,文章底部的链接有对应的详细说明;
HTTPS
在HTTP的基础上增加了SSL/TLS协议保证安全,保证了在通信的过程中消息机密性
、消息完整性
、身份验证
;
SSL/TLS协议
分为SSL/TLS记录协议
和SSL/TLS握手协议
,SSL/TLS记录协议建立在可靠的TCP之上,为高层协议提供数据的封装、压缩、加密等基本功能,SSL/TLS握手协议在实际数据传输开始前,用于对双方进行身份认证、协商加密算法、交换加密密钥等.
SSL/TLS握手协议过程
- 客户端向服务端发起加密通信请求,需要包含
支持的协议版本
、客户端生成的随机数(稍后用于对话密钥)
、支持的加密方法
、支持的压缩方法
- 收到客户端的请求后,服务端做出回应,包含
确认使用的加密通信协议版本
、服务端生成的随机数(稍后用于对话密钥)
、确认使用的加密方法
、服务器证书
- 客户端收到回应后,首先
验证服务器证书
,没问题后向服务端发送信息,包含随机数(服务器公钥加密)
、编码改变通知(之后的信息使用约定的加密方式和方法进行通信)
、客户端握手结束通知
- 服务端收到信息后,再次向客户端回复,包含
编码改变通知(之后的信息使用约定的加密方式和方法进行通信)
、服务器握手结束通知
扩展
HTTPS是如何保证信息的机密性?
采用混合加密,通信前通过非对称加密交换会话秘钥,通信过程中使用对称加密方式加密数据,既
保证了安全性的前提下又保证了运算速度HTTPS是如何保证信息的完整性?
通过摘要算法算出明文的指纹,将明文与指纹一同加密发送给服务器,服务器通过指纹对比来确
保数据的完整性HTTPS是如何验证身份?
数字证书
参考文章:
1.https://mp.weixin.qq.com/s/CTqag_TxAHLuUwLvbrmlnw
2.https://www.bilibili.com/video/BV1xJ41137Q3?p=20
3.https://mp.weixin.qq.com/s/TvGAmKKrKrcWlsV2cfC34g