日期:2014-05-20  浏览次数:20640 次

关于HTTP、TCP的困惑!!


我们知道, 大家经常听到的数据库连接池, 是为了避免频繁的与数据库打交道建立连接延时而保持住的连接;


可是我们也知道 HTTP 请求却不关心这种连接次数, 一个HTTP请求可能包含十几个TCP连接!~ 但性能却没有什么影响!

是数据包太小的问题吗?。 我觉得不太可能是这种原因

=====★===我===是===题===目===间===的===小===分===隔===符===★=====


HTTP的连接关闭时有服务器发起的, 在服务器主机上产生的时延会不会影响性能呢


=====★===我===是===题===目===间===的===小===分===隔===符===★=====


HTTP是面向报文的, 而TCP是面向字节的

所以HTTP在TCP上 包装了一层支持报文的HTTP-NG,

HTTP-NG 的解释是 在单个TCP连接上, 提供多个会话层协议!

一直不太明白这句话的意思!~  
 HTTP的每个文件使用一条TCP!~ 即使是一个 img标签 或者什么的 也是一条TCP!~ 

那这个 单个TCP, 多个会话层 到底代表什么意思呢?



=====★===我===是===题===目===间===的===小===分===隔===符===★=====

迅雷等下载工具是基于P2P的, P2P 应该是基于TCP和UDP的结合体;

它是不是通过TCP握手索引和连接, 再通过UDP发送数据包呢?





------解决方案--------------------
首先是个HTTP请求是一个TCP连接,不存在多个连接的情况

我想你意思是一个HTML文件可能还包括多个图片、CSS、JS等文件,这些都是一个新的HTTP请求,对应一个连接


但是HTTP协议中增加了Keep-Alive的功能,也就是在一次请求完成后,对应的TCP连接暂时不关闭,
可以在下次HTTP请求中继续使用这个TCP连接,这样就减少了创建连接的时间


而且HTTP协议中也会尽量使用本地Cache,像图片、CSS、JS等如果已经请求过一次,
在HTTP请求中是会要求服务器如果没有更新过,就只返回Not Modified信息而无需整个文件返回
------解决方案--------------------
大型的服务器不是你想象的那样。它不是一台机器。它应该是一个庞大的集群。
就算里面的一两台down掉了,也不会对性能产生非常大的影响。
服务器集群通过一个性能卓越的网关与外网连接,而服务器集群之间,服务器集群与网关,以及网关的出口,是高速网络。当网关收到请求的时候,它会根据一个很复杂的算法为请求分配资源。
所以,不存在端口被用完的情况。

至于tcp连接的策略问题,你可以自己站在设计者的角度想一想。
网络是大家的,每个用户享有公平适用网络的权利。如果你在本地保存一个连接,那么势必要维持它的有效性。也就是说,它必须一直占用一条与服务器之间的网络通道。直到你关闭这个网页。那别人还用么?想想别人在用多线程下东西的时候你的感觉。
而数据库不一样。它只为它的用户提供服务。通常都是在高速局域网里。所以,即使是一直占用网络也没有关系。