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协议切换状态机的更多相关文章
- websocket可以做什么
本篇介绍的是websocket,但是并不介绍它的协议格式,一般能看明白http头也能明白websocket在协议切换前的协商,能看明白IP报头也就对websocket在协议切换后通讯格式不陌生.web ...
- DLedger —基于 raft 协议的 commitlog 存储库
“点击获取上云帮助文档” 尊敬的阿里云用户: 您好!为方便您试用开源 RocketMQ 客户端访问阿里云MQ,我们申请了专门的优惠券,优惠券可以直接抵扣金额.请填写下您公司账号信息,点击上图,了解更多 ...
- HTTP协议 (六) 状态码详解
HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果 ...
- HTML5 直播协议之 WebSocket 和 MSE
当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 WebRTC. 今天我要向 ...
- 【积硅计划】http协议基础
http:超文本传输协议,它允许将超文本标记(html)文档从web服务器传送到浏览器.目前版本HTTP/1.1 http请求过程: proxy:代理服务器,网络信息的中转站.功能如下: ...
- (转)TCP协议那些事
(上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...
- HTTP协议状态码详解
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- HTTP协议之状态码详解
转自:http://www.cnblogs.com/TankXiao/ 什么是HTTP状态码 HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事. 状态码位于HTTP Response ...
- 超文本传输协议-HTTP/1.1
超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...
随机推荐
- webpack4.0入门总结
1. 安装webpack: // 初始化.安装webpack以及webpack-clinpm init npm install --save-dev webpack webpack-cli 2.创建配 ...
- amoeba-mysql
配置完成后无法连接 Could not create a validated object, cause: ValidateObject failed 查看logs/下面的 messageHandle ...
- 《HelloGitHub》第 43 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials
原文链接:Sentinel Getting Started And Integration of Spring Cloud Alibaba Tutorials Sentinel Getting Sta ...
- Shiro 并发登录控制
本文转载于:https://www.w3cschool.cn/shiro/epht1ifg.html
- 【RabbitMQ 实战指南】一 延迟队列
1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后3 ...
- 云计算 docker 容器使用命令
docker 使用命令: docker version 查看docker版本号 vi /etc/docker/daemon.json { "registry-mirrors": [ ...
- rem辅助式响应布局
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【C#多线程】1.Thread类的使用及注意要点
Thread随便讲讲 因为在C#中,Thread类在我们的新业务上并不常用了(因为创建一个新线程要比直接从线程池拿线程更加耗费资源),并且在.NET4.0后新增了Task类即Async与await关键 ...
- iOS开发高级分享 - iOS上的设备标识符和指纹
苹果认可的标识符 Apple提供了各种API,以方便用户识别各种用途: 通用标识符(UDID) 在iOS的早期,苹果公司提供了一个uniqueIdentifier财产上UIDevice-亲切地称为ud ...