高可用协议招式:keepalive
什么是keepalive
Keepalive是一种技术,它可以帮助保持网络连接活跃,避免链路失效。它可以通过给双方发送定期的探测报文,来确认对侧主机是否仍然处于可用状态,并采取必要的措施保持链路的连接性、可靠性和可用性。
tcp如何实现keepalive
tcp提供了相关函数
客户端TCP keep-alive:
// 设置keep-alive参数
int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(int));
// 设置keep-alive间隔
optval = 10; // 10s
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &optval, sizeof(int));
// 设置探测次数
optval = 3; // 每10s探测3次
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &optval, sizeof(int));
// 设置探测间距
optval = 2; // 每2s探测一次
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &optval, sizeof(int));
http如何实现keepalive
http在1.1版本实现了keepalive
HTTP/1.1实现keep-alive的方法如下:
- 客户端向服务端发出请求时附带Connection: keep-alive
request = "GET / HTTP/1.1\r\n" + \
"Host: example.com\r\n" + \
"Connection: keep-alive\r\n" + \ # 附带此行
"\r\n"
- 服务端正常回复,并附带上Connection: keep-alive
response = "HTTP/1.1 200 OK\r\n" + \
"Connection: keep-alive\r\n" + \ # 附带此行
"Content-Length: {}\r\n".format(len(data)) + \
"\r\n" + data
- 客户端重用连接,后续请求仍使用此TCP连接
request = "GET /other_url HTTP/1.1\r\n" + \
"Host: example.com\r\n" + \
"Connection: keep-alive\r\n" + \ # 仍然附带此行
"\r\n"
自定义协议时该怎样实现keepalive
1.客户端定时发送心跳包:客户端定时发送心跳包,服务端收到后即回复确认码,客户端收到确认码即表示连接状态正常;
2.服务端检测客户端:服务端定时检测客户端是否响应心跳包,若客户端在指定时间内未收到确认码,则关闭该连接;
C++ demo代码:
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <fcntl.h>
using namespace std;
#defi