网络排查案例课
杨胜辉
eBay 资深运维专家,流量系统负责人
22781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
实战三:不用抓包就能做的网络排查篇 (2讲)
网络排查案例课
15
15
1.0x
00:00/00:00
登录|注册

16 | 服务器为什么回复HTTP 400?

HTTP 500 Internal Server Error
HTTP 200 OK
请求不符合HTTP规范
头部与载荷之间用两次CRLF分隔
分为头部 (headers) 和载荷 (body/payload)
常见auth-scheme:Basic, Digest
格式:Authorization: <auth-scheme> <authorization-parameters>
多余的CRLF导致头部与载荷分界线混淆
HTTP PUT请求的Authorization头部格式错误
定位HTTP请求格式问题
对比正常与异常HTTP事务
抓包分析
HTTP/3 (基于QUIC,使用UDP)
HTTP/2
HTTP/1.1
HTTP/1.0
HTTP/0.9
Mozilla Developer Network (MDN) 文档
RFC 7230-7235 (HTTP/1.1 更新)
RFC 2616 (HTTP/1.1)
HTTP请求的动词加URL部分的分类?
如何表示HTTP载荷的“动态”长度?
使用openssl模拟HTTPS请求
使用telnet模拟HTTP请求
其他常见返回码
HTTP 400 Bad Request
HTTP报文结构
Authorization头部
根因
排查步骤
客户端测试对象存储服务时遇到HTTP 400错误
版本历史
奠基者:蒂姆·博纳斯·李 (Tim Berners-Lee)
超文本传输协议 (Hypertext Transfer Protocol)
推荐阅读
思考题
实验模拟HTTP请求
HTTP返回码
HTTP协议细节
HTTP 400 Bad Request案例分析
HTTP协议概述
HTTP协议排查与理解

该思维导图由 AI 生成,仅供参考

你好,我是胜辉。
在上节课里,我们回顾了一个与 HTTP 协议相关的 Nginx 499 的案例。在应用层的众多“明星”里,HTTP 协议无疑是“顶流”了,可以说目前互联网上的大部分业务(电商、社交等),都是基于 HTTP 协议,当然也包括我们用极客时间学习的时候,也是在用 HTTP。那么相应的,HTTP 方面的排查能力,对于我们做开发和运维技术工作来说,就更加重要了。因为不少现实场景中的故障和难题,就与我们对 HTTP 的理解以及排查能力,有着密切的联系。
所以这一讲,我们会来看一个 HTTP 相关的报错案例,深入学习这其中的排查技巧。同时,我也会带你学习 HTTP 这个重要协议的规范部分。这样,以后你处理类似的像 HTTP 4xx、5xx 的报错,或者其他跟 HTTP 协议本身相关的问题时,就有分寸,知道问题大概的方向在哪里、如何开展排查了。
那么在介绍案例之前,我们先简单地回顾一下 HTTP 协议。

HTTP 协议的前世今生

HTTP 的英文全称是 Hypertext Transfer Protocol,中文是超文本传输协议,它的奠基者是英国计算机科学家蒂姆·博纳斯·李(Tim Berners-Lee)。1990 年,他为了解决任职的欧洲核子研究组织(CERN)里,科学家们无法方便地分享文件和信息的问题,由此创造了 HTTP 协议。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过一个关于服务器回复HTTP 400的案例,深入探讨了HTTP协议的排查技巧和规范部分。文章首先回顾了HTTP协议的历史和发展,包括创始人、版本演变以及最新的HTTP/3。接着详细介绍了HTTP 400 Bad Request的定义和RFC规范,强调了该状态码表示请求存在语法错误,服务器无法理解。通过实际案例分析,文章展示了排查HTTP 400报错的过程,包括抓包、TCP流跟踪和阅读RFC等步骤。最后,文章提出了问题的关键:在具体案例中,请求存在何种语法错误导致了HTTP 400的返回。整体而言,本文通过具体案例深入浅出地介绍了HTTP协议相关的排查技巧和规范,对于开发和运维人员具有实际指导意义。文章通过对比分析、HTTP头部规范和HTTP报文分隔等方式,解决了HTTP 400 Bad Request的根本问题,展示了对应用层协议的理解在排查网络问题中的重要性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络排查案例课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 潘政宇
    1. HTTP chunk 2.属于header

    作者回复: 是的,你做开发,对这个很清楚:)

    2022-02-25
    7
  • whr
    杨老师好,我现在有一个事件比较奇怪,单位有一台监控机A,利用ping功能,每2分钟ping一次文件列表中的10几台机器,如果有异常就报警。其中有一台windows2008R2,每7-10天就会出现一次ping不通告警。于是我在另一台B服务器上每分钟也ping这台异常的机器,但是A报警时,B却没有异常。正常分析,如果A的ping有问题,为啥10几台服务器只有这一台告警呢?如果被监控机有问题,为啥只有A报警,B不告警呢? 请问杨老师,这种现象有什么思路查找原因,谢谢。

    作者回复: 您好,网络环境复杂,一两句也无法给你一定准确的回复,请谅解:)个人理解,你的A和B到windows机器的网络路径,可能不同。有可能A到windows机器的路径上有个节点(多半是网络设备)会偶尔不工作。我们以前就发现类似问题,甚至内网ECMP多条路径中,某一条会偶尔出错,修复这条路径就好了。 你先找找看A和B到windows的路径差异在哪里?

    2022-02-25
    2
    2
  • Chao
    chunks 就不使用content-length 来描述内容, 是规定一个结束符来结束传输的

    作者回复: 对,请求里有Tansfer-Encoding: chunks 这个 header就表示用块传输方式,不需要也无法用Content-Length表达数据载荷长度

    2022-02-25
    1
  • 原则
    请问老师,quic 是一种协议吗?还是说只是 UDP+HTTP/2 组合起来,才被称为 quic

    作者回复: QUIC是UDP+TLS+HTTP/2,里面有TLS的。可以认为QUIC是一整套协议集,相对其他单个协议来说是比较重的。 UDP在内核中的实现相对TCP要简单许多,这就是QUIC看重的地方:把拥塞控制等逻辑都搬到QUIC里。要知道,QUIC本身并不被内核所支持,内核看到的仅仅是UDP。 QUIC要能工作,需要客户端和服务端都有对应的QUIC支持才行,单纯凭原生的内核是不行的--这即是缺点,也是优点。

    2023-06-10归属地:广东
  • DAYDAYUP
    需要补充一点telnet模拟http 1.1 请求时,需要带上 Host头。 实际操作: 在用telnet 模拟http 请求时,出现400错误 Trying 10.X.X.X... Connected to 10.X.X.X Escape character is '^]'. GET /sync/ping HTTP/1.1 HTTP/1.1 400 Bad Request Date: Wed, 04 Jan 2023 10:38:38 GMT Content-Type: text/html Content-Length: 163 Connection: close Server: Intsig Web Server ... MDN解释: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Host "所有 HTTP/1.1 请求报文中必须包含一个Host头字段。对于缺少Host头或者含有超过一个Host头的 HTTP/1.1 请求,可能会收到400(Bad Request)状态码。“

    作者回复: 是的,HTTP/1.1的规范里是需要客户端提供Host头部的。在实际场景中,有些服务端也会“兼容”这种缺少Host头部的情况,比如telnet www.baidu.com 80后发送GET / HTTP/1.1,我们还是可以得到一个HTTP 200 OK。

    2023-01-04归属地:上海
  • 上杉夏香
    还以为不属于headers。做这个判断的依据是HTTP/2。HTTP/2中,采用头部压缩的方式,进行数据传输。请求方法和请求路径都作为压缩字典的存在,类似CSS中的伪类咯~

    作者回复: HTTP/1.x的一个很大的性能问题是头部占整体报文的比例太大,相当于大车拉很少的货。为了提升有效载荷占整体报文的比例,势必要把头部的占比降下来。HTTP/2实现这一点所用的方法是头部压缩。比如请求方法和请求路径都在静态字典中,这样的只要传输一个数字2就可以代表GET这个方法了。既然HTTP/2的这个优化叫“头部压缩”,自然,请求方法和请求路径也属于“头部”了~

    2022-06-21
  • 新技术或者新事物的产生: 大部分都是 某位大佬要去做某件事情,解决某个问题 发现市面上已有的工具不能满足要求 或者用着体验不好,于是自己就去实现一个出来

    作者回复: 嗯包括wireshark、http、linux,都是差不多这个状况下的产物:)

    2022-03-27
  • 追风筝的人
    1. don't know ,老师 chunk 字段是不是http2 head stream里的概念? 2. 属于header

    作者回复: 1. 当http响应的头部里有Transfer-encoding: chunk,就不会带Content-Length头部了(带了的话可能引起一些客户端异常),这是HTTP/1.1的概念。 2. 正确。而且我发现这个题,同学们都答对了:)

    2022-02-28
  • 追风筝的人
    HTTP 的各种版本的知识点:HTTP/2 和 HTTP/3 的语义跟 HTTP/1.x 是一致的,不同的是 HTTP/2 和 HTTP/3 在传输效率方面,采用了更加先进的方案。Authorization 头部的知识点:它的格式为 Authorization: ,如果缺少了某一部分,就可能引发服务端报 HTTP 400 或者 500。HTTP 报文的知识点:两次回车(两个 CRLF)是分隔 HTTP 头部和载荷的分隔符。HTTP 返回码的知识点:HTTP 400 Bad Request 在语义上表示的是请求不符合 HTTP 规范的情况,各种不合规的请求都可能导致服务端回复 HTTP 400。

    作者回复: 赞~

    2022-02-28
  • 原则
    1. chunk 传输 2. 属于 header 我们也曾经遇到过 400 的问题,不过不是格式错误,而是我们服务端有连接池,下一条 TCP 连接残留了上一条连接的数据,内部引发了 400。
    2023-06-10归属地:广东
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部