zoukankan      html  css  js  c++  java
  • 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"])。

  • 相关阅读:
    深圳和上海
    肖舸的“畅销门”和“卓越门”
    一件小事引发的辞职——团队里的Y君
    同洲、宇龙手机源代码之争
    《过得去》
    评肖舸之《0bug一书给谁带来了奶酪?》
    《观止》点滴
    webgame 地图加载(论坛摘录)
    分块加载(转)
    45度游戏的另类深度排序(copyPixels)
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/5971552.html
Copyright © 2011-2022 走看看