Skip to main content

Network

网络模型层

OSI七层模型

OSI全称为Open System Interconnection Model,即开放式系统互联模型,本质是一个网络机制的模型。

  • 物理层:物理层负责通过网络进行数据的物理传输,包括电缆、光纤等之类的物理硬件。
  • 数据链路层:从物理层里渗透到软件层的机制,负责检错纠错、成帧和寻址,确保数据从网络上的一个节点可靠地传输到另一个节点,如以太网、WiFi等,类比于电脑的一些驱动(网卡驱动、声卡驱动等),连接硬件的东西。
  • 网络层:网络层负责在网络上传输数据包,还处理逻辑寻址,这允许不同网络上的节点相互通信,常见的网络层协议有IP、ARP、ICMP、IGMP等。
  • 传输层:传输层负责在应用程序之间提供可靠的数据传输,规定了传输层协议,即网络在传输数据时应该使用什么样的方式进行连接、传输等,常见的传输层协议有TCP、UDP。
  • 会话层:它建立连接的一个组件,负责管理两个应用程序之间的对话,处理同步、检查点和身份验证等事项。
  • 表示层:建立会话的关系,负责格式化数据以进行传输和呈现,处理数据加密、数据压缩和翻译等事项。
  • 应用层:应用层是OSI模型的顶层,它为应用程序提供网络服务,包括电子邮件、文件传输和Web浏览等。传输层协议只规定数据如何传输,而应用层协议制定了一套统一的标准,如传输的时候需要带什么信息、要记录一些什么的数据等。常见的应用层协议有HTTP、HTTPS、FTP、Telnet、SSH、SMTP、POP3等,HTTP是基于TCP/IP的。

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

TCP/IP四层模型

  • 链路层(网络接口层):物理层和数据链路层的结合。
  • 网络层:IP寻址。
  • 传输层:TCP、UDP。
  • 应用层:会话层、表示层、应用层的结合。

应用层

传输层

网络层

链路层

TCP协议

Transmission Control Protocol,一种面向连接的、可靠的、基于字节流的传输控制协议。

  1. 面向连接,三次握手,四次挥手。
  2. 字节流可靠传输(二进制)。
  3. 使用网络层IP协议,寻址时遵循IP协议。
  4. 向HTTP、FTP等协议提供通信支持。
  5. 易粘包(Nagle算法)。

三次挥手

ServerClientServerClientSYN=1, Seq=0SYN=1, ACK=1, Seq=0, Ack=1ACK=1, Seq=1, Ack=1

四次挥手

ServerClientServerClientFIN=1, Seq=2, Ack=1ACK=1, Seq=1, Ack=3FIN=1, ACK=1, Seq=1, Ack=3ACK=1, Seq=3, Ack=2

基于TCP连接的协议

网路协议是对两台计算机进行通信制定的规则。

  1. 如何连接。
  2. 如何通信。

HTTP以TCP/IP的方式连接,客户端发起请求,服务端响应回给客户端。

HTTP协议

Hypertext Transfer Protocol超文本传输协议,是用于规定浏览器和服务器通信的方式。

Request

Response

Client

Server

  1. 基于TCP/IP连接。
  2. 端口默认为80
  3. 请求与响应。
  4. 请求方法有GETPOSTPUT等。
  5. 请求头信息。
  6. 1.1版本开始支持长连接。
  7. 无传输状态。

HTTP/2

  1. HTTP/1.1是通过纯文本传输请求和响应消息,而HTTP/2是通过二进制编码封装请求和响应消息。
  2. 多路复用。多个请求可以在同一个连接上进行并行处理,不需要为每个请求建立单独的连接,减少了连接建立和拆除的开销。
HTTP/1.1与HTTP/2请求一个HTML页面的过程对比
ServerBrowserServerBrowserGET /index.htmlResponse index.htmlGET /index.cssResponse index.cssGET /index.jsResponse index.jsHTTP/1.1 请求HTML页面过程
ServerBrowserServerBrowserGET /index.htmlResponse index.htmlGET /index.cssGET /index.jsResponse index.cssResponse index.jsHTTP/2 请求HTML页面过程
  1. 头部数据压缩。对头部信息进行encoder编码压缩,并且创建双端缓存表,缓存已接收到的头部信息,减少了重复传输的信息。
头部数据压缩过程
ServerClientServerClientalt[存在][不存在]检查头部字段和值是否在静态/动态表中用索引代替头部字段和值将头部字段和值添加到动态表使用哈夫曼编码压缩头部字段和值发送压缩后的头部数据接收压缩后的头部数据通过索引从静态/动态表中查找头部字段和值使用哈夫曼编码解码头部字段和值更新动态表发送响应

假设有以下HTTP/2请求头:

:method: GET
:scheme: https
:authority: example.com
:path: /index.html
user-agent: Mozilla/5.0

在压缩过程中,可能存在以下步骤:

  1. :method: GET在静态表中有预定义索引,可以直接用索引表示。
  2. :scheme: https也在静态表中有索引。
  3. :authority: example.com可能在动态表中,通过索引表示。
  4. :path: /index.html可能没有在表中,需要新增到动态表并使用哈夫曼编码压缩。
  5. user-agent: Mozilla/5.0也可能需要新增到动态表并进行哈夫曼编码。
  1. 服务端主动推送。对HTML代码进行分析,提前推送HTML中所需要服务端返回的资源。