最近我为我编写的一个软件添加了一些负载均衡功能.它是一个联网的应用程序,它根据来自SQL数据库的输入执行一些数据处理.由于压缩可能非常密集,我已经添加了在不同服务器上运行此应用程序的多个实例以分割负载的功能,但现在负载平衡是一种手动操作.用户必须指定哪些实例占用输入域的哪个部分.
我想把它提升到一个新的水平,并对实例进行编程,以自动协商输入数据的潜水,并识别其中一个"消失"(已经崩溃或已经断电),以便其余的实例可以采取在失败的实例的工作量上.
为了实现这一点,我正在考虑在实例之间使用简单的心跳协议来确定谁在线以及谁不在线,虽然这不是非常复杂但我想知道是否有任何已建立的心跳网络协议(基于UDP,TCP或两者兼而有之).
显然,在集群,故障转移和高可用性技术的网络世界中,这种情况发生了很多,所以我想最后我想知道是否有任何已建立的协议或算法,我应该知道或实现.
编辑
根据答案,似乎没有完善的心跳协议或没有人知道它们(这意味着它们毕竟不是那么完善)在这种情况下我只是要滚动我自己的.
虽然没有一个答案提供了我特别想要的东西,但我会投票支持Matt Davis的答案,因为它是最接近的,他指出了使用多播的好主意.
谢谢大家的时间〜
sockets network-programming network-protocols distributed-computing
我正在学习SNMP,并使用它编写一些应用程序.我有一些关于协议的基本问题:
在网上发生数据传输的字节顺序是什么?是Little Endian还是big endian?一旦数据到达主机,它如何转换为相应的字节顺序?
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
Run Code Online (Sandbox Code Playgroud)
在这个结构中,究竟是什么意思地址家族所描述的sa_family?
这是否意味着像TCP/UDP这样的协议有"地址"?嗯,我认为协议可以是识别号码而不是地址.
无论如何,如果是,那么他们的家庭在什么基础上被划分?
我花了最后几天阅读手册页,文档和谷歌提出的任何其他内容,但我想我现在比起初时更加困惑.
这就是我想要做的事情:我希望通过带有C/C++的Linux系统上的无线接口(802.11)使用我自己的3-x协议发送和接收数据包.到现在为止还挺好.我不需要信标,关联或任何AP/SSID相关的东西.然而,对于数据传输,我希望MAC层"像往常一样",这意味着单播数据包是ACK,重传,退避等.我还想享受扩展的QoS功能(802.11e有4个队列和不同的访问类别).另一方面,混杂模式不是一个问题,我只需要广播数据包和发送到特定站的数据包.
什么是正确的方法呢?关于原始套接字访问的大多数文档似乎都集中在网络嗅探上,但这并没有帮助.我一直在玩监控模式已经有一段时间了,但从我到目前为止所读到的内容来看,收到的数据包在监控模式下没有确认等.如果没有监控模式,会有什么替代方案?使用ad hoc模式和unix原始套接字?或者我是否必须摆弄司机?
我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始.我通读了socket(2),socket(7)和packet(7)的手册页,但这对于不同模式下MAC层的行为没有帮助.
提前致谢.
linux network-programming network-protocols raw-sockets systems-programming
通过WifiManager,我的Android应用程序可以获得有关Wi-Fi的大量细节.但是我没有像a/b/g/n那样获得协议类型.我有客户要求这样做.
有谁知道如何实现这一目标?(我没有选择使用adb).它将以编程方式完成.我坚信设备和路由器在连接之前已经协商了协议.所以信息与设备有关.问题是,我们如何得到它?
我正在尝试使用mingw工具链实现使用Windows套接字的TCP打孔.我认为这个过程是正确的,但这个漏洞似乎没有.我用这个作为参考.
我认为代码中没有问题,因为:
10060)我错过了什么?
编辑:在进程资源管理器的帮助下,我看到其中一个客户端设法建立与对等方的连接.但是同行似乎并没有考虑要建立连接.
这是我用Wireshark捕获的内容.为了示例,服务器S和客户端A在同一PC上.服务器S侦听8060重定向到该PC 的特定端口().B仍然尝试连接正确的IP,因为它看到S发送的A的公共地址是,因此使用S的公共IP .(我已用占位符替换了公共IP)localhost

编辑2:我认为混淆是由于传入和传出的连接请求数据都在同一端口上传输.这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据.如果我引用msdn:
该
SO_REUSEADDR套接字选项允许套接字被另一个套接字强制绑定到一个端口在使用中.第二个套接字调用setsockopt,其中optname参数设置为SO_REUSEADDR,并且optval参数设置为TRUE在与原始套接字相同的端口上调用bind之前的布尔值.第二个套接字成功绑定后,绑定到该端口的所有套接字的行为都是不确定的.
但TCP Hole …
关于802.11 Wifi的MAC协议的问题.
我们了解到,当一个站收到数据时,它会等待SIFS时间.然后它发送数据包.在线搜索时,总是提到的原因是为ACK数据包提供更高的优先级.这是可以理解的,因为当站想要发送正常数据(并且DIFS大于SIFS)时,站首先必须等待DIFS时间.
但为什么要等呢?为什么不马上发送ACK?电台知道数据已经到达,CRC是否正确,为什么要等?
我一直在阅读"计算机网络:自上而下的方法"一书,并遇到了一个我似乎不理解的问题.
正如我所读到的,TCP拥塞控制有三种状态:慢启动,拥塞避免和快速恢复.我很了解慢启动和拥塞避免,但快速恢复非常模糊.该书声称TCP的行为方式如下:(cwnd =拥塞窗口)
我们来看下面的图表:

我们可以看到,在第16轮,发送方发送了42个段,并且因为拥塞窗口大小减半(+3),我们可以推断出有3个重复ACK.这个问题的答案声称 16到22之间的轮次处于拥塞避免状态.但为什么不快速恢复?我的意思是,在三次重复的ACK之后,TCP进入快速恢复并且每隔一次重复的ACK都应该增加拥塞窗口.为什么图表没有表示?我能想到的唯一合理的解释是,在这个图中,只有三个重复的ACK,并且之后收到的ACK不是重复的.
即使是这种情况,如果有超过3个重复的ACK,图表将如何显示?**
**我一直在努力回答这个问题很长一段时间.我会很高兴回复,谢谢!
更新这里是图像.我认为轮次定义为窗口中的所有段都被确认.在照片中,圆圈显示为圆圈.
为什么cwnd在快速恢复状态下呈指数级增长?(在图像中我偶然写了而不是指数地写)
networking ×2
protocols ×2
sockets ×2
tcp ×2
android ×1
endianness ×1
etag ×1
http ×1
linux ×1
macos ×1
raw-sockets ×1
snmp ×1
wifi ×1
wifimanager ×1
windows ×1
winsock2 ×1