HTTP 协议与 TCP/IP 协议的关系
HTTP 协议是应用层的协议,而 TCP 协议是传输层的协议,IP 协议是网络层的协议。
IP 协议主要解决网络路由以及寻址等问题,而 TCP 协议主要解决如何在 IP 层之上如何更加可靠地进行数据包的传递,即在接收端收到发送端发出的所有包,并且顺序与发出顺序一致。
所以说 TCP 是可靠的,面向连接的协议。
HTTP 协议是无状态的
无状态是指 HTTP 对事务的处理没有记忆能力,服务端并不知道客户端的状态(也就是说,你现在打开一个网页,和你之前打开同一个服务器的网页之间,并没有任何的关系)。
HTTP 是无状态的面向连接的协议。(无状态并不是说明 HTTP 协议无法保存 TCP 连接,也不能代表 HTTP 使用的是 UDP 连接–无连接)
HTTP 的长连接和短连接HTTP/1.0 默认使用短连接
HTTP/1/1 默认使用长连接
短连接:例如浏览器每一次和服务器进行一次 HTTP 操作,就会建立一次连接,当任务结束的时候,该连接就会断开。
长连接:保持连接特性。每当一个网页打开,客户端和服务端用于 HTTP 数据传输的 TCP 连接将不会被关闭,如果客户端再次访问这个服务端,将会继续使用该 TCP 连接。
使用长连接的 HTTP 协议,会在响应头加上这个属性:1
Connection:keep-alive
Keep-Alive 不会永远保持连接,它会有一个失效时间,可以在服务器上进行设置。
而实现长连接的客户端和服务端都要能够支持长连接。
HTTP 的长连接和短连接的本质,其实就是 TCP 的长连接和短连接。
TCP 连接
当网络使用 TCP 的方式来进行网络连接的时候,在读写之前需要 server 和 client 之间建立起一个连接,当读写操作完成后,再去释放这个连接。
TCP 的连接需要三次握手,而释放需要四次挥手。
从上面的图可以看出,每一次连接都是很损耗资源和时间的。
TCP 的短连接
我们来模拟一下 TCP 的短连接。首先是 Client 向 Server 发送连接请求,Server 接收到请求后建立连接,此时 Client 向 Server 发送消息,Server 回应 Client,这就是一个读写操作完成了,此时两端都可以发起 close 请求,而一般是 Client 发起,因为一般 Server 不会回应完 Client 后立马关闭连接。
这就是短连接,每次连接只能进行一次读写操作。
TCP 的长连接
同样来模拟长连接。首先一样的 Client 会向 Server 发起连接请求,Server 接收到请求后建立连接。不一样的是,此时 Client 和 Server 进行一次读写操作后,两端都不会去主动发起 close 请求,即不会主动断开连接,这样后续的读写操作都会去使用到这个连接。
长连接和短连接的优缺点
长连接因为不用对此进行握手挥手等操作,所以可以省下很多的资源和时间。
但是,由于它的存活时间较长,如果遇到恶意破坏的连接时(在短时间内多个客户端发起连接请求,且这些连接都只是占用资源而已),那么这个服务器崩溃的概率就会增大。
这时的服务器应该采取一些措施来防止这样的情况发生,例如关闭一些长时间没有进行读写操作的连接,限制每一个客户端发起的连接数等。
短连接的优点显而易见,那就是易于管理,它所存在的连接都是有用的连接,不需要额外的控制手段。
但是其缺点也是很显然,当用户在频繁地发起请求的时候,将会在 TCP 的建立和关闭上浪费相当多的资源和时间。
对长连接和短连接的选择
长连接一般用于在操作频繁,点对点的通讯,而且连接数不能太多。
例如数据库的连接就可以使用长连接。
而像 Web 上的网页之类的操作就使用短连接。它适用于连接频繁的操作。