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"])。

最新文章

  1. 「译」JUnit 5 系列:条件测试
  2. dvwa第一次接触
  3. NOIP2016普及组
  4. 九、Foundation框架中的NSString常用方法
  5. react tab
  6. viewpage广告条的制作
  7. top命令 Linux查看CPU和内存使用情况
  8. C# Process类_进程_应用程序域与上下文之间的关系
  9. javascript实现倒计时
  10. sql server事物控制
  11. 手工杀毒辅助软件(PC Hunter) V1.51 免费绿色版
  12. fastq,sam文件一些小结(持续补充。。。)
  13. javaean(web作业)
  14. 【java】浅谈swtich
  15. Java获取随机数获取制定范围指定个数不重复的随机数
  16. bat批量重命名文件
  17. JDK源码分析(三)——HashMap 上(基于JDK7)
  18. 轉:Jquery绑定img的click事件
  19. Docker中配置字符集支持中文
  20. 【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码

热门文章

  1. QuartzCode快速开发动画代码工具
  2. Windows突破远程连接最大数去掉限制登录
  3. python学习-多线程并发
  4. Feign服务调用请求方式及参数总结
  5. BrickerBot
  6. 非确定的自动机NFA确定化为DFA
  7. 推荐一款现代化的脚手架项目《hope-boot》
  8. 汇编语言——物理地址=段地址x16+偏移地址,检测点2.2
  9. 10、pytest -- skip和xfail标记
  10. Vs使用EF来操作MySql(经验 )