一、回顾设定
想象你在经营一家繁忙的餐厅,顾客们通过点餐系统(网卡)下单,订单被前台(路由器)接收并分发到各个厨房区域(网络设备)。光猫像是食材供应商,通过高效的物流系统(光纤)将食材送到餐厅。厨房(交换机)处理多个订单,确保每道菜(数据包)都按顺序送达。
在这餐厅中,OSI七层模型就像是餐厅的运营流程:
- 物理层:餐厅的物理设施(如餐桌、椅子)传输原始比特流。
- 数据链路层:服务员将订单从顾客传递到厨房,确保数据在物理链路上的可靠传输。
- 网络层:前台接收订单并分发到正确的厨房区域。
- 传输层:厨房调度员确保每道菜按顺序送达。
- 会话层:预订系统管理顾客的预订和用餐时间。
- 表示层:菜单将食物以吸引人的方式展示(处理数据格式、加密和压缩)。
- 应用层:点餐应用直接接收顾客的订单。
TCP/IP模型简化了这个流程,将应用层、表示层和会话层合并为一个应用层,直接与用户交互。每个层次协议如HTTP、FTP、TCP、IP、Ethernet和Wi-Fi分别对应不同的餐厅操作。
IP地址就像餐桌编号,确保每个设备(桌子)都有一个唯一的编号,前台(网络层)根据IP地址将订单分发到正确的厨房区域,再由服务员(数据链路层)送到具体的餐桌。
DNS服务器则是餐厅中的"顾客座位对照表",将顾客的名字(域名)转换为餐桌编号(IP地址),确保每个订单准确送达。不同类型的域名可以比作餐厅中的不同类型顾客名单,比如VIP名单、普通顾客名单等。
通过上述设定,我们可以更好地理解网络各个层次和设备的作用,以及它们如何协同工作以确保数据(订单)高效、安全地从源头(顾客)传输到目的地(目标设备)。详细介绍请看前两篇文章。
二、HTTP
1. HTTP定义: HTTP(HyperText Transfer Protocol)就像餐厅中顾客与服务员之间的通信语言。顾客使用这种语言下单,服务员通过这种语言将订单传递到厨房。
2. 工作原理: HTTP基于TCP/IP协议,类似于餐厅中前台(路由器)与厨房(交换机)之间的点餐和传菜系统。它是一个应用层协议,定义了顾客(客户端)和厨房(服务器)之间的请求和响应标准。
3. 请求和响应:
-
请求:顾客(客户端)发送的HTTP请求就像顾客向服务员下单,包含订单的各个部分。
-
请求行 :就像顾客的点单 ,包括点了什么菜(请求方法,如GET、POST)。
- GET请求 就是顾客查看菜单上的菜品信息。这种请求是为了获取信息,不会改变餐厅的状态。
- POST请求 就是顾客提交一个新的订单。这个请求会改变餐厅的状态,因为它代表了一个新的订单的提交。
- 比如在HTML中常见的GET请求与POST请求的表单例子:
html<form method="GET" action="/search"> <label for="query">Search:</label> <input type="text" id="query" name="query"> <button type="submit">Submit</button> </form>
html<form method="POST" action="/order"> <label for="item">Order Item:</label> <input type="text" id="item" name="item"> <button type="submit">Submit</button> </form>
-
请求头 :类似于顾客的特殊要求(如无辣、少盐),包含额外信息(如User-Agent、Accept)。
-
空行 :表示请求头的结束。
-
请求体 :就像顾客详细的订单内容(如要多少份、特殊备注),特别是在POST请求中。
-
-
响应:厨房(服务器)返回给顾客的HTTP响应就像服务员上菜,包含上菜的各个部分。
- 状态行 :类似于服务员告诉顾客订单状态(如菜品正在准备、已上菜),包含状态码(如200成功、404未找到)。
- 响应头 :就像服务员提供的额外信息(如菜品的配料说明),包含服务器信息、内容类型等。
- 空行:表示响应头的结束。
- 响应体:实际的菜品内容(如网页、数据)。
4. HTTP方法: HTTP方法如GET、POST、PUT、DELETE等,就像不同类型的点单方式:
- GET:像顾客查看菜单(获取资源)。
- POST:像顾客提交订单(提交数据)。
- PUT:像顾客修改订单(更新资源)。
- DELETE:像顾客取消订单(删除资源)。
**5. 状态码:**服务器返回的状态码就像服务员告知顾客订单状态:
- 200:成功上菜。
- 404:菜品未找到(点单的菜品不存在)。
- 500:厨房出错(服务器错误)。
6. 安全性: HTTP协议本身不加密,类似于在公开场合大声点餐,容易被他人听到。HTTPS通过SSL/TLS协议对数据加密,就像服务员悄声传递订单,确保信息安全。
**7. 持久连接:**HTTP/1.1引入的持久连接,就像服务员在整个用餐过程中保持联系,而不是每次点菜都重新建立联系,减少了时间和沟通成本。
**8. HTTP/2:**HTTP/2是HTTP协议的升级版,支持头部压缩和多路复用,提高了传输效率,类似于服务员同时处理多个订单,提高了服务效率。
**9. 内容类型:**HTTP协议定义的内容类型如text/html、application/json等,类似于餐厅的菜单项,告诉顾客菜品的具体类型。
**10. 缓存:**HTTP协议支持缓存机制,类似于餐厅提前准备一些常点的菜品,减少等待时间,提高服务速度。
三、HTTPS
HTTPS(HyperText Transfer Protocol Secure)是HTTP的安全版。它在传统HTTP协议的基础上增加了SSL/TLS加密层,确保数据在传输过程中是加密的,保护用户隐私和数据安全。
HTTPS协议可以比作餐厅中的保密点餐服务。在这个服务中,顾客的点单信息通过加密的方式传递给服务员,确保其他顾客或不相关人员无法窃听或篡改信息。
1. 加密数据传输
在HTTPS协议中,数据传输是加密的,类似于顾客和服务员使用密语交流订单内容,确保只有顾客和服务员知道具体的点单信息。
- 数据加密:所有数据在传输前都会被加密,防止中途被窃听或篡改。就像顾客和服务员使用特定的密语,外人无法理解他们的对话。
- SSL/TLS:HTTPS使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来加密数据。SSL/TLS是加密的实现方式,类似于顾客和服务员之间的密语系统。
2. 数据完整性
HTTPS确保数据在传输过程中不被篡改,就像服务员从厨房取菜到桌上的过程中,确保菜品不会被其他人动过。
- 消息摘要:HTTPS通过消息摘要(如SHA-256)来验证数据的完整性。这就像服务员在上菜前检查菜品是否完好无损。
3. 身份验证
HTTPS使用数字证书验证服务器身份,确保顾客与真正的餐厅(服务器)交流,而不是与冒牌餐厅(伪装的服务器)交流。
- 数字证书:HTTPS使用由可信的第三方(CA,证书颁发机构)颁发的数字证书来验证服务器身份,类似于顾客检查服务员的工牌或餐厅的营业执照,确保其真实性。
4. HTTPS 的工作流程
HTTPS的工作流程可以比作顾客和服务员之间的一次加密交流过程,从身份验证到加密交流,再到订单传递。
- 建立安全连接:顾客和服务员首先相互验证身份(使用数字证书),确保对方可信。
- 生成加密密钥:一旦身份验证通过,顾客和服务员会共同生成一个共享的加密密钥,用于接下来的交流。
- 加密通信:所有点单和上菜信息通过加密密钥进行加密传输,确保信息安全。
5. 代码示例
不妨写一个Python代码来观察HTTP与HTTPS的差异,这里以百度为例:
python
import requests
from requests.exceptions import SSLError
# URL using HTTP
http_url = "http://baidu.com"
# URL using HTTPS
https_url = "https://baidu.com"
def fetch_data(url):
try:
response = requests.get(url)
return response.status_code, response.content
except SSLError as e:
return None, str(e)
def main():
# Fetch data using HTTP
http_status, http_content = fetch_data(http_url)
print("HTTP Status Code:", http_status)
print("HTTP Content (first 100 bytes):", http_content[:100])
# Fetch data using HTTPS
https_status, https_content = fetch_data(https_url)
print("\nHTTPS Status Code:", https_status)
print("HTTPS Content (first 100 bytes):", https_content[:100])
if __name__ == "__main__":
main()
返回结果如下:
bash
HTTP Status Code: 200
HTTP Content (first 100 bytes): b'<html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n'
HTTPS Status Code: 200
HTTPS Content (first 100 bytes): b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charse'
进程已结束,退出代码0
可以看到二者状态码都是200,表示均访问成功了。
同时,HTTP协议返回的内容在传输过程中是以明文形式发送的,任何中间人都可以读取到这些内容。而HTTPS协议返回的通过SSL/TLS协议进行了加密,这样就无法被中间人直接读取。