记一次文件下载失败问题定位过程

通过mongoose下载文件的时候,概率出现下载文件不完整的情况。

软件交互流程如下:

浏览器 <----HTTP连接----> web服务器mongoose <----本地TCP连接---->cgi进程

抓包发现,问题出现的时候,cgi进程发送给mongoose的文件就是不完整的。但是通过strace命令看,cgi进程是读完了整个文件并且都通过系统接口send成功了,然后正常关闭套接字的。也就是说,cgi把文件读完了,并且都通过send函数发给协议栈了,但是有部分内容协议栈并未发出去。

仔细分析报文,cgi进程和mongoose之间连接断开方式不对劲,由于是cgi主动关闭,应该是cgi端发送FIN,但是实际上cgi发出的是RST。于是找驱动组同事分析,还好该同事是个大牛,通过走读协议栈代码,发现在以下情况下close套接字会发RST而不是FIN:接收缓冲区中有数据未被应用程序读取的时候,如果应用程序close套接字,协议栈会发送RST而不是FIN,并丢弃发送缓冲中尚未发送的数据。

结合报文和代码一看,果然mongoose在连接刚建立的时候发给cgi进程一串字符串,但是cgi进程由于用不到,就一直没有去读取。如果cgi进程close连接的时候发送缓冲区已经没有数据了,那么浏览器最终下载下来的文件是完整的;如果close的时候发送缓冲区还有数据,由于数据被丢失,所以下载下来的文件是不完整的。这也是问题为什么概率出现的原因。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我有一个梦想

Python 项目实践三(Web应用程序)第五篇

 接着上节继续学习,在这一节,我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。我们将创建一个新的应用程序,其中包含与处理用户账户相关的...

2258
来自专栏小车博客

【开源】采集1024的图片到WordPress,图床只支持chevereto

2723
来自专栏沈唁志

LNMP 下 memcached 常用指令收集整理笔记

1823
来自专栏云计算教程系列

如何使用Ubuntu 16.04的Django一键安装镜像

Django是一个用于快速开发Web应用程序的高级Python框架。Django一键安装程序通过Django,Nginx,Gunicorn和Postgres为您...

1755
来自专栏技术小黑屋

Android进程线程调度之cgroups

做Android开发的同学们,了解cgroups的同学其实不多,cgroups是什么意思呢,在操作系统中有着什么样的作用,以及Android中的cgroups有...

3122
来自专栏Golang语言社区

转--一个Go推送服务器集群:gopush-cluster

Terry-Mao/gopush-cluster 是一个支持集群的comet服务(支持websocket,和tcp协议)。 特性 轻量级 高性能 纯Golang...

45010
来自专栏猛牛哥的博客

debian使用LVM扩展第二块硬盘

1714
来自专栏杂七杂八

xss防御

XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故...

4265
来自专栏张善友的专栏

asp.net 性能调较

由于asp.net 处理进程在machine.config配置文件中的配置为<processModel autoConfig="true" />,这意味着你的a...

2177
来自专栏微服务

CentOS上安装RabbitMQ

所需环境 操作系统:Centos服务一台 网络环境:可以访问公网 安装Erlang RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写...

3769

扫码关注云+社区

领取腾讯云代金券