C++ 面经:项目常见问题 ----- nagle算法,keepalive,Linger 选项
nagle算法应用场景:
1.对于实时性要求很高的交互上,我们不能使用nagle算法,比如FPS射击类PVP对抗类游戏,或者MMO类的对实时要求很高的游戏开发来说是显而易见需要禁掉的,因为假如玩家的一次移动,或者状态同步到服务器,加上协议头,包体不会太大,如果使用Nagle算法,后果将是,客户端本来完成一次射击动作,或者释放技能的动作却因为此算法,因为发送包体较小,被放置到缓冲区,等其他包到达可发送了才一起发送到服务器端,那么你不坑队友,还能有谁你?
2.对于发送接收的业务,但是每次发送的包体又是很小的,对于业务的实时性不是非常强的,我们可以使用nagle算法,将小包组成大包统一发送,减少交互次数。
维基百科:内格尔算法 - 维基百科 (wikipedia.org)
理解nagle算法 ----👉(十二)深入浅出TCPIP之Nagle算法 - 腾讯云开发者社区-腾讯云 (tencent.com)
keepalived 简介:
建立 TCP 连接后,该连接将定义为有效,直到一端关闭它。一旦连接进入连接状态,它将无限期地保持连接状态。但实际上,这种联系不会无限期地持续下去。如果某个时间段内没有任何活动,大多数防火墙或 NAT 系统将关闭连接。“保持活动状态”信号可用于诱骗中间主机由于不活动而不关闭连接。也可能是一个主机不再侦听(例如应用程序或系统崩溃)。在这种情况下,连接已关闭,但从未发送过“FIN”。在这种情况下,可以使用 KeepAlive 数据包来询问连接以检查它是否仍然完好无损。
保持连接信号通常以预定义的间隔发送,并在互联网上发挥重要作用。发送信号后,如果未收到回复,则假定链路已关闭,并且将来的数据将通过另一条路径路由,直到链路再次启动。保持连接信号也可用于向互联网基础设施指示应保留连接。如果没有保持连接信号,启用 NAT 的中间路由器可能会在超时后断开连接。
由于唯一目的是查找不起作用的链接或指示应保留的连接,因此保持连接消息往往很短,不会占用太多带宽。但是,它们的确切格式和使用条款取决于通信协议。
维基百科:保持活力 - 维基百科 (wikipedia.org)
理解该机制:聊聊 TCP 中的 KeepAlive 机制 - 知乎 (zhihu.com)
Linger
摘自评论:所以可以看到linger的使用场景为 :接收方发出最后的响应后,不再关心发送方发出的数据,为了确保接收方的响应能正确到达发送方,设置linger延迟关闭时间,在这个时间内,期望响应能回给发送方,然后终止连接。一个具体场景为 nginx和客户端的通信,nginx直接返回错误响应给客户端
LINGER结构 :LINGER (winsock.h) - Win32 apps |微软学习 (microsoft.com)
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16884858.html