16 | 服务器为什么回复HTTP 400?
该思维导图由 AI 生成,仅供参考
HTTP 协议的前世今生
- 深入了解
- 翻译
- 解释
- 总结
本文通过一个关于服务器回复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-257 - 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-2522 - Chaochunks 就不使用content-length 来描述内容, 是规定一个结束符来结束传输的
作者回复: 对,请求里有Tansfer-Encoding: chunks 这个 header就表示用块传输方式,不需要也无法用Content-Length表达数据载荷长度
2022-02-251 - 原则请问老师,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归属地:广东