libwebsocket协议切换状态机

Posted bbqz007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libwebsocket协议切换状态机相关的知识,希望对你有一定的参考价值。

libwebsocket为连接(connection)定义了一组状态机-lws_connection_states,通过状态机我们来看libwebsocket如何实现协议的切换。
除了lws_connection_states状态机外,还为连接定义了模式connection_mode作用于lws_connection_states状态机。
下面是libwebsocket的server端在协议切换的状态机图:

蓝色的是connection_mode(LWSCM开头),黄色的是lws_connection_states(LWSS开头)。一种模式可以处于某几个状态,而一个状态又可以变换模式,所以这个状态机的状态应该由两者同时确定。
当一个连接入来时,server为连接(底层socket)创建一个wsi(websocket instance),这时以LWSS_HTTP状态LWSCM_HTTP_SERVING模式开始。很明显就是在等待http request。
数据入来时,连接一边读一边解析,状态变为LWSS_HTTP_HEADERS。也就是读入http协议头字段。
当读到第一个空行CFLR后,http协议头部分结束。开始分析http协议头携带的信息,如果要求upgrade成websocket的话,模式将变成LWSCM_WS_SERVING,进入协议切换;否则模式变成LWSCM_HTTP_SERVING_ACCEPTED。表示接受了一个http request。
在处理http协议模式中,首先会将资源路径命中挂接点的请求向客户端发响应通知重定向,不满足重定向的http请求将回调vhost的第一个protocol的处理过程,交由第一个protocol的实现来处理,也就是说http服务的实现就必须安排在vhost的protocol数组的第一个位置。
由于libwebsocket支持http/1.1规定的持久连接,libwebsocket在跑完一个http请求后并不马上关闭连接,而是根据请求的connection字段来判定,如果是close的话马上关闭,否则状态回到LWSS_HTTP模式回到LWSCM_HTTP_SERVING,等待下一个http request。

lws的client端则通过http响应状态值来判断,200则转到状态LWSS_CLIENT_HTTP_ESTABISHED模式LWSCM_HTTP_CLIENT_ACCEPT,101则将会转到状态LWSS_ESTABLISHED模式LWSCM_WS_CLIENT。
libwebsocket的client端在协议切换的状态机图:

ws://host:port/protocol将会转换成向host:port的http服务器发送http请求,资源路径为protocol,要求upgrade成websocket,选择第二协议为protocol。相当于h5的new WebSocket("host:port", ["protocol"])。

以上是关于libwebsocket协议切换状态机的主要内容,如果未能解决你的问题,请参考以下文章

Raft算法和Gossip协议

Raft算法和Gossip协议

MinGW 编译libwebsockets

C#状态机Stateless 使用

状态机解决复杂逻辑及使用

libwebsockets libwebsockets-webserver.c hacking