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 | 1.兼容HTTP/1.1 |
在上面的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是如何保证信息的机密性?
1
2采用混合加密,通信前通过非对称加密交换会话秘钥,通信过程中使用对称加密方式加密数据,既
保证了安全性的前提下又保证了运算速度 - HTTPS是如何保证信息的完整性?
1
2通过摘要算法算出明文的指纹,将明文与指纹一同加密发送给服务器,服务器通过指纹对比来确
保数据的完整性 - HTTPS是如何验证身份?
1
数字证书
参考文章:
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