抓包之验证content-length响应头的作用

写在前面

根据http协议的规范,content-length响应头用来标记固定长度响应信息长度,http客户端,比如浏览器也会解析这个字段来进行数据的解析。

1:测试

1.1:content-length等于实际内容匹配时

使用python脚本testcontent_lenth.py:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address = ("127.0.0.1",12345)
sock.bind(server_address)
sock.listen(100)

while True:
    conn,client_address = sock.accept()
    try:
        data = conn.recv(4096)
        response = 'HTTP/1.1 200 OK\r\nContent-Length: 10\r\n\r\nHelloWorld'
        conn.send(response.encode())
    finally:
        conn.close()

执行python testcontent_lenth.py,后浏览器访问:
在这里插入图片描述
可以看到一切正常,当然这不是我们主要要分析的情况。

1.2:content-length小于实际内容匹配时

使用python脚本testcontent_lenth.py:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address = ("127.0.0.1",12345)
sock.bind(server_address)
sock.listen(100)

while True:
    conn,client_address = sock.accept()
    try:
        data = conn.recv(4096)
        response = 'HTTP/1.1 200 OK\r\nContent-Length: 6\r\n\r\nHelloWorld'
        conn.send(response.encode())
    finally:
        conn.close()

执行python testcontent_lenth.py,后浏览器访问:
在这里插入图片描述
可以看到此时就不太对了,只获取了6个字符,这是为什么呢?这是因为啊,content-lenth的值是6,所以是浏览器根据协议只获取了6个字节,而并非只有6个字节。所以,问题出在应用层。那么对于原始tcp协议是不是完整的数据呢,我们可以通过wireshark来验证下:
在这里插入图片描述
点击开始开始抓包,接着再次在浏览器访问地址http://localhost:12345/,就会抓到如下的包:
在这里插入图片描述
可以看到实际内容就是helloworld。也可以通过tcp数据流更清晰的查看:
在这里插入图片描述
在这里插入图片描述

1.3:content-length大于实际内容匹配时

使用python脚本testcontent_lenth.py:

#! /usr/bin/python
# -*- coding: utf-8 -*-
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address = ("127.0.0.1",12345)
sock.bind(server_address)
sock.listen(100)

while True:
    conn,client_address = sock.accept()
    try:
        data = conn.recv(4096)
        response = 'HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHelloWorld'
        conn.send(response.encode())
    finally:
        conn.close()

执行python testcontent_lenth.py,后浏览器访问:
在这里插入图片描述
可以看到直接报错了,报错的原因我们可以通过console看到:
在这里插入图片描述
问题还是出在content-length上。此时wireshark的抓包是这个样子的:

在这里插入图片描述

写在后面

参考文章列表

<think>好的,用户遇到了net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content)的错误,需要帮忙解决。首先,我得回忆一下这个错误通常是什么原因导致的。206状态码表示的是部分内容,通常用于分块下载或者断点续传的情况。出现这个错误可能是因为服务器返回的内容长度(Content-Length)与实际传输的数据量不一致,导致浏览器无法正确解析。 接下来,我需要分步骤思考可能的原因和对应的解决方法。首先应该检查服务器配置,看看是否正确处理了部分内容的请求。比如,Nginx或Apache的配置是否有问题,是否支持范围请求(Range Requests)。可能需要检查相关的模块是否启用,或者配置是否正确。 然后,考虑缓存的问题。浏览器或者中间代理的缓存可能导致内容不一致,这时候清除缓存或者禁用缓存可能会有帮助。建议用户尝试使用无痕模式或者强制刷新(Ctrl+F5)来排除缓存干扰。 另外,检查文件是否完整也很重要。如果用户是在访问静态文件,比如图片、视频或者下载文件,可能文件在传输过程中损坏,或者服务器上的文件本身不完整。这时候需要重新上传或生成文件,确保其完整性。 还有可能是服务器端应用程序的问题。例如,某些框架在处理部分内容请求时可能有bug,或者自定义的Range处理逻辑有误。这时候需要检查服务器端的代码,特别是处理HTTP头部和内容分发的部分。 HTTPS配置也是一个可能的原因。有时SSL/TLS配置不正确会导致数据传输问题,可以尝试暂时禁用HTTPS,看看问题是否依然存在,以排除SSL的影响。 此外,检查Content-Length头部是否正确。服务器在响应206状态码时,必须正确计算并返回当前分块的长度,如果计算错误就会导致这个错误。可能需要检查服务器生成该头部的逻辑是否正确。 还有可能需要检查客户端的情况,比如浏览器是否有问题,或者插件干扰。可以尝试不同的浏览器或设备,看看问题是否复现。 最后,如果以上方法都无效,查看服务器日志和浏览器控制台的详细错误信息,可能会有更具体的线索。比如,是否有权限问题,或者服务器在处理请求时抛出了异常。 总结下来,处理这个错误需要从服务器配置、缓存、文件完整性、应用程序逻辑、HTTPS配置等多个方面进行排查。逐步排除可能的原因,找到具体的故障点,然后进行相应的修复。</think>**net::ERR_CONTENT_LENGTH_MISMATCH 206 (Partial Content)** 错误表示浏览器在接收分块内容时,服务器返回的 `Content-Length` 头部与实际传输的数据量不一致。以下是分步解决方案: --- ### 1. **基础排查** - **清除浏览器缓存** 按 `Ctrl+Shift+Del` 清除缓存(或使用无痕模式),避免旧缓存文件干扰。 - **强制刷新页面** 按 `Ctrl+F5` 跳过缓存重新加载资源。 - **检查网络环境** 代理、VPN 或防火墙可能截断数据,尝试切换网络环境。 --- ### 2. **服务器配置检查** #### 对于 Nginx - **启用 `Range` 支持** 确保配置中包含对范围请求的支持: ```nginx location / { # 支持分块传输 proxy_set_header Range $http_range; proxy_set_header If-Range $http_if_range; proxy_pass http://backend; # 禁用缓存(临时调试) proxy_buffering off; } ``` - **验证文件完整性** 若资源是静态文件(如视频、大文件),用 `md5sum 文件名` 检查文件是否损坏。 #### 对于 Apache - **启用 `mod_headers` 和 `mod_rewrite`** 运行 `a2enmod headers rewrite` 并重启服务。 - **添加响应头支持** ```apache <IfModule mod_headers.c> Header set Accept-Ranges bytes </IfModule> ``` --- ### 3. **检查应用程序逻辑** - **代码中的分块传输逻辑** 如果使用后端代码(如Node.js/Python)手动处理分块请求,需确保: - 正确解析 `Range` 请求头(如 `bytes=0-100`)。 - 计算并返回准确的 `Content-Length` 和 `Content-Range`。 ```python # Python Flask示例 from flask import request, send_file @app.route('/file') def send_file_partial(): range_header = request.headers.get('Range', None) # 解析range_header并处理分块 return send_file(..., conditional=True) ``` --- ### 4. **HTTPS/SSL 兼容性** - **禁用 TLS 压缩** 在 Nginx 中添加: ```nginx ssl_session_tickets off; ssl_buffer_size 4k; ``` - **更新 SSL 证书** 过期的证书可能导致传输异常,使用 `openssl s_client -connect 域名:443` 检查证书链。 --- ### 5. **高级调试** - **抓包分析** 用 Wireshark 或浏览器开发者工具的 **Network** 面板: 1. 过滤 `206` 状态码的请求。 2. 对比响应头中的 `Content-Length` 和实际接收的字节数。 3. 检查 `Content-Range` 是否合法(如 `bytes 0-100/500` 表示总长度500,当前块0-100)。 - **服务器日志分析** 检查服务器错误日志(如 Nginx 的 `error.log`),定位崩溃或超时记录。 --- ### 6. 其他可能性 - **CDN 或反向代理问题** 如果使用 Cloudflare 等 CDN,暂时禁用并直连服务器测试。 - **文件系统权限** 确保 Web 用户(如 `www-data`)有权限读取完整文件。 --- **总结步骤优先级**: 1. 清除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值