自己在网络通信和协议这些方面其实真的是显得比较弱,对很多知识都不是很了解,这两天看了下长连接的问题,把看的内容记录一下,后面等到实践的时候,再补充。
这里说一下,http是应用层的,而socket是应用层和传输层之间的抽象层。所以说长连接短连接虽然可以说,但本质上只tcp的长连接和短连接。
长连接
首先一般说长连接说的是TCP的长连接,有时候也会说http长连接或者socket长连接,但是这些都是建立在tcp的基础上的,因为http是在应用层,而tcp是在传输层,应用层不涉及到数据的发送和接受,只是表现出来的。
TCP连接是一个双向通道,能够保持一段时间不会关闭,因此就区分了长连接和短连接。而http来说就是把头部的Connection
设置为keep-alive
。要服务器上同样设置为keep-alive
。
长连接的好处
为什么要用长连接呢?长连接最重要的是可以服用TCP连接,这样减少了每次建立连接和断开连接的开销。所以现在大部分都是长连接,例如一个页面有很多文件,JS文件,CSS文件等等,不能每次都要建立一次连接,所以长连接是比较好的解决办法。
长连接不会长时间保持的,如果长时间没有响应,超时会自动断开的。
但是如果都保持连接,那么服务器会爆掉,所以TCP连接数量是有限制的。
使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。
短连接
那么与长连接对应的就是短连接,在Htpp 1.0之前是没有长连接的,现在在http 1.1才开始有长连接,并且大部分都是长连接。短连接的流程就是:建立连接->发送数据->断开连接
。一次发送之后立即断开连接。
短连接的好处
既然有长连接了,为什么还需要用短连接的,因为短连接虽然是之前一直使用的,但是长连接保持了连接不被断开,那么如果并发量很好的时候,就会出现问题,所以短连接不用一直占用服务器资源,可以让服务器空出资源来解决其他的连接。
银行一般使用短连接。好像是因为:管理起来比较简单,存在的连接就是有用的。
数据发送接收方式
异步
- 异步双工:接收和发送时在同一个进程中,有两个不同的子进程分别负责发送和接收
- 异步单工:接收和发送用两个不同的程序来完成。
同步
报文的发送和接收是同步进行的,也就是发送完之后,就等待返回,考虑超时,这样就保证了不会无限等待。
短轮询
轮询比较好理解,就是向服务器发送请求,服务器返回请求结果。不断的操作,就叫轮询。
短轮询比较好理解,就是说我不断的轮询的时候,每次都是即时发送即时回复,这样来更新前端的数据,用来保证数据的前后台同步。
比如电商网站,每个物品的库存,是要不断更新的,就会在前段不断的发起请求,保证数据同步。
但这样有个缺点,就是浪费了大量的资源,假如有很多人在浏览这个物品,但是暂时都没有下单,大量的请求可能已经占用了服务器的所有资源。
长轮询
长轮询就是为了解决这个问题来设计的,长轮询的操作都是一样的,前段发送请求给后端,后台接收到请求来返回,但是中间有一点不一样不是瞬间返回。也就是看是否后台的数据有更新,假如后台数据还没有更新,可以把请求暂时挂起来,这样就不会造成频繁请求堵塞服务器了。
假如一直没更新,那么就把数据超时返回就可以了。
注意事项
TCP的keep alive
是检查当前的tcp连接是否还是活着的,而HTTP的keep-alive
是设置让当前的tcp连接可以保持活着的状态。
当TCP连接一段时间没有进行数据通信的时候,一方会发出一个心跳包keep alive包
来检测当前连接是否有效,继续监控。这个间隔时间是可以设置的。