keepalive ping是一种通过transport发送HTTP2 ping来检查通道当前是否工作的方法。它是周期性发送的,如果在某个超时周期内该ping没有得到对等方的确认,则传输断开连接。
本指南记录了gRPC core中控制keepalive ping行为方式。
keepalive ping由两个重要的通道参数控制:
- GRPC_ARG_KEEPALIVE_TIME_MS
此channel参数控制在transport上发送keepalive ping的时间间隔(以毫秒为单位)。 - GRPC_ARG_KEEPALIVE_TIMEOUT_MS
此channel参数控制keepalive ping的发送方等待确认的时间(以毫秒为单位)。如果在此时间内未收到确认,它将关闭连接。
上面的两个通道参数对于大多数用户来说应该足够了,但是以下参数在某些用例中也很有用。
- GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS
如果将此通道参数设置为1(0:false; 1:true),则即使没有请求进行,也可以发送keepalive ping。 - GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA
当没有其他数据(数据帧或标头帧)要发送时,此通道参数控制可发送的最大ping数。如果超出限制,GRPC Core将不会继续发送ping。将其设置为0将允许在不发送数据的情况下发送ping命令。 - GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS
如果transport中没有接收到数据帧,则此channel参数控制gRPC Core在连续的ping之间等待的最短时间(以毫秒为单位)。 - GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS
如果transport中没有发送数据帧,则服务器端的此channel参数控制gRPC Core在接收连续ping之间期望的最短时间(以毫秒为单位)。如果连续两次ping之间的时间少于此时间,则该ping将被视为对等端的不良ping。这样的ping算作“ ping strike”。在客户端,这没有任何效果。 - GRPC_ARG_HTTP2_MAX_PING_STRIKES
此arg控制在发送HTTP2 GOAWAY帧并关闭传输之前,服务器允许的错误ping的最大数量。将其设置为0允许服务器接受任意数量的错误ping。(注:也就是达到这个数量的ping strike就会发送GOWAY帧–用于发起关闭连接的请求,或者警示严重错误。GOAWAY 会停止接收新流,并且关闭连接前会处理完先前建立的流)
默认值:
FAQ:
- Keepalive计时器何时启动?
transport完成连接后(握手后),将启动keepalive计时器。 - 当keepalive计时器触发时会发生什么?
- 当keepalive计时器触发时,gRPC Core将尝试在传输中发送keepalive ping。但是以下情况可以阻止此ping的发送
- 该transport上没有活动调用,并且GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS为false。
- transport中已发送的ping数目(在transport中没有其他data发送时)已超过GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA。
- 自上次ping以来经过的时间少于GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS。
- 如果keepalive的ping没有被blocked并在transport中发送,那么将启动keepalive watchdog计时器:如果在触发(timeout)前还未收到ping的确认,就会关闭transport
- 当keepalive计时器触发时,gRPC Core将尝试在传输中发送keepalive ping。但是以下情况可以阻止此ping的发送
- 为什么我收到错误代码为ENHANCE_YOUR_CALM的GOAWAY?
- 如果客户端发送的ping存在太多不符合规则的,则服务器发送ENHANCE_YOUR_CALM的GOAWAY帧。例如
- 如果服务器将GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS设置为false,但客户端却在没有任何请求的transport中发送ping。
- 如果客户端设置的GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS的值低于服务器的GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS的值。
- 如果客户端发送的ping存在太多不符合规则的,则服务器发送ENHANCE_YOUR_CALM的GOAWAY帧。例如
--------------以下是个人注释---------------
先说一下HTTP和TCP中的keepalive,这两个是完全不同的意图:
- HTTP1.0中默认是关闭的,需要在HTTP头加入"Connection: Keep-Alive",才能启用Keep-Alive;HTTP1.1中默认启用Keep-Alive,加入"Connection: close ",才关闭。在HTTP1.0/1.1中开启keepalive是为了做连接复用。复用的目的是为了提高效率,在一个连接上传输多个请求。HTTP keepalive是通过共用TCP连接实现
- TCP KeepAlive则是为了探测/保鲜(心跳检测,连接错误检测):用于探测对端的状态及网络情况(有可能客户端崩溃、强制关闭了应用、主机不可达等等),也有保鲜功能。比如如防止nat超时。TCP keepalive则是通过发送发送侦测包实现。在Linux中通过net.ipv4.tcp_keepalive_intvl,net.ipv4.tcp_keepalive_probes,net.ipv4.tcp_keepalive_time配置。
参考:
https://blog.csdn.net/weixin_37672169/article/details/80283935
http://www.nowamagic.net/academy/detail/23350305
https://pythonpig.github.io/2017/09/28/HTTP-keepalive&&TCP-KeepAlive-%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AF%B9%E6%AF%94/#0x02-http-keepalive%E4%B8%8Etcp-keepalive
https://segmentfault.com/a/1190000012894416
https://blog.chionlab.moe/2016/09/24/linux-tcp-keepalive/
grpc的keepalive是对应于TPC的keepalive