【1.skynet网络剖析】

skynet网络剖析


1.tcp
2.epoll
3.socket线程
4.gate服务
5.netpack 解包打包
6.service_gate.c 原理

数据流大概如下
thread_socket --> skynet_socket_poll -->forward_message
skynet_start.c
skynet节点启动时会启动一个线程专门处理socket事件
在这里插入图片描述

检测epoll事件

在这里插入图片描述
在这里插入图片描述

forward_message里 将tcp数据留发送到对应的服务的消息队列(即aocor的消息队列,一般是gate服务)
在这里插入图片描述

socket服务是怎么知道这条消息要往哪个服务发送呢?
在socket_server.c new_fd会把通过epoll_ctl add 将服务标识添加到 rbtree的event当中,这样就映射起来了
socket_server.c
在这里插入图片描述

socket_poll.h

在这里插入图片描述

socket是怎么检测有数据的呢?
socket_server.c
sp_wait返回事件的数目,并将触发的事件写入events数组中。
在这里插入图片描述

然后 forward_message_tcp 调用 read 把数据读出,每次从内核读出来的数据一开始是64个字节。

在这里插入图片描述

在这里插入图片描述

gate服务与netpack包解析
gate服务与agent中间还有个watchdog,数据进来会先到gate,gate会给watchdog发送一个请求,watchdog收到请求会启动一个agent。agent启动后会给gate发送请求forward。之后数据直接就gate发给agent,不经过watchdog。
这里主要将gate如何解析tcp数据流转化为应用层数据。

gate服务解包会调用c函数netpack.filter
在这里插入图片描述

filter_data 把type、 fd、 组装好的data(ligthuserdata)、size 返回

在这里插入图片描述

组装好的数据最终变成msg发送给服务处理
在这里插入图片描述

“more”:表示收到的数据不止一个tcp包,netpack.filter会把包依次放到队列里,然后回调函数一个个从队列中pop出来

这里贴上其它博客内容https://www.cnblogs.com/cnxkey/articles/15945319.html
这里讲到非常详细
主要数据结构 链表
在这里插入图片描述

当从内核tcp流读出的数据有两个包的数据的时候 是通过以下的递归来分隔一个个完整的逻辑数据包
在这里插入图片描述

service_gate.c是废弃的gate服务
与netpack分包类似,c的gate服务是用databuff这个ringbuff(环形buff)来进行分包的,把数据流分成一个个完整的包。
在这里插入图片描述

gate结构存了一个conn数值,conn存在databuffer
gate结构还存了一个环形队列 messagepoll
在这里插入图片描述

databuffer_push,就是把data放进环形队列。把databuffer和mp链接起来
在这里插入图片描述

环形队列初始化
在这里插入图片描述

另外一种分包模式,一个tcp一个服务
https://blog.codingnow.com/2016/03/skynet_tcp_package.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值