计算机网络基础:4.HTTP与HTTPS

一、回顾设定

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

        在这餐厅中,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.contentexcept SSLError as e:return None, str(e)def main():# Fetch data using HTTPhttp_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 HTTPShttps_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协议进行了加密,这样就无法被中间人直接读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487446.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

lua 游戏架构 之 游戏 AI (四)ai_autofight_find_target

定义一个名为 ai_autofight_find_target 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读237次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del&#xff08;delete&#xff09; expire TTL Redis的key过期策略是怎么实现的&#xff1f; type get 和 set 连接到云服务器后&#xff0c;通过redis-cli命令进入到redis客户端…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {std::cout << &quo…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…

【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)

目录 1、什么是定时器&#xff1f;定时器用于测量时间间隔&#xff0c;而计数器用于计数外部事件的次数 2、定时器的主要功能和用途&#xff1f;3、定时器类型&#xff1f;4、定时器的编写过程5、代码分析定时器计算&#xff1f;计算过程周期&#xff08;arr&#xff09;&#…

Apollo使用(3):分布式docker部署

Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub&#xff0c;可以按照如下步骤获取 一、获取镜像 1、Apollo Config Service 获取镜像 docker pull apolloconfig/apollo-configservice:${version} 我事先下载过该镜像&#xff0c;所以跳过该步骤。 2、Apollo Admin S…

Leetcode3219. 切蛋糕的最小总开销 II

Every day a Leetcode 题目来源&#xff1a;3219. 切蛋糕的最小总开销 II 解法1&#xff1a;贪心 谁的开销更大&#xff0c;就先切谁&#xff0c;并且这个先后顺序与切的次数无关。 代码&#xff1a; /** lc appleetcode.cn id3219 langcpp** [3219] 切蛋糕的最小总开销 I…

医疗信息化之PACS系统源码,C#医学影像系统源码,成熟在用稳定运中

C#语言开发的一套PACS系统源码&#xff0c;C/S架构&#xff0c;成熟稳定&#xff0c;多家大型综合医院应用案例。自主版权&#xff0c;支持二次开发&#xff0c;授权后可商用。 医学影像存储与传输系统是针对数据库存储、传输服务、图像处理进行了优化,存储更安全、传输更稳定、…

人工智能与机器学习原理精解【6】

文章目录 数值优化基础理论凹凸性定义在国外与国内存在不同国内定义国外定义总结示例与说明注意事项 国内凹凸性二阶定义的例子凹函数例子凸函数例子 凸函数&#xff08;convex function&#xff09;的开口方向凸函数的二阶导数凸函数的二阶定义单变量函数的二阶定义多变量函数…

C# 知识点总结

入门 C#程序在.NET上运行&#xff0c;.NET framework包含两个部分&#xff1a; ①&#xff1a;.NET framework类库 ②&#xff1a;公共语言运行库CLR&#xff08;.NET虚拟机&#xff09; CLS&#xff08;公共语言规范&#xff09; CTS&#xff08;通用类型系统&#xff09; .N…

【Node.js基础04】包的理解与使用

一&#xff1a;包的理解与简介 1 什么是包 包是一个将模块、代码、以及其他资料聚合成的文件夹 2 包的分类 项目包&#xff1a;编写项目代码的文件夹 软件包&#xff1a;封装工具和方法供开发者使用 3 为什么要在软件包中编写package.json文件 记录包的清单信息 二&…

09-optee内核-线程处理

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】TEE从入门到精通-[目录] 👈👈👈线程处理 OP-TEE内核使用几个线程来支持在 并行(未完全启用!有用于不同目的的处理程序。在thread.c中,您将找到一个名为…

Binius-based zkVM:为Polygon AggLayer开发、FPGA加速的zkVM

1. 引言 近日&#xff0c;ZK硬件加速巨头Irreducible和Polygon团队宣布联合开发生产级的Binius-based zkVM&#xff0c;用于助力Polygon AggLayer&#xff0c;实现具有低开销、硬件加速的binary proofs。 Irreducible&#xff08;曾用名为Ulvetanna&#xff09;团队 Benjamin …

JavaSE从零开始到精通(八) - 单列集合类

1. 集合概述 集合类是一种用于存储对象的容器&#xff0c;Java 提供了一组预定义的集合类&#xff0c;它们位于 java.util 包中。这些集合类提供了各种数据结构&#xff0c;包括列表、集合、队列、映射等&#xff0c;每种数据结构都有其独特的特性和用途。 Java 中的集合类是…

secureCRT同时在所有已打开窗口执行命令、mac-os下使用的SecureCRT版本 以及 SecureCRT一段时间不操作没有响应的问题

一、secureCRT命令行工具一次性同时在所有已打开窗口执行命令 公司的服务器比较多&#xff0c;最近因为opcache&#xff0c;上线发布后&#xff0c;需要重启所有的WEB服务器上的php。目前使用的jenkins发布&#xff0c;不过账号安全问题&#xff0c;给jenkins的账号权限受限不能…

【C++中线程学习】

1、多线程 C11之前没有引入线程的概念&#xff0c;如果想要实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthead.h>&#xff0c;或者windows下的<windows.h>。 C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread.h…

雪花算法 集群uid重复问题 uid-generator-spring-boot-starter

1、在生成环境 在某个业务使用该插件生成uid,由于业务整合了 mybatis-plus模块 2、该业务是分部署集群部署以及使用的多线程获取uid&#xff0c;使用中发现唯一建冲突&#xff0c;生成的uid有重复。 然后查看日志发现 workerId 始终为0 怀疑是生成workerId出了问题。 查看跟…

Cadence23学习笔记(十四)

ARC就是圆弧走线的意思&#xff1a; 仅打开网络的话可以只针对net进行修改走线的属性&#xff1a; 然后现在鼠标左键点那个走线&#xff0c;那个走线就会变为弧形&#xff1a; 添加差分对&#xff1a; 之后&#xff0c;分别点击两条线即可分配差分对&#xff1a; 选完差分对之后…

使用Spring Boot与Spire.Doc实现Word文档的多样化操作

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势&#xff1a; 强大的功能组合&#xff1a;Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力&#xff0c;而Spire.Doc则…

docker产生日志过大优化

1、Docker容器启动后日志存放位置 #cat /var/lib/docker/containers/容器ID/容器ID-json.log #echo >/var/lib/docker/containers/容器ID/容器ID-json.log临时清除日志 注&#xff1a;echo一个空进去&#xff0c;不需要重启容器&#xff0c;但如果你直接删除这个日志&…