Skip to content

一、网络基础

协议

协议是一种约定,也可以说是一种语言。正因为有了网络协议,才有了现在的互联网,计算机之间只有遵循相同的协议他们之间才能相互通信。就像人与人之间一样,如果大家说的话都不一样,谁也听不懂对方说的是啥。

TCP/IP分层模型与OSI模型

在介绍分层模型前,我们来了解一下为什么要分层?复杂的系统都会分层,因为分层可以更好的复用、隔离变化点。每一层只需处理自己的部分,降低复杂性。

OSI模型

开放式系统互联模型(Open System Interconnection Model,缩写:OSI;简称为OSI模型)是一种概念模型,由国际标准化组织提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。该模型将通信系统中的数据流划分为七个层,从分布式应用程序数据的最高层表示到跨通信介质传输数据的物理实现。每个中间层为其上一层提供功能,其自身功能则由其下一层提供。所以只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

OSI模型各分层的作用

TCP/IP分层模型与OSI模型

TCP/IP与OSI

常用协议介绍

协议作用协议所在层级
DNS通过域名查找IP地址应用
HTTP生成针对web服务器的HTTP请求报文应用
TCP提供报文分割以及报文的可靠性传输传输
IP协议根据源主机和目的主机的地址来传送数据网络
ARP提供IP地址查找MAC地址网络

二、HTTP

超文本传输协议(HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。协议的主要作用是对用户数据的封装,从而建立客户端与服务端之间的请求响应的标准。说到HTTP协议,每个上网的人都不会陌生,因为它是万维网的数据通信的基础,也是我们上网时候接触到的第一个协议。

例如你在浏览器地址栏输入 www.baidu.com。浏览器自动帮你完善URL:http://www.baidu.com,前面的http就是指明使用的http协议。

请求报文结构

先上个图:

HTTP请求报文结构

从上图我们可以知道 HTTP请求报文结构主要分为以下三个部分:

  1. 请求行
    请求行包括请求方法、URL、和HTTP 协议版本号

  2. 首部
    首部就是我们常说的请求头Header,是一个Key Value结构的数据,用来存储一些重要的信息。

  3. 实体
    报文发送的用户数据

响应报文结构

看完请求报文结构,我们来看下响应报文的结构:

HTTP响应图

HTTP 首部字段

HTTP协议请求和响应的报文必须包含首部,它为客户端和服务端分别处理请求和响应提供所需的重要信息,HTTP 首部字段根据实际用途被分为以下 4 种类型:

请求首部

首部字段名说明示例设置
Accept能够接受的回应内容类型Accept: text/plain
Accept-Charset能够接受的字符集Accept-Charset: utf-8
Accept-Encoding能够接受的编码方式列表Accept-Encoding: gzip, deflate
Accept-Language能够接受的回应内容的自然语言列表Accept-Language: en-US
Authorization用于HTTP认证的认证信息Authorization: Basic xxxxx
Cookie之前由服务器通过 Set-Cookie 发送的 HTTP CookieCookie: $Version=1; Skin=new
Content-Type请求体的 MIME类型(用于POST和PUT请求中)Content-Type: application/x-www-form-urlencoded
Host服务器的域名(用于虚拟主机),以及服务器所监听的端口号Host: zh.wikipedia.org:80
User-Agent浏览器的身份标识字符串User-Agent: Mozilla/5.0
Range仅请求某个实体的一部分。字节偏移以0开始Range: bytes=500-999

响应首部字段

首部字段名说明示例
Access-Control-Allow-Origin指定哪些网站可参与到跨来源资源共享过程中Access-Control-Allow-Origin: *
Accept-Ranges是否接受字节范围请求Accept-Ranges: bytes
Age这个对象在代理缓存中存在的时间,以秒为单位Age: 12
ETag对于某个资源的某个特定版本的一个标识符,通常是一个消息散列ETag: "737060cd8c284d8af7ad3082f209582d"
Server服务器的名字Server: Apache/2.4.1 (Unix)
Set-Cookie用来向客户端发送小型 CookieSet-Cookie: ID=03f47f1f; path=/

通用首部

首部字段名说明示例
Cache-Control用来指定在这次的请求/响应链中的所有缓存机制都必须遵守的指令Cache-Control: no-cache
Connection该浏览器想要优先使用的连接类型Connection: keep-alive
Date发送该消息的日期和时间Date: Tue, 15 Nov 1994 08:12:31 GMT

实体首部

首部字段名说明示例
Allow对于特定资源有效的动作Allow: GET, HEAD
Content-Encoding在数据上使用的编码类型Content-Encoding: gzip
Content-Length回应消息体的长度,以字节为单位Content-Length: 348
Content-Type当前内容的MIME类型Content-Type: text/html; charset=utf-8
Expires指定一个日期/时间,超过该时间则认为此回应已经过期Expires: Thu, 01 Dec 1994 16:00:00 GMT

状态码详解

HTTP响应状态码大的分类可分为5类:

HTTP状态码释义
1xx服务器收到请求,需要请求者继续执行操作
2xx成功,操作被成功接收并处理
3xx重定向,需要进一步的操作以完成请求
4xx客户端错误,请求包含语法错误或无法完成请求
5xx服务器错误,服务器在处理请求的过程中发生了错误

常用状态码:

  • 200 OK - 请求已成功
  • 301 Moved Permanently - 资源已永久移动到新位置
  • 302 Found - 资源临时从不同的URI响应请求
  • 304 Not Modified - 资源未修改,可使用缓存
  • 400 Bad Request - 语义有误,当前请求无法被服务器理解
  • 401 Unauthorized - 当前请求需要用户验证
  • 403 Forbidden - 服务器拒绝执行
  • 404 Not Found - 请求的资源未在服务器上发现
  • 500 Internal Server Error - 服务器遇到了未曾预料的状况
  • 502 Bad Gateway - 网关或代理从上游服务器接收到无效响应
  • 503 Service Unavailable - 由于临时的服务器维护或者过载,服务器当前无法处理请求

HTTP 1.1 和 2.0 版本的新特性

HTTP 1.1 新增特性

特性作用描述
Keep-Alive通过设置Keep-Alive可以保持HTTP连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率
Cache-Control更为精细的缓存处理
Pipelining将多个HTTP请求整批提交的技术,而在发送过程中不需先等待服务器的回应

HTTP 2.0 新增特性

特性作用描述
头压缩采用HPACK算法对HTTP的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引
帧、消息、流和TCP连接HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己的ID
服务推送服务端向客户端发送比客户端请求更多的数据

三、HTTPS

为什么需要HTTPS

在学习完HTTP之后我们一起来了解一下HTTPS,在聊为什么需要HTTPS之前,我们先来看一下HTTP有哪些缺点:

  1. 通信明文 - HTTP的通信使用的是明文,通信内容会被窃听
  2. 不验证身份 - 不会验证通信方的身份,可能会遭遇伪装
  3. 无完整性验证 - 无法验证通信内容的完整性,因此通信内容可能会被篡改

说完HTTP的缺点,我们再聊一下HTTPS是什么,解决了哪些问题。

HTTPS = HTTP + 加密 + 验证 + 完整性保护

是身披TLS协议外壳的HTTP。也就是说HTTPS 不是一个新的协议,只是通信接口部分使用TLS协议代替,使之具有加密、验证、完整性保护这些能力。

对称加密与非对称加密

HTTPS具有加密数据的能力,那它到底是怎么加密的呢?在解释这个问题前,我们先学习一下加密的两种方式:

对称加密

对称加密也叫共享秘钥加密或者是私钥加密,也就是说加密和解密使用的是同一个秘钥。

常用算法: AES、DES、RC2 等

优点: 加密效率高,加密速度快
缺点: 秘钥的传输不能保证安全性

非对称加密

公开密钥密加密(Public-key cryptography)也称为非对称加密,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。

优点: 私钥不需要公开,防止了解密的秘钥被窃取
缺点: 加密效率较低

数字证书

一个泛域名的SSL证书一年要好几万,那这个证书是干嘛用的呢?

刚刚我们说的非对称加密,服务端把公钥给客户端,但是客户端收到的公钥怎么能验证公钥是我们要访问的服务端提供的呢?所以需要一个权威的机构给这个公钥颁发证书,提供证明说这个公钥是这个机构或组织的。

HTTPS 加密方式

HTTPS 采用了混合加密的方式。我们知道非对称加密在性能上不如对称加密,但是对称加密秘钥传输不能保证安全性。

所以HTTPS采用非对称加密和对称加密并用的机制。也就说先使用非对称加密的方式安全的交换对称加密的秘钥后,后续数据传输使用对称加密对数据进行加密。

HTTPS 交互过程

按照惯例,先上个图:

HTTPS交互过程

交互过程详解:

  1. TCP 三次握手 - 建立TCP连接
  2. Client Hello - 客户端向服务端发送 Client Hello 请求,提供客户端自己生成的 Random 随机数
  3. Server Hello - 服务端响应请求,提供自己生成的随机数以及确定加密套件
  4. Certificate - 服务端返回带有公钥的服务端证书
  5. Server Key Exchange - 携带密钥交换的额外数据
  6. Server Done - 通知客户端 Server Hello 过程结束
  7. Client Key Exchange - 客户端生成第三个随机数,使用证书的公钥加密后发送给服务器
  8. Change Cipher Spec - 通知以后使用会话密钥加密传输
  9. Encrypted Handshake Message - 将已商定好的参数等,采用协商密钥进行加密,发送给对方用于验证
  10. Application Data - 传输用户数据
  11. Encrypted Alert - 申请断开连接

总结 HTTPS

HTTPS 是综合了对称加密和非对称加密算法的 HTTP 协议。既保证传输安全,也保证传输效率。

整个通信过程也很简单:客户端和服务端先各自生成并交换生成的随机数,客户端在验证完服务端的证书后,使用证书的公钥加密随机数发送给服务端。然后服务端使用私钥解密随机数。后续客户端和服务端使用三个随机数组成的对称秘钥加密数据进行尝试通信,双方验证完成后才正式传输用户数据。

总结

本文从网络基础开始,详细介绍了 HTTP 协议的工作原理、报文结构、首部字段和状态码,然后深入讲解了 HTTPS 的加密机制和交互过程。

理解 HTTP/HTTPS 协议对于后端开发、网络编程和系统架构设计都至关重要。希望这篇文章能够帮助你更好地理解网络通信的本质。

参考资料

相关文章

Released under MIT License.