码迷,mamicode.com
首页 > Web开发 > 详细

libwebsocket协议切换状态机

时间:2016-10-18 01:58:57      阅读:736      评论:0      收藏:0      [点我收藏+]

标签:

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协议切换状态机

标签:

原文地址:http://www.cnblogs.com/bbqzsl/p/5971552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!