websocket分析和前后端如何接入websocket

1、前言

websocket一般用途为消息提醒,股票行情数据推送等等,有很多用途。

我们这里简单举例理解websocket和如何前后端接入websocket;

使用网络抓包分析软件。主要是截取网络封包,并尽可能显示出最为详细的网络封包资料。

2、TCP三次握手

SYN:同步比特,建立连接;
ACK:确认比特,置1表示这是一个确认的TCP包,0则不是;
PSH:推送比特,当发送端PSH=1时,接收端应尽快交付给应用进程;

刚开始客户端和服务端都处于Closed状态,此时客户端向服务端发起主动连接:

第一次握手

SYN=1 客户端(192.168.66.65),发包到服务端(..6.***)

请求建立连接。

第二次握手

服务端收到客户端发的TCP报文之后,通过SYN=1得知客户端请求建立连接,将ACK(确认序列号)设置为客户端的序列号seq加1,并向客户端发起一个ACK=1,SYN=1的报文,进行确认是否要建立连接。

第三次握手

客户端接收到服务器发过来的包后检查确认序列号是否正确,即第一次发送的序号+1,以及标志位ACK是否为1。若正确则再次发送确认包,ACK标志为1。链接建立成功,可以发送数据了

接下应该是HTTP请求了,不过发现这里有个TCP segment of a reassembled PDU,查阅相关资料是因为报文长度超过了能够传输的最大数据分段为MSS(Maximum Segment Size),所以进行了分段传输。

HTTP 请求

传输层(Tcp): PSH(推送比特)置1,ACK置1,PSH置1说明开始发送数据,同时发送数据ACK要置1,因为需要接收到这个数据包的端给予确认。PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递
————————————————

下面时序图中,SYN指的的是SYN(synchronous建立联机)、ACK指的是ACK(acknowledgement 确认),ack指的是Acknowledge number(确认号码),seq指的是Sequence number(顺序号码)

 

`刚开始, 客户端和服务器都处于 CLOSE 状态.
此时, 客户端向服务器主动发出连接请求, 服务器被动接受连接请求.

1, TCP服务器进程先创建传输控制块TCB, 时刻准备接受客户端进程的连接请求, 此时服务器就进入了 LISTEN(监听)状态

2, TCP客户端进程也是先创建传输控制块TCB, 然后向服务器发出连接请求报文,此时报文首部中的同步标志位SYN=1, 同时选择一个初始序列号 seq = x, 此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定, SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。

3, TCP服务器收到请求报文后, 如果同意连接, 则发出确认报文。确认报文中的 ACK=1, SYN=1, 确认序号是 x+1, 同时也要为自己初始化一个序列号 seq = y, 此时, TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据, 但是同样要消耗一个序号。

4, TCP客户端进程收到确认后还, 要向服务器给出确认。确认报文的ACK=1,确认序号是 y+1,自己的序列号是 x+1.

5, 此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了`。

相关推荐

  1. vue如何使用websocket接收数据发送数据

    2024-04-14 22:20:03       40 阅读
  2. 前端WebSocket

    2024-04-14 22:20:03       30 阅读
  3. WebSocket

    2024-04-14 22:20:03       62 阅读
  4. websocket

    2024-04-14 22:20:03       52 阅读
  5. WebSocket

    2024-04-14 22:20:03       60 阅读
  6. <span style='color:red;'>WebSocket</span>

    WebSocket

    2024-04-14 22:20:03      44 阅读
  7. <span style='color:red;'>WebSocket</span>

    WebSocket

    2024-04-14 22:20:03      58 阅读
  8. WebSocket

    2024-04-14 22:20:03       55 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 22:20:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 22:20:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 22:20:03       82 阅读
  4. Python语言-面向对象

    2024-04-14 22:20:03       91 阅读

热门阅读

  1. 21、Lua 面向对象

    2024-04-14 22:20:03       39 阅读
  2. 大厂基础面试题(之四)

    2024-04-14 22:20:03       32 阅读
  3. IntPtr

    2024-04-14 22:20:03       32 阅读
  4. primefaces 中文文档

    2024-04-14 22:20:03       30 阅读
  5. 共享内存和Pytorch中的Dataloader结合

    2024-04-14 22:20:03       40 阅读
  6. 反转字符串中的单词(力扣151)

    2024-04-14 22:20:03       38 阅读
  7. 【云原生篇】深入理解K8S CNI、CRI 和 CSI

    2024-04-14 22:20:03       36 阅读
  8. 【嵌入式DIY实例】-能耗检测仪

    2024-04-14 22:20:03       31 阅读
  9. P8685 [蓝桥杯 2019 省 A] 外卖店优先级

    2024-04-14 22:20:03       34 阅读
  10. <script setup>组件内的路由守卫

    2024-04-14 22:20:03       36 阅读