我们知道,  大家经常听到的数据库连接池, 是为了避免频繁的与数据库打交道建立连接延时而保持住的连接;
可是我们也知道 HTTP 请求却不关心这种连接次数,  一个HTTP请求可能包含十几个TCP连接!~ 但性能却没有什么影响!是数据包太小的问题吗?。  我觉得不太可能是这种原因=====★===我===是===题===目===间===的===小===分===隔===符===★=====
HTTP的连接关闭时有服务器发起的, 在服务器主机上产生的时延会不会影响性能呢
=====★===我===是===题===目===间===的===小===分===隔===符===★=====
HTTP是面向报文的,  而TCP是面向字节的所以HTTP在TCP上 包装了一层支持报文的HTTP-NG,HTTP-NG 的解释是  在单个TCP连接上, 提供多个会话层协议!一直不太明白这句话的意思!~  
 HTTP的每个文件使用一条TCP!~ 即使是一个 img标签 或者什么的 也是一条TCP!~ 那这个  单个TCP, 多个会话层 到底代表什么意思呢?=====★===我===是===题===目===间===的===小===分===隔===符===★=====迅雷等下载工具是基于P2P的, P2P 应该是基于TCP和UDP的结合体;它是不是通过TCP握手索引和连接, 再通过UDP发送数据包呢?

解决方案 »

  1.   

    [一直不太明白这句话的意思!~  
    HTTP的每个文件使用一条TCP!~ 即使是一个 img标签 或者什么的 也是一条TCP!~ ][个人理解你看看:http是基于tcp协议的,每个文件只有一个tcp连接,每个连接上可以传送多个http请求和相应(这也是http1.1后的特点,主要解决的就是向你说的图片也有请求的问题)  ftp也是基于tcp协议的,但是他有两个tcp连接:命令连接(21) 数据连接(20)]
      

  2.   

    http客户端和服务器端的连接是瞬时的,只要服务器端响应完毕,连接就断掉了。而数据库的连接如果不显式关闭的话会一直保留着,而且建立连接需要费相对很长的时间。
      

  3.   


    通过抓包工具, 可以看到一个HTTP请求好像并不是一个TCP连接啊!~~  如果每个人占用这样的HTTP连接,  人多了 同时占用 自然就把端口全占完了, 65536个端口`~
    你像新浪 等这样的大型服务网站,  人多了去了, 每个人同时占几个, 别人就会产生时延啊!~~
      

  4.   


    to: 3楼同志

    你的意思是说 建立数据库连接需要费很长的时间,  而HTTP得TCP连接 建立连接 却只需要很短的时间?难道还有这种差别吗?。,  同样都是TCP, 都是进行3此握手后进行数据传输啊!~
    无非就是数据流量的多少, 和对方程序调用时间,  这些和你的连接毫无关系啊;你保不保持连接, 在访问的时候 这些都是要必经过的过程啊!~~真的有点不太明白,其中的原因!
      

  5.   

    首先是个HTTP请求是一个TCP连接,不存在多个连接的情况我想你意思是一个HTML文件可能还包括多个图片、CSS、JS等文件,这些都是一个新的HTTP请求,对应一个连接
    但是HTTP协议中增加了Keep-Alive的功能,也就是在一次请求完成后,对应的TCP连接暂时不关闭,
    可以在下次HTTP请求中继续使用这个TCP连接,这样就减少了创建连接的时间
    而且HTTP协议中也会尽量使用本地Cache,像图片、CSS、JS等如果已经请求过一次,
    在HTTP请求中是会要求服务器如果没有更新过,就只返回Not Modified信息而无需整个文件返回
      

  6.   


    to 6楼:

    那我再请教一个问题,  一个web服务器占用着80端口;   那每个人访问的时候  是不是都是去访问80端口那么他们的 源端口是自己,  目的端口是80;  
    也就是说只占用一个端口, 而不是80端口监听到之后, 为它们每个人分配一个新的端口吗?
    如果是分配新的端口的话  65536个 像大型WEB服务应该是早不够用了;
    可是如果是同一个端口的话, 那每个人的连接处理 都由80端口发送出去?,。  那80端口不阻塞吗?。
      

  7.   

    每个用户访问Web服务器时都是访问80端口的,不会存在阻塞情况的,因为在TCP表上,目标的地址和端口不一样,系统是可以明确区分开的
    但是一台服务器实际上不可能支撑65535个并发的,服务器早挂了,必定会有多台机器集群的
      

  8.   

    刚才道听途说, 不知道正不正确,  下面请看详细内容:


    一个HTTP请求 就是一次TCP连接, HTTP会收集页面上所需要的连接地址进行筛选, 如果是同一个IP,同一个端口的TCP请求,就全部规整到一次TCP请求里, 其他的请求归属到其他TCP请求里!另外一个办法是通过缓存来减少TCP请求; HTTP 在应用层上已经做了这些事情, 再到传输层发送请求的时候, 所有的东西和需求都已经按照HTTP的协议要求写好了数据, 发送了出去,  在服务器接收到请求之后, 按照HTTP分析数据, 在组装回应数据, 然后返回并断开连接!

    =====★===我===是===题===目===间===的===小===分===隔===符===★===== 
    看上面所说的貌似很有道理,  我们设想这样一种情况,  一个HTML页面里有50个图片,分别链接自50个网站的地址,  那看来这个请求是要占掉50个端口咯!~  而且好像不能并发,  要并发, 也是筛选完之后, 在并发出去!~~~ 这样的话性能大大开销了啊
    =====★===我===是===题===目===间===的===小===分===隔===符===★===== 
    再回到oracle 的连接池上来:  有人是这样说的:


    oracle的每一次新连接, 都会开启一个新的端口, 
    这个我还是真的第一次听说, 为什么要开启多个端口呢》?  一个端口 只要一直连着 也可以保证事物和隔离级别啊!~~~  烦请高人解答!~
      

  9.   

    大型的服务器不是你想象的那样。它不是一台机器。它应该是一个庞大的集群。
    就算里面的一两台down掉了,也不会对性能产生非常大的影响。
    服务器集群通过一个性能卓越的网关与外网连接,而服务器集群之间,服务器集群与网关,以及网关的出口,是高速网络。当网关收到请求的时候,它会根据一个很复杂的算法为请求分配资源。
    所以,不存在端口被用完的情况。至于tcp连接的策略问题,你可以自己站在设计者的角度想一想。
    网络是大家的,每个用户享有公平适用网络的权利。如果你在本地保存一个连接,那么势必要维持它的有效性。也就是说,它必须一直占用一条与服务器之间的网络通道。直到你关闭这个网页。那别人还用么?想想别人在用多线程下东西的时候你的感觉。
    而数据库不一样。它只为它的用户提供服务。通常都是在高速局域网里。所以,即使是一直占用网络也没有关系。