Hot For Coding

Chrome加载资源错误ERR_CONTENT_LENGTH_MISMATCH

full chrome_err_content_length_mismatch.jpg

异常错误

今天,像正常一样访问网页时,发现页面空白,没有渲染任何元素,感觉有异常。

于是打开开发者工具一看,果然发现有一条网络错误,

xxxx.js net::ERR_CONTENT_LENGTH_MISMATCH

如以上截图,这个错误我还是第一次遇见,有点懵,光从错误代号上大概就能直到意思,在接收这条脚本内容时实际字节数与HTTP协议头字段Content-Length不匹配。

意思大概是懂了,但有点理解不了,HTTP是基于TCP传输的,所以TCP理论上是应该会把所有的内容都会通过TCP的分段传送到客户端,不应该出现接收的长度是缺失的。

通过curl命令请求那条脚本,发现了一些异常

$ wget http://192.168.21.86/oauth/js/chunk-vendors.978e52e4.js
--2020-07-15 14:22:01--  http://192.168.21.86/oauth/js/chunk-vendors.978e52e4.js
Connecting to 192.168.21.86:80... connected.
HTTP request sent, awaiting response... 200
Length: 2420934 (2.3M) [application/javascript]
Saving to: ‘chunk-vendors.978e52e4.js’

chunk-vendors.978e52e4.js                      5%[====>                                                                                         ] 140.54K  --.-KB/s    in 0.02s

2020-07-15 14:22:01 (7.21 MB/s) - Connection closed at byte 143918. Retrying.

--2020-07-15 14:22:02--  (try: 2)  http://192.168.21.86/oauth/js/chunk-vendors.978e52e4.js
Connecting to 192.168.21.86:80... connected.
HTTP request sent, awaiting response... 206
Length: 2420934 (2.3M), 2277016 (2.2M) remaining [application/javascript]
Saving to: ‘chunk-vendors.978e52e4.js’

chunk-vendors.978e52e4.js                     11%[+++++=====>                                                                                   ] 281.05K  --.-KB/s    in 0.01s

2020-07-15 14:22:02 (11.1 MB/s) - Connection closed at byte 287791. Retrying.

--2020-07-15 14:22:04--  (try: 3)  http://192.168.21.86/oauth/js/chunk-vendors.978e52e4.js
Connecting to 192.168.21.86:80... connected.
HTTP request sent, awaiting response... 206
Length: 2420934 (2.3M), 2133143 (2.0M) remaining [application/javascript]
Saving to: ‘chunk-vendors.978e52e4.js’

chunk-vendors.978e52e4.js                     17%[+++++++++++====>                                                                              ] 421.55K  --.-KB/s    in 0.02s

2020-07-15 14:22:04 (9.00 MB/s) - Connection closed at byte 431664. Retrying.

--2020-07-15 14:22:07--  (try: 4)  http://192.168.21.86/oauth/js/chunk-vendors.978e52e4.js
Connecting to 192.168.21.86:80... connected.
HTTP request sent, awaiting response... 206
Length: 2420934 (2.3M), 1989270 (1.9M) remaining [application/javascript]
Saving to: ‘chunk-vendors.978e52e4.js’

chunk-vendors.978e52e4.js                     23%[++++++++++++++++=====>                                                                        ] 562.05K  --.-KB/s    in 0.01s

2020-07-15 14:22:07 (10.5 MB/s) - Connection closed at byte 575537. Retrying.

基本上,每接收一小段字节,TCP连接就会关闭一次,然后curl程序会Retrying,基本上最后也能收完,但中断N次。

那问题来,既然能收完,为什么浏览器会提示错误呢?我猜测浏览器应该是在第一次中断之后没有重试,于是在第一次中断后实际已接收的字节与实际文件的字节数不匹配,于是就报错。

实际原因

一开始,我以为是我这边的网络不稳定,可这是一个内网的服务,带宽经过测试证明我本机的网络I/O没问题,于是出问题的可能性只能是服务器端来。

登录上服务器,经过一些基本日志的分析以及机器状态的检查,原来最根本的原因是磁盘满了

把磁盘清空一下,服务立即恢复正常

我猜测因为这个脚本的大小正好超出了目前机器TCP Stream WriteBuffer的大小,通常在TCP传送字节之前,先要读取文件的一部分或全部字节然后写入到WriteBuffer里,而WriteBuffer在没有收到ACK之前是不会清空的,加上磁盘已经满了,导致传送一部分字节之后只能Connection Closed连接关闭。

所以造成ERR_CONTENT_LENGTH_MISMATCH问题的原因可能有很多,需要具体环境具体排查,它只是这个问题的表象。

分享

TITLE: Chrome加载资源错误ERR_CONTENT_LENGTH_MISMATCH

LINK: https://www.qttc.net/536-chrome-err-content-length-mismatch.html

NOTE: 原创内容,转载请注明出自琼台博客