云计算百科
云计算领域专业知识百科平台

网络编程(3.1)应用层协议-HTTP_HTTPS

网络编程 – HTTP/HTTPS协议详解

HTTP协议概述

HTTP(HyperText Transfer Protocol,超文本传输协议)是Web通信的基础协议,它定义了客户端(如Web浏览器)与服务器之间的请求-响应通信格式和规则。HTTP基于TCP/IP协议栈,其中HTTP1.0、HTTP1.1、HTTP2.0都是基于TCP实现,HTTP3.0则基于UDP实现。

HTTP协议的核心作用是传输数据,包括HTML文档、图片、视频、JSON等多种格式。它采用客户端-服务器模型,通过统一资源标识符(URL)定位和访问网络资源。

HTTP协议的工作过程

当我们在浏览器中输入一个URL并按下回车时,浏览器会向该URL对应的服务器发送一个HTTP请求。服务器收到请求后,会根据请求的URL和方法,执行相应的操作,并返回一个HTTP响应。

什么是URL

URL(Uniform Resource Locator,统一资源定位符)是互联网上资源的地址,用于定位和访问网络上的资源。它由多个部分组成,格式为:

协议://主机名[:端口号]/路径[?查询字符串][#锚点]

示例:

https://www.wikipedia.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types?version=20251219#常见的MIME类型
└─────┘└────────────────┘└────────────────────────────────────────────┘└────────────────┘└────────────┘
协议 主机名 路径 查询参数 锚点

  • 协议(Protocol)
  • 示例:https://

    定义:规定客户端与服务器通信的规则,常见协议包括:

    • http://(超文本传输协议,不安全)
    • https://(加密的 HTTP 协议,默认端口 443)
    • ftp://(文件传输协议)

    作用:

    • 决定数据传输的安全性(如 HTTPS 用于在线支付)。
    • 浏览器根据协议选择对应的解析方式(如 HTTP 解析网页,FTP 下载文件)。
  • 主机名(Hostname)
  • 示例:www.wikipedia.org

    定义:标识资源所在的服务器,通常由三部分组成:

    • 子域名:www(万维网服务,可替换为blog、api等)。
    • 主域名:wikipedia(网站核心标识)。
    • 顶级域名(TLD):.org(非营利组织,其他如.com、.cn)。

    补充:

    • 主机名可直接使用 IP 地址(如192.168.1.1),但域名更易记忆。
    • 子域名可用于区分业务模块(如api.example.com用于接口服务)。
    • 主机名后面的端口号(如:8080)可选,默认端口为80(HTTP)或443(HTTPS)。
  • 路径(Path)
  • 示例:/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types

    定义:资源在服务器上的具体位置,类似文件系统的目录结构。

    结构解析:

    • /zh-CN:语言版本(中文)。
    • /docs/Web/HTTP:文档分类(Web 技术 → HTTP 协议)。
    • /Basics_of_HTTP/MIME_types:具体文档名称。

    作用:

    • 帮助服务器定位资源(如 HTML 文件、API 接口)。
    • 设计清晰的路径可提升 SEO(如使用关键词而非随机字符)。
  • 查询参数(Query Parameters)
  • 示例:?version=20251219

    定义:以?开头的键值对,用于向服务器传递附加信息。

    解析:

    • version=20251219:请求文档的 2025 年 12 月 19 日版本。

    扩展场景:

    • 电商搜索:?q=羽绒服&sort=sale-desc(关键词 “羽绒服”,按销量降序)。
    • 分页参数:?page=2(获取第二页结果)。 编码规则:
    • 非 ASCII 字符需 URL 编码(如 “人工智能”→%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD)。
    • 保留字符(如&、=)需转义(&→%26,=→%3D)。
  • 锚点(Fragment)
  • 示例:#常见的MIME类型

    定义:以#开头的标识符,用于定位页面内的特定位置。

    作用:

    • 直接跳转到文档中的某个标题(如 HTML 元素的id=“常见的MIME类型”)。
    • 锚点不会发送到服务器,仅在客户端生效。

    扩展特性:

    • 文本片段(Text Fragments):#:~:text=MIME%E7%B1%BB%E5%9E%8B%E7%9A%84%E6%A0%BC%E5%BC%8F%E4%B8%BA可高亮显示包含 “MIME 类型的格式为” 的段落。
    • 移动端适配:锚点常用于单页应用(SPA)的路由切换(如 React Router)。

    HTTP请求结构

    HTTP请求是客户端向服务器发送的请求消息,由请求行、请求头和请求体三部分组成,格式遵循严格规范,确保客户端和服务器能正确解析和处理。

    在这里插入图片描述

    请求行

    请求行是HTTP请求的第一行,包含三个字段:请求方法、URL和HTTP版本,它们之间用空格分隔,行末以CRLF(\\r\\n)结束。格式为:

    请求方法 URL HTTP版本\\r\\n

    示例:

    GET /index.html HTTP/1.1\\r\\n

    • 请求方法:定义了客户端对服务器资源的操作类型,如GET、POST、PUT、DELETE等
    • URL:统一资源定位符,指定了请求的资源路径
    • HTTP版本:表示客户端使用的HTTP协议版本,如HTTP/1.1、HTTP/2等
    请求头

    请求头由多个字段组成,每个字段包含名称和值,格式为字段名: 值,行末以CRLF(\\r\\n)结束。请求头提供了客户端的相关信息、请求的附加条件以及客户端的偏好设置。

    常见请求头及其详细说明:

    请求头字段描述示例
    Host 指定请求的主机名和端口号,用于虚拟主机配置 Host: www.example.com:8080
    User-Agent 客户端的浏览器信息和操作系统信息 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
    Accept 客户端能接受的媒体类型,按优先级排序 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language 客户端能接受的语言,按优先级排序 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    Accept-Encoding 客户端能接受的编码方式,如gzip、deflate等 Accept-Encoding: gzip, deflate, br
    Referer 包含当前请求页面的来源URL,用于追踪流量来源 Referer: https://www.google.com/
    Cookie 客户端保存的Cookie信息,用于保持会话状态 Cookie: session_id=abc123; user_id=456
    Content-Type 请求体的媒体类型,用于POST、PUT等方法 Content-Type: application/json
    Content-Length 请求体的长度,单位为字节 Content-Length: 128
    Connection 控制连接的持久性,如Keep-Alive表示持久连接 Connection: Keep-Alive
    Authorization 用于身份认证,如Basic认证或Bearer令牌 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…
    Cache-Control 控制请求的缓存行为 Cache-Control: no-cache, no-store
    Origin 表示请求的来源站点,用于CORS(跨域资源共享) Origin: https://www.example.com
    If-None-Match 与ETag配合使用,用于缓存验证 If-None-Match: "abc123"
    If-Modified-Since 与Last-Modified配合使用,用于缓存验证 If-Modified-Since: Tue, 15 Nov 2022 12:45:26 GMT
    请求体

    请求体包含客户端要发送给服务器的数据,通常用于POST、PUT、PATCH等方法。请求体的格式由Content-Type头字段指定,常见的格式包括:

    • application/x-www-form-urlencoded:表单数据,如key1=value1&key2=value2
    • multipart/form-data:用于文件上传,支持二进制数据
    • application/json:JSON格式的数据,如{"name": "test", "value": "123"}
    • text/plain:纯文本数据
    • application/xml:XML格式的数据

    请求体与请求头之间用一个空行(CRLF)分隔,示例:

    POST /api/users HTTP/1.1
    Host: www.example.com
    Content-Type: application/json
    Content-Length: 33

    {"name": "test", "email": "test@example.com"}

    HTTP响应结构

    服务器接收到HTTP请求后,会返回HTTP响应,同样由状态行、响应头和响应体三部分组成。

    在这里插入图片描述

    状态行

    状态行包含HTTP版本、状态码和状态描述,格式为:

    HTTP版本 状态码 状态描述

    示例:

    HTTP/1.1 200 OK

    响应头

    响应头包含服务器的相关信息,每个头字段由名称和值组成,格式与请求头相同。

    常见响应头:

    • Server:服务器的名称和版本
    • Date:响应的日期和时间
    • Content-Type:响应体的媒体类型
    • Content-Length:响应体的长度
    • Content-Encoding:响应体的编码方式
    • Set-Cookie:服务器设置的Cookie信息
    • Cache-Control:缓存控制策略
    • Expires:响应的过期时间
    • Last-Modified:资源的最后修改时间
    • ETag:资源的实体标签
    响应体

    响应体包含服务器返回给客户端的数据,通常是HTML、JSON、XML等格式。

    HTTP方法

    HTTP定义了多种请求方法,用于指定客户端对服务器资源的操作类型。

    方法描述安全性幂等性
    GET 请求获取资源 安全 幂等
    POST 向服务器提交数据,创建资源 不安全 非幂等
    PUT 向服务器提交数据,更新资源 不安全 幂等
    DELETE 请求删除资源 不安全 幂等
    HEAD 只请求资源的头部信息 安全 幂等
    OPTIONS 请求服务器支持的HTTP方法 安全 幂等
    PATCH 部分更新资源 不安全 非幂等
    CONNECT 建立隧道连接,用于HTTPS 安全 幂等
    TRACE 回显服务器收到的请求,用于诊断 安全 幂等
    • 安全:不会修改服务器资源的方法
    • 幂等:多次执行相同的请求,结果相同的方法

    HTTP的主要特点

    HTTP协议具有以下核心特点:

    • 请求-响应模型:客户端发送请求,服务器返回响应,通信是单向的
    • 无状态性:服务器不保存客户端的状态信息,每个请求都是独立的(通过Cookie、Session等机制可实现状态管理)
    • 灵活的数据类型:支持传输任意类型的数据,通过Content-Type头字段标识数据类型
    • 可扩展性:可以通过自定义头字段和方法扩展来支持新功能
    • 连接管理:
      • HTTP/1.0:短连接,每个请求建立新的TCP连接
      • HTTP/1.1:引入持久连接(Keep-Alive),允许在一个TCP连接上发送多个请求
      • HTTP/2:支持多路复用,在单个TCP连接上并行处理多个请求
    • 简单易用:报文格式清晰,易于理解和实现

    HTTP状态码

    HTTP状态码用于表示服务器对请求的处理结果,分为5个类别:

    1xx(信息性状态码)
    • 100 Continue:服务器已收到请求头,客户端可以继续发送请求体
    • 101 Switching Protocols:服务器同意切换协议
    2xx(成功状态码)
    • 200 OK:请求成功
    • 201 Created:资源创建成功
    • 202 Accepted:请求已接受,但尚未处理完成
    • 204 No Content:请求成功,但没有响应体
    • 206 Partial Content:部分内容请求成功
    3xx(重定向状态码)
    • 301 Moved Permanently:资源永久移动到新位置
    • 302 Found:资源临时移动到新位置
    • 303 See Other:重定向到其他资源,使用GET方法获取
    • 304 Not Modified:资源未修改,使用缓存
    • 307 Temporary Redirect:临时重定向,保持原请求方法
    • 308 Permanent Redirect:永久重定向,保持原请求方法
    4xx(客户端错误状态码)
    • 400 Bad Request:请求语法错误
    • 401 Unauthorized:未授权,需要身份验证
    • 403 Forbidden:禁止访问该资源
    • 404 Not Found:资源不存在
    • 405 Method Not Allowed:请求方法不被允许
    • 406 Not Acceptable:无法生成客户端可接受的响应
    • 408 Request Timeout:请求超时
    • 409 Conflict:请求与服务器资源冲突
    • 413 Payload Too Large:请求体过大
    • 414 URI Too Long:请求URI过长
    • 415 Unsupported Media Type:不支持的媒体类型
    • 429 Too Many Requests:请求次数过多
    5xx(服务器错误状态码)
    • 500 Internal Server Error:服务器内部错误
    • 501 Not Implemented:服务器不支持该请求方法
    • 502 Bad Gateway:网关错误
    • 503 Service Unavailable:服务器暂时不可用
    • 504 Gateway Timeout:网关超时
    • 505 HTTP Version Not Supported:不支持的HTTP版本

    HTTP协议虽然简单高效,但由于其明文传输的特性,在安全性方面存在明显不足。为了解决这一问题,HTTPS协议应运而生。

    HTTPS协议概述

    HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP的安全版本,通过SSL/TLS协议对HTTP通信进行加密和认证。

    HTTPS的主要特点

    • 安全性:使用SSL/TLS协议对通信进行加密和认证,防止数据窃听和篡改
    • 可靠性:验证服务器的身份,防止中间人攻击
    • 完整性:确保数据在传输过程中不被篡改
    • 兼容性:基于HTTP协议,与HTTP协议兼容
    • 性能:由于加密和解密过程,性能略低于HTTP

    HTTPS的工作原理

    在这里插入图片描述

    HTTPS通过SSL/TLS协议实现安全通信,主要包括以下步骤:

  • 客户端发起HTTPS请求:客户端向服务器发送HTTPS请求,包含支持的SSL/TLS版本和加密算法
  • 服务器返回证书:服务器返回数字证书,包含服务器的公钥和身份信息
  • 客户端验证证书:客户端验证证书的合法性(检查证书的颁发机构、有效期、域名匹配等)
  • 客户端生成会话密钥:客户端生成对称会话密钥,使用服务器的公钥加密
  • 客户端发送加密的会话密钥:客户端将加密后的会话密钥发送给服务器
  • 服务器解密会话密钥:服务器使用私钥解密会话密钥
  • 双方使用会话密钥通信:客户端和服务器使用对称会话密钥进行加密通信
  • SSL/TLS握手过程

    在这里插入图片描述

    SSL/TLS握手是HTTPS建立安全连接的关键过程,主要包括以下步骤:

  • Client Hello:客户端发送支持的SSL/TLS版本、加密套件列表、随机数等
  • Server Hello:服务器选择合适的SSL/TLS版本和加密套件,发送随机数等
  • Certificate:服务器发送数字证书
  • Server Key Exchange(可选):服务器发送额外的密钥交换信息
  • Server Hello Done:服务器完成握手初始化
  • Client Key Exchange:客户端生成预主密钥,使用服务器公钥加密并发送
  • Certificate Verify(可选):客户端验证服务器证书
  • Change Cipher Spec:客户端通知服务器切换到加密通信
  • Finished:客户端发送加密的握手消息,验证握手过程
  • Change Cipher Spec:服务器通知客户端切换到加密通信
  • Finished:服务器发送加密的握手消息,验证握手过程
  • HTTP与HTTPS对比

    HTTP和HTTPS是Web通信的两种核心协议,它们在安全性、性能和使用场景上存在显著差异。以下是两者的详细对比:

    特性HTTPHTTPS说明
    安全性 明文传输,不安全 加密传输,安全 HTTP使用明文传输数据,容易被窃听和篡改;HTTPS通过SSL/TLS加密数据,提供端到端安全保障
    默认端口 80 443 HTTP默认使用80端口,HTTPS默认使用443端口
    协议基础 基于TCP/IP 基于TCP/IP + SSL/TLS HTTPS是在HTTP基础上添加了SSL/TLS加密层
    证书要求 不需要 需要数字证书 HTTPS服务器需要安装由可信CA签发的数字证书,用于身份认证
    性能 略低(加密解密开销) HTTPS的加密解密过程会带来一定性能开销,但现代优化已将影响降至最低
    资源消耗 高(CPU和内存开销) HTTPS需要更多的CPU资源进行加密解密运算
    搜索引擎排名 无特殊优势 有明显优势 搜索引擎(如Google)优先收录HTTPS网站,并给予更高排名
    浏览器标识 显示"http://",无特殊标识 显示"https://"和安全锁图标 浏览器通过不同的标识帮助用户识别网站的安全状态
    数据完整性 无保障 有保障 HTTPS通过MAC或哈希算法确保数据完整性,防止数据被篡改
    身份认证 HTTPS通过数字证书验证服务器身份,防止中间人攻击
    部署成本 HTTPS需要购买和管理数字证书,增加了部署成本
    适用场景 非敏感数据传输 敏感数据传输 HTTP适用于静态资源访问等非敏感场景;HTTPS适用于登录、支付、个人信息等敏感场景

    HTTP版本演进

    HTTP协议经历了多次版本迭代,每一次演进都带来了性能和功能的提升:

    HTTP/0.9 – 简单的文本传输协议
    • 发布于1991年,是HTTP的最初版本
    • 只支持GET方法,用于获取HTML文档
    • 无版本号,无请求头和响应头
    • 响应只包含HTML内容,没有其他类型的数据
    HTTP/1.0 – 功能扩展
    • 发布于1996年(RFC 1945)
    • 引入了版本号、请求头和响应头
    • 支持多种HTTP方法(GET、POST、HEAD)
    • 支持多种数据类型(HTML、图片、视频等)
    • 采用短连接,每个请求都需要建立新的TCP连接
    HTTP/1.1 – 持久连接和管道化
    • 发布于1999年(RFC 2616),是目前使用最广泛的HTTP版本
    • 引入了持久连接(Keep-Alive),允许在一个TCP连接上发送多个请求
    • 支持管道化(Pipelining),允许客户端在收到前一个响应前发送多个请求
    • 支持虚拟主机(Host头字段),允许一个服务器托管多个域名
    • 支持分块传输编码(Chunked Transfer Encoding),允许服务器分块发送响应
    • 引入了更多HTTP方法(PUT、DELETE、OPTIONS、TRACE、CONNECT)
    • 改进了缓存机制,增加了缓存控制头字段
    HTTP/2 – 二进制分帧和多路复用
    • 发布于2015年(RFC 7540)
    • 基于二进制分帧,取代了HTTP/1.x的文本格式,提高了传输效率和解析速度
    • 多路复用:通过将每个请求-响应拆分为独立的二进制帧,在单个TCP连接上并行处理多个请求-响应,解决了HTTP/1.1中的队头阻塞问题
    • 服务器推送(Server Push):允许服务器主动向客户端推送资源,无需客户端请求,减少了请求延迟
    • 头部压缩:使用HPACK算法压缩HTTP头部,减少重复头部数据的传输量
    • 请求优先级:允许客户端指定请求的优先级,服务器可根据优先级调整响应顺序
    HTTP/3 – 基于QUIC的新一代协议
    • 发布于2022年(RFC 9113)
    • 基于QUIC协议:基于UDP协议实现,解决了TCP协议的队头阻塞问题,同时保留了TCP的可靠性
    • 0-RTT连接建立:允许客户端在第一次连接时就发送请求数据,减少了连接建立延迟
    • 连接迁移:支持客户端在网络切换(如Wi-Fi到移动网络)时保持连接,无需重新建立连接
    • 更高效的拥塞控制:采用BBR等现代拥塞控制算法,提高了在高延迟、高丢包网络环境下的性能
    • 保持HTTP/2特性:保留了HTTP/2的多路复用、头部压缩等核心特性

    HTTP版本的演进反映了Web应用对性能、安全性和功能的不断追求。从HTTP/1.1到HTTP/2再到HTTP/3,每一次版本升级都带来了显著的性能提升,尤其是在高并发场景下。

    HTTP常见应用场景

    • Web浏览:浏览器与Web服务器之间的通信
    • API服务:RESTful API、GraphQL API等
    • 文件下载:通过HTTP协议下载文件
    • 表单提交:用户通过表单提交数据
    • Cookie和Session管理:用户身份认证和状态管理
    • 缓存机制:提高网页加载速度

    HTTP编程示例(Python)

    使用requests库发送HTTP请求

    import requests

    # 发送GET请求
    response = requests.get('https://www.example.com')
    print(f"状态码:{response.status_code}")
    print(f"响应头:{response.headers}")
    print(f"响应体:{response.text}")

    # 发送带参数的GET请求
    params = {'key1': 'value1', 'key2': 'value2'}
    response = requests.get('https://www.example.com/get', params=params)
    print(f"请求URL:{response.url}")

    # 发送POST请求
    headers = {'Content-Type': 'application/json'}
    data = {'name': 'test', 'value': '123'}
    response = requests.post('https://www.example.com/post', json=data, headers=headers)

    # 发送带Cookie的请求
    cookies = {'session_id': '123456'}
    response = requests.get('https://www.example.com', cookies=cookies)

    # 发送带认证的请求
    response = requests.get('https://www.example.com', auth=('username', 'password'))

    使用http.server模块创建简单的HTTP服务器

    from http.server import HTTPServer, BaseHTTPRequestHandler

    class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()
    self.wfile.write(b'<html><body><h1>Hello, World!</h1></body></html>')

    def do_POST(self):
    content_length = int(self.headers['Content-Length'])
    post_data = self.rfile.read(content_length)
    self.send_response(200)
    self.send_header('Content-type', 'text/plain')
    self.end_headers()
    self.wfile.write(b'Received POST data: ' + post_data)

    def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting HTTP server on port {port}…')
    httpd.serve_forever()

    if __name__ == '__main__':
    run()

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 网络编程(3.1)应用层协议-HTTP_HTTPS
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!