作者:mobiledu2502914997 | 来源:互联网 | 2023-09-05 13:25
一、RPC
1.使用的TCP链接;
2.需要寻址、编码(二进制序列化)
用Python实现一个获取可用监听端口的示例:
def findFreePort():
"""
函数返回值是当前可用来监听的一个随机端口。
"""
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 0))
# 用getsockname来获取我们实际绑定的端口号
addr, port = s.getsockname()
# 释放端口
s.close()
return port
计算机网络的常识:不同的进程不能使用同一端口。
后来想到了之前用过的神器scapy, 于是,十几行代码解决了我的这个问题。
核心代码如下:
#如果我们接收到一个SYN包,则我们构造一个SYN ACK包返回去。
if x['TCP'].flags == 0x02:
ipp = IP(dst=x['IP'].src,src=x['IP'].dst)
tcpp = TCP(sport=x['TCP'].dport,dport=x['TCP'].sport)
tcpp.flags = 0x012 # syn ack flag
tcpp.ack = x['TCP'].seq + 1
send(ipp/tcpp)
#如果我们接收到一个FIN ACK包,我们则返回一个ACK包。否则他会重传。
elif x['TCP'].flags == 0x011:
#if we recv a FIN ACK, we need to back a ACK
ipp = IP(dst=x['IP'].src,src=x['IP'].dst)
tcpp = TCP(sport=x['TCP'].dport,dport=x['TCP'].sport)
tcpp.seq = x['TCP'].ack
tcpp.ack = x['TCP'].seq + 1
res_packet = ipp/tcpp
send(res_packet)
elif x['TCP'].flags == 0x018:
if x.haslayer("Raw") == 1:
print "%s:%d ------%s:%d"%( x['IP'].src, x['IP'].sport, x['IP'].dst, x['IP'].dport)
hexdump(x.load)
当然这时候这个代码还没法运行,因为相应端口的请求的包,如果该端口没有开启,系统会提前发送RST包,结束该会话。
所以最后,我们用iptable, 将出去的RST包过滤掉。就可以了实现全端口监听了。
是不是很cool:)
3.RPC与HTTP对比
(1)HTTP是应用层协议,而TCP是传输层协议
(2)RPC框架有:gRPC(基于HTPP2.0和Netty框架,序列化方法是protobuf)、Dubbo(阿里的,现在阿里用hsf)
(3)HTTP需要三次握手,RPC不需要
二、clipper
http://clipper.ai/tutorials/basic_concepts/
1.主要包含query、manage和container
2.
三、hippo
1.定位是:简单易用的在线服务调度系统
2.其他调度系统:mesos、yarn、fuxi;
3.
四、Carbon
五、drogo
drogo的作用是应用与Hippo间的桥梁。
六、Jupiter NoteBook