yamux: how to work?
{collapse}
{collapse-item label="一、项目地址" open}
giuthub:yamux
{/collapse-item}
{collapse-item label="二、消息格式" open}
yamux头部数据
flag的类型
消息类型
{/collapse-item}
{collapse-item label="三、数据交互流程" open}
1.双方tcp三次握手完成之后,客户端发起处理请求需要创建一个新的stream,客户端发送yamux封装的syn包给服务端,这个封装的包是12个字节,服务端回复ack
2.服务端收到客户端yamux封装的syn包后,封装yamux的syn ack包给客户端,这个封装的包是12个字节,客户端回复ack,此时双方共识了这个stream
3.客户端或者服务端需要发送数据给对方时,需要先发送一个yamux封装的数据包头,12个字节,指明要发送的数据的长度,对方回应一个ack,之后就开始发送数据包
{/collapse-item}
{collapse-item label="四、调用read收包原理" open}
创建完一个stream之后,返回的是一个net.conn类型的接口,收数据包时,调用net.conn接口的read时,实际上调用的是stream对象的read,stream的read使用goto的方法判断recvBuf有没有数据,有数据将数据拷贝给read函数的参数buf中,并返回拷贝的数据大小
在recvloop的协程中通过io.readFull从soket中收到数据包头时,根据数据包头的消息类型调用提前绑定好的函数,如果数据类型是data类型,则会调用readData函数,将数据拷贝到recvBuf中
{/collapse-item}
{/collapse}