[心得] TCP 协议"缺陷" 导致文件上传应答无法显示.

[心得] TCP 协议"缺陷" 导致文件上传应答无法显示.

最近发现 TCP 协议的"缺陷"而导致文件上传时的 BUG.
受影响的包括: boa, thttpd 和 mini-httpd 等 web server

重现步骤:
在浏览器上输入要上传的文件(文件足够大, 如 200K, boa 上选择文件大于其最大限制, 默认为 1M),
服务器CGI 程序不接收文件的文件, 仅作一般性应答, 如只输出 Hello world.

结果:
浏览器显示: "无法显示网页"

原因分析:
TCP 连接正常关闭要经过 4 次握手.
本案例中, 浏览器向 web 服务器发送一足够大文件,
而服务器处理程序不接收(或不完全接收)来自客户端的数据包,
应用程序未接收的数据包被 TCP 协议层缓冲,
导致应程序关闭 socket 连接时, TCP 不能正常运行4 次握手关闭.
服务器端 TCP 协议层, 对缓冲的数据包应答 RST (连接被重置)

这样, 浏览器即会显示 "无法显示网页".

如果在你的设备和服务器上使用了上述 WEB server,  
需要注意这样一个"异常现象"


Apache, IIS 等 WEB 服务器, 会强制收下全部数据(缓冲到本地文件) 不会出现上述问题.

这和TCP 协议的"缺陷"没有关系。 要说缺陷这是mini-httpd 服务的缺陷。
这跟协议有什么关系?甚至mini_httpd也没问题吧?我想应该是程序实现上的问题罢了。

我写的嵌入式CGI程序用于上传镜像文件到设备中并执行在线升级,web server是mini_httpd,程序可以正常上传8M的文件,至于文件大小最大是多少,跟板子的RAM还有一些其他因素有关系,具体我没有研究过。
连httpd的缺陷也不算,是你自己写的程序的问题
好久不见牛兄露面
谢谢, 我一直都在关注.
只是近几个月开发任务比较重, 没啥大事时也不想露脸,  
有事情可以发消息或邮件给我.