0

0

PythonHTTP请求链路分析_连接建立解析【教程】

冷漠man

冷漠man

发布时间:2026-01-02 16:36:09

|

397人浏览过

|

来源于php中文网

原创

Python HTTP请求底层包含DNS解析、TCP握手、TLS协商(HTTPS)、HTTP交互四环节;DNS解析影响超时,TCP复用连接池,TLS校验证书,HTTP处理头体边界,任一环故障都可能导致错误提示失真。

pythonhttp请求链路分析_连接建立解析【教程】

Python 中发起 HTTP 请求看似简单,但底层连接建立过程涉及 DNS 解析、TCP 握手、TLS 协商(HTTPS)、HTTP 协议交互等多个环节。理解这条链路,能帮你快速定位超时、连接拒绝、SSL 错误等常见问题。

DNS 解析:域名到 IP 的第一步

requests 或 urllib 发起请求时,若 URL 使用域名(如 https://api.github.com),Python 会调用系统 getaddrinfo() 获取 IP 地址。这步可能被缓存、被 hosts 文件覆盖,也可能因 DNS 服务器响应慢或失败而卡住。

  • 可通过 socket.gethostbyname("example.com") 手动测试解析是否正常
  • requests 支持传入 proxies 参数,但 DNS 解析默认仍走本地;如需强制走代理 DNS,需配合自定义 resolver(如 dnslib + requests.adapters.HTTPAdapter)
  • 超时控制:requests 的 timeout=(connect, read) 中,connect 超时包含 DNS 解析时间

TCP 连接建立:三次握手与连接池复用

拿到 IP 后,Python 底层 socket 发起 TCP 连接。requests 默认使用 urllib3 的连接池(PoolManager),会复用已有空闲连接,避免重复握手开销。

  • 首次请求耗时通常更高,后续同 host 请求可能直接复用连接(Connection: keep-alive
  • 可查看连接状态:response.raw._connection.pool.num_connections(需开启 debug 日志或 inspect urllib3.PoolManager)
  • 连接被拒绝(ConnectionRefusedError)一般表示目标端口未监听,或防火墙拦截;连接超时(TimeoutError)更可能是网络不可达或中间设备丢包

TLS 握手(仅 HTTPS):证书验证与加密协商

HTTPS 请求在 TCP 建立后立即进入 TLS 握手阶段,包括协议版本协商、密钥交换、证书校验等。这是 SSL 错误(如 CERTIFICATE_VERIFY_FAILED、SSLError)的高发环节。

零一万物开放平台
零一万物开放平台

零一万物大模型开放平台

下载

立即学习Python免费学习笔记(深入)”;

  • requests 默认启用证书验证,依赖 certifi 包内置的 CA 证书列表
  • 内网服务用自签名证书时,可传入 verify=False(不推荐)或指定 verify="/path/to/cert.pem"
  • TLS 版本限制:urllib3 1.26+ 默认禁用 TLS 1.0/1.1;如需兼容旧服务,可通过 PoolManager(ssl_version=ssl.PROTOCOL_TLSv1_2) 强制指定

HTTP 请求发送与响应接收:头与体的边界处理

TCP+TLS 就绪后,才真正发出 HTTP 请求行、头部和可选 body。服务端返回响应时,客户端需按 HTTP 协议解析状态行、headers 和 body 流。

  • Content-Length 或 Transfer-Encoding: chunked 决定如何读取响应体;requests 自动处理,但流式响应(stream=True)需手动迭代 response.iter_content()
  • 重定向由 requests 默认跟随(max_redirects=30),可通过 allow_redirects=False 观察原始 302 响应
  • 若卡在“等待响应头”,可能是服务端未写入响应、长连接挂起,或代理(如 Nginx)配置了 proxy_buffering off 且后端响应异常

不复杂但容易忽略。链路中任一环出问题,都会表现为请求失败,而错误提示未必指向真实原因——比如 DNS 失败可能报 timeout,TLS 验证失败可能被包装成 ConnectionError。动手前先分段验证,比盲目调参数更有效。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

721

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

627

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

744

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

617

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1236

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

575

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

701

2023.08.11

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号