异常错误
今天,像正常一样访问网页时,发现页面空白,没有渲染任何元素,感觉有异常。
于是打开开发者工具一看,果然发现有一条网络错误,
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
问题的原因可能有很多,需要具体环境具体排查,它只是这个问题的表象。