websocket

概述

websocket是一种改进的tcp的连接,它在连接的时候借助HTTP的协议进行连接,连接成功之后就一直保持连接,保持连接的过程中就可以实现双向消息发送,跟tcp的不同是他只需要在连接的时候加上报文头,之后在通信的时候就不需要再发送了。

其中有一个4位的操作码,用来表示发送的报文类型,分别如下:

 41         Contin = 0x0,   //表示连续消息片断
 42         Text = 0x1,     //表示文本消息片断
 43         Binary = 0x2,   //表未二进制消息片断
 44         // 0x3 - 0x7 非控制帧保留
 45         Close = 0x8,    //表示连接关闭
 46         Ping = 0x9,     //表示心跳检查的ping
 47         Pong = 0xA,     //表示心跳检查的pong
 48         // 0xB - 0xF 控制帧保留
 49         Unkown

ping-pong心跳检测

PING报文

ping是要求应答信号的,就是收到ping报文后,必须返回应答报文给发送方。
不同的websocket框架对应答报文的处理不一样,比如Tomcat框架,会将收到打ping报文原封不动的返回给发送方。

客户端和服务端一般是不会主动发送ping报文,必须要使用者主动发送。

PONG报文

pong是单向检测,收到之后不需要返回报文给pong报文的发送方。比如Tomcat,可以添加WsPongMessage的messagehandler进行处理。

心跳检测

对于任何一段的正常或异常关闭、比如杀进程,都是能通过关闭时间检测到,这是没问题。一个检测不到的情况就是网络断开,如果在断开期间双方都没有发起通信,那么是检测不到网络断开的。如果过了一段时间(比如十五分钟之内,超过十五分钟如果是Tomcat的服务器,也会主动断开连接)网络恢复,那么之前的连接还是可用的

https://www.cnblogs.com/xuemanjiangnan/p/7658362.html

http://www.itkeyword.com/doc/7024562029513903x491/tomcat-websockets-javax-websocket-session-isopen-not-always-accurate

https://blog.csdn.net/ShareUs/article/details/85246287

https://www.zhihu.com/question/20215561

https://www.cnblogs.com/interdrp/p/7903736.html

https://blog.csdn.net/u011423258/article/details/82764164

https://blog.csdn.net/zero_no1/article/details/79290566

最大连接数

https://blog.csdn.net/z915412321/article/details/52261229

Tomcat参数限制:https://blog.csdn.net/d81895606/article/details/100883085

不同框架实现的服务器:https://blog.csdn.net/thomashtq/article/details/46738253

客户端不同的层面有不同的限制

比如说操作系统的端口号最大只有六万多个,一个进程又不可能把这些端口号全都用掉

很多浏览器对连接数也有限制: IE-16个 谷歌-250个 火狐-200个

服务端

比如说Tomcat,默认有10000个限制。在springboot中可以通过以下参数调整最大连接数

server.tomcat.max-connections: '200000'

但是如果连接数很大的话会造成heap内存直接溢出,因此。要设置启动参数调大heap的大小。参数:-Xmx1024m  -Xmx1024m。分别是最大堆空间,初始堆空间。

原文地址:https://www.cnblogs.com/suntp/p/12378243.html