一、回顾设定

        想象你在经营一家繁忙的餐厅,顾客们通过点餐系统(网卡)下单,订单被前台(路由器)接收并分发到各个厨房区域(网络设备)。光猫像是食材供应商,通过高效的物流系统(光纤)将食材送到餐厅。厨房(交换机)处理多个订单,确保每道菜(数据包)都按顺序送达。

        在这餐厅中,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请求的表单例子:
      • <form method="GET" action="/search">
          <label for="query">Search:</label>
          <input type="text" id="query" name="query">
          <button type="submit">Submit</button>
        </form>
        <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的差异,这里以百度为例:

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()

        返回结果如下:

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协议进行了加密,这样就无法被中间人直接读取。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部