我们知道, 大家经常听到的数据库连接池, 是为了避免频繁的与数据库打交道建立连接延时而保持住的连接;
可是我们也知道 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 请求却不关心这种连接次数, 一个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!~ 即使是一个 img标签 或者什么的 也是一条TCP!~ ][个人理解你看看:http是基于tcp协议的,每个文件只有一个tcp连接,每个连接上可以传送多个http请求和相应(这也是http1.1后的特点,主要解决的就是向你说的图片也有请求的问题) ftp也是基于tcp协议的,但是他有两个tcp连接:命令连接(21) 数据连接(20)]
通过抓包工具, 可以看到一个HTTP请求好像并不是一个TCP连接啊!~~ 如果每个人占用这样的HTTP连接, 人多了 同时占用 自然就把端口全占完了, 65536个端口`~
你像新浪 等这样的大型服务网站, 人多了去了, 每个人同时占几个, 别人就会产生时延啊!~~
to: 3楼同志
你的意思是说 建立数据库连接需要费很长的时间, 而HTTP得TCP连接 建立连接 却只需要很短的时间?难道还有这种差别吗?。, 同样都是TCP, 都是进行3此握手后进行数据传输啊!~
无非就是数据流量的多少, 和对方程序调用时间, 这些和你的连接毫无关系啊;你保不保持连接, 在访问的时候 这些都是要必经过的过程啊!~~真的有点不太明白,其中的原因!
但是HTTP协议中增加了Keep-Alive的功能,也就是在一次请求完成后,对应的TCP连接暂时不关闭,
可以在下次HTTP请求中继续使用这个TCP连接,这样就减少了创建连接的时间
而且HTTP协议中也会尽量使用本地Cache,像图片、CSS、JS等如果已经请求过一次,
在HTTP请求中是会要求服务器如果没有更新过,就只返回Not Modified信息而无需整个文件返回
to 6楼:
那我再请教一个问题, 一个web服务器占用着80端口; 那每个人访问的时候 是不是都是去访问80端口那么他们的 源端口是自己, 目的端口是80;
也就是说只占用一个端口, 而不是80端口监听到之后, 为它们每个人分配一个新的端口吗?
如果是分配新的端口的话 65536个 像大型WEB服务应该是早不够用了;
可是如果是同一个端口的话, 那每个人的连接处理 都由80端口发送出去?,。 那80端口不阻塞吗?。
但是一台服务器实际上不可能支撑65535个并发的,服务器早挂了,必定会有多台机器集群的
一个HTTP请求 就是一次TCP连接, HTTP会收集页面上所需要的连接地址进行筛选, 如果是同一个IP,同一个端口的TCP请求,就全部规整到一次TCP请求里, 其他的请求归属到其他TCP请求里!另外一个办法是通过缓存来减少TCP请求; HTTP 在应用层上已经做了这些事情, 再到传输层发送请求的时候, 所有的东西和需求都已经按照HTTP的协议要求写好了数据, 发送了出去, 在服务器接收到请求之后, 按照HTTP分析数据, 在组装回应数据, 然后返回并断开连接!
=====★===我===是===题===目===间===的===小===分===隔===符===★===== 看上面所说的貌似很有道理, 我们设想这样一种情况, 一个HTML页面里有50个图片,分别链接自50个网站的地址, 那看来这个请求是要占掉50个端口咯!~ 而且好像不能并发, 要并发, 也是筛选完之后, 在并发出去!~~~ 这样的话性能大大开销了啊
=====★===我===是===题===目===间===的===小===分===隔===符===★===== 再回到oracle 的连接池上来: 有人是这样说的:
oracle的每一次新连接, 都会开启一个新的端口,
这个我还是真的第一次听说, 为什么要开启多个端口呢》? 一个端口 只要一直连着 也可以保证事物和隔离级别啊!~~~ 烦请高人解答!~
就算里面的一两台down掉了,也不会对性能产生非常大的影响。
服务器集群通过一个性能卓越的网关与外网连接,而服务器集群之间,服务器集群与网关,以及网关的出口,是高速网络。当网关收到请求的时候,它会根据一个很复杂的算法为请求分配资源。
所以,不存在端口被用完的情况。至于tcp连接的策略问题,你可以自己站在设计者的角度想一想。
网络是大家的,每个用户享有公平适用网络的权利。如果你在本地保存一个连接,那么势必要维持它的有效性。也就是说,它必须一直占用一条与服务器之间的网络通道。直到你关闭这个网页。那别人还用么?想想别人在用多线程下东西的时候你的感觉。
而数据库不一样。它只为它的用户提供服务。通常都是在高速局域网里。所以,即使是一直占用网络也没有关系。