2022年5月21日15:07:15
最近在重构优化stowaway的代码,之前没有细看的header结构体的route字段的作用,实际上这个字段就是用以实现多级代理中,和每个节点的通信的重要参数。
一般来说,不管是哪个node,发送消息给admin,Route一般只要设置成TEMP_ROUTE。当然Sender和Accepter是用来判断发送者和接收者的UUID。
而这里不需要Route,是因为每个node只会有一个上游node和多个下游node,所以你发送给上游node的时候,并不会迷路,只有一条路通往admin
而admin发送消息给某个多级node的时候,就需要路由帮忙了,虽然Sender、Accepter可以确认发送和接收者,但某个节点在拿到消息的时候,并不能确定要发送给哪个下游node才能到达最终指定node。
如下admin要发送消息给node2,那node0怎么知道是应该发送给node1还是node4。
node0只知道他路由两个子节点,孙节点就不得而知了。
但是!作为admin,既然能打印如下拓扑图,那么他自然是有各个node之间的关系,只需要有一个包用来管理node信息就行,他也确实是这么做的。
有一个topology包用来做node管理。通过把指定node的UUID发送给topology,则可获取到他对应的route。(以下是通过channel来通信的,为了线程安全)
至于topology内部的实现,有兴趣的可以仔细看看
而route的格式是怎样的呢,如下,在一个node接收到消息,发现不是发送给自己,分发给childNode时,route是用冒号隔开,以每个node的UUID作为标识拼接起来,我要发送的最终node的UUID在Accepter里,刚好Route里最后一个UUID也是。
这里调用changeRoute,来提取下一跳node的UUID,并在在Route里删除,这样每一跳,只需要把Route里最前面的UUID提取出来,就是自己要发送的childNode。
通过UUID获取childNode的conn连接对象,从而可以把消息成功发送给路由指定下的childNode。
通过每一跳从Route里提取最开头的UUID来找到需要发送给的childNode,并删除Route里最开头UUID,来实现多级代理之间的数据传递,这种方式好的地方就是每个node他无需知道孙node是谁,只需要根据Route来判断,直到Accepter是自己,就不需要往childNode传递了。
以上只是提供一个思路吧,不管是做多级代理工具还是C2,都可以做参考。