天天看点

HTTP协议与TCP协议的深刻理解

       TCP协议对应于传输层,而Http协议对应于应用层,从本质上讲,二者没有可比性,Http协议是建立在TCP协议之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过tcp建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。

不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的的话,服务器进程中就能保持住这个连接并并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。

HTTP连接举例

       我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server间传递一次读写操作。

短连接的操作步骤是:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接

继续掰扯:

       但是随着时间的推移,html页面变得复杂了,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次tcp连接就显得低效了。因为Keep_alive被提出用来解决效率低的问题。从http/1.1起,默认都开启了keep-Alive,保持连接性,简单的说,当一个网页打开之后完成之后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apach)中设定这个时间。虽然这里使用TCP连接保持了一段时间,但是这个时间是有范围的,到了时间点依然是会关闭的,所以我们还把其看做每次连接完成后就会关闭。后来通过Session或者Cookie等相关技术,也能保持一些用户的状态。但是每次都使用一个连接,依然是无状态连接。如下解释:

TCP连接举例:

节省很多消耗的。

     另外,最后关于长连接还要多提一句,那就是,长连接并不是永久连接的。如果一段时间内(具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。这一点其实很容易理解,否则的话,TCP连接将会越来越多,直到把服务器的TCP连接数量撑爆到上限为止。现在想想,对于服务器来说,服务器里的这些个长连接其实很有数据库连接池的味道,大家都是为了节省连接重复利用嘛,对不对?

     长连接的操作步骤是:建立连接——数据传输…(保持连接)…数据传输——关闭连接

继续阅读