HTTP深入学习总结(5)——连接管理(下)

分类: 开发技术 | 作者: 尼莫船长 | 发表于 2013/10/17 2条评论


在本章,主要总结一下HTTP链接的安全关闭。

首先,HTTP是基于TCP的,所以,和所有的TCP连接一样存在安全关闭的问题。有4个方面是要注意到的:
1>可以任意时刻关闭的链接;
2>Content-length是干嘛的;
3>连接关闭有什么限制;
4>安全关闭连接;

1,可以被随时关闭的链接
没有说的,TCP连接当然可以随时暴力关掉。比如阿龙传说中的神技:拔网线……
尤其是对于管道化的连接来说,server有权利随时关闭认为是空闲的连接。

2,Content-length的结尾操作
每个HTTP的resp都有一个精确的content-length首部,用于描述包体长度。当clinet收到的包如果和content-length不一致时候,clinet就应该质疑接收到的HTTP响应包的正确性。
如果Clinet是一个缓存代理(cache proxy),那么接收端就不应该cache这条响应。而proxy需要做的就是原封不动的讲这条消息转发出去,而不是去试图矫正Content-length

3,链接关闭的可能后果

由于TCP链接可以随时被Client 或者 Server端关闭,但是其影响是不一样 的。一个HTTP应用程序,必须要能够对关闭以后的连接做容错处理。如果Client关闭,那么在恢复连接之后可以重试之前的请求;但是如果Server端关闭了,问题就可能比较麻烦,重新建立链接后,可能会有一定的响应积压,这需要一个健康的调度机制。一个典型的例子就是:客户端可以反复的刷新(GET方法)一个电商网站的首页,即便是关掉浏览器,重新开启也不会有什么问题,但是,如果提交订单(POST方法)是,Server端宕机,那么请求就不能重复执行,否则会有大问题了~这就是上文所谈到的“幂等”方法的特殊之处。而大多数浏览器目前的处理方式,会弹出一个告警对话框,警告用户可能进行了重复提交。

4,安全的、正确的关闭链接

因为TCP是双向传输的,那么在关闭的时候就会存在“半关闭”和“全关闭”的状态。
半关闭:调用shutdown()方法,单独关闭输入信道或者输出信道;
全关闭:调用close()方法,将输入和输出信道都关闭;
关闭信道的输出端总是很安全的,因为当输入信道读取buffer中的数据完毕以后,就没有任何输入了,可以认为信道关闭,不会丢数据。
只关闭输入信道是很危险的,因为可能输出端还在往buffer中写入数据,但是接收停止,可能会丢失数据。一般情况下,操作系统会向这情况下的输入信道发送一个“TCP 链接被对端重置”(TCP connection rest by peer)这样的异常信息。

而HTTP的规范中只说了一句“应该正确的关闭HTTP链接”,但是没给任何解决方案。(我个人认为这就是bull shit)
一般来说,最安全的做法就是先关闭输出信道,等待另一端对等实体关闭它的输出信道,然后关闭输入信道即可。

ok,关于HTTP协议的一些核心知识就这些了,下一章开始我们要开始研究HTTP的结构了。大体会包含:
HTTP server、代理(proxy)、缓存(Cache)、网关(Gateway)、还有就是机器人程序(robot application)这些HTTP核心架构的东西。

移动设备快速阅读本文:
  请扫描二维码  -->

"The significant problems we face cannot be solved at the same level of thinking we were at when we created them."-Albert Einstein (1879-1955)

» 本文链接地址:http://www.wanghaoyan.com/?p=203 » 英雄不问来路,转载请注明出处,谢谢。
» 您也可以订阅本站:RSS 2.0

Tag:
« »