OSI(开放式系统互联通信)参考模型分为应用层表示层会话层传输层网络层数据链路层物理层、;

TCP/IP模型分为应用层(应用层,表示层,会话层)运输层网际层网络接口层(数据链路层、物理层)

五层参考模型分为应用层传输层网络层数据链路层物理层

HTTP

TCP报文段结构

TCP报文段结构包含TCP首部和TCP数据部分

  • TCP首部=源端口+目的端口+序号(seq)+确认号(ack)+数据偏移(标记相同序号下的不同数据段)+保留+标志位+窗口(流量控制)+检验和+选项(长度可变)+填充;

  • 标志位=URG(紧急指针位)+ACK(确认位)+PSH+RST(复位)+SYN(同步序列位)+FIN(结束位)

    其中除了选项填充其余的字段固定长度为20个字节


运行原理

  1. 发起HTTP请求
  2. 建立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;
  3. 数据传送

  4. 关闭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