TCP keepalive

这篇具有很好参考价值的文章主要介绍了TCP keepalive。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

TCP keepalive - 小不的笔记

TCP是面向连接的。创建一个TCP连接,客户端和服务端需要经历三次握手,一旦建立它的期限就是永久,除非其中一方发起关闭。

理想状态下,客户端与服务端建立连接就可以一直用下去,但是在真实的互联网世界没有这么理想: NAT网关、防火墙、代理服务器等网络设备可能会清理空闲的连接; 也有可能其中一方突然崩溃、网络断开来不急通知对方关闭连接;或者其他意外,导致其中一方或双方的连接就一直永久保留在那里。

客户端,随着应用的关闭,系统会自动回收应用创建的连接。这个不处理似乎影响也不太大。

服务端,软件都是长期运行的,没办法通过软件的关闭来实现连接的回收。在Linux里一个空闲的TCP连接占用将近4k内存,大量的空闲连接积攒下来消耗不少内存。而且服务端一直不释放可能会导致TCP创建连接失败。所以在应用层基本都会有一个超过一定时间不使用主动关闭TCP连接的机制。

TCP keepalive 可以做什么

这个时候我们就会发现TCP keepalive似乎是可有可无的,确实在TPC连接中keepalive是默认不开启的。不过我们可以通过 TCP keepalive做这些事情:

1. 检测断掉的连接

keepalive在一定的间隔里通过连接发送一个信号,如果在指定的时间内收到回应就可以确认连接还是通的;如果指定的时候还没收到回应就启动重试;如果重试了最大重试次数内还是没收到回应,那么就判定连接不通了,就主动关闭连接。

2. 防止因为没有网络活动而导致连接的断开

NAT网关、代理服务器、防火墙等等会清理他认为不活动的连接,keepalive的周期性发送信号可以保持连接处于持续活动状态。Linux NAT网关的连接保持时间默认是1天,阿里云NAT网关连接的老化时间是900秒也就是15分钟,这也产生过一个生产事故。

如何在Linux下使用 TCP keepalive

Linux 原生支持TCP keepalive,并提供了三个用户参数:

  • tcp_keepalive_time 默认值7200s(2小时),就是连接空闲多久,开始发keepalive 探测包。
  • tcp_keepalive_intvl 默认值75s,后续 keepalive探测包的时间间隔。

  • tcp_keepalive_probes 默认值9,发多少keepalive探测包没有回应,就认为连接已经死了需要通知应用层。

简易流程是这样的:

  1. 客户端创建启用keepalive的TCP连接
  2. 如果连接在tcp_keepalive_time时间内一直静默,那么发一个空的ACK包,也就是keepalive探测包。
  3. 服务端是否回应这个ACK?
    • 没有回应
      1. 等待tcp_keepalive_intvl秒,然后发另一个ACK包
      2. 重复上一步,直到发了tcp_keepalive_probes次ACK包。
      3. 到了这个点还是没收到回应,那么发送一个RST包,然后关闭连接。
    • 收到回应,那么回到第二步

如何修改参数

procfs是一个伪文件系统,通过它可以查看或修改内核参数。

查看

1

2

3

4

5

6

7

# cat /proc/sys/net/ipv4/tcp_keepalive_time

7200

# cat /proc/sys/net/ipv4/tcp_keepalive_intvl

75

# cat /proc/sys/net/ipv4/tcp_keepalive_probes

9

修改

1

2

3

4

# echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time

# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl

# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

简单明了,但是不太适合大量的参数的管理,所有Linux还提供了一个辅助的工具sysctl
把procfs路径里的/proc/sys/删掉剩下的 / 替换成 . 就可以了。
sysctl variable查看变量的值。
sysctl -a打印所有变量的值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# sysctl net.ipv4.tcp_keepalive_time

net.ipv4.tcp_keepalive_time = 7200

# 也可能一次查多个变量名

# sysctl net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes

net.ipv4.tcp_keepalive_intvl = 75

net.ipv4.tcp_keepalive_probes = 9

# 也可以打印出所有的变量,然后通过grep等工具过滤

# sysctl -a | grep net.ipv4.tcp_keepalive

net.ipv4.tcp_keepalive_intvl = 75

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_time = 7200

需要修改的时候就用sysctl -w variable=value的方式

1

2

3

4

5

6

7

# sysctl -w net.ipv4.tcp_keepalive_time=600 \

    net.ipv4.tcp_keepalive_intvl=60 \

    net.ipv4.tcp_keepalive_probes=20

net.ipv4.tcp_keepalive_time = 600

net.ipv4.tcp_keepalive_intvl = 60

net.ipv4.tcp_keepalive_probes = 20

要注意的是这些修改系统重启之后都会失效的,如果希望重启之后依然生效。就需要把配置写入/etc/sysctl.conf或者在/etc/sysctl.d/目录内创建一个.conf文件并写入配置。这样Linux系统再启动时就会加载并应用这个配置。

应用内

keepalive默认是不开启的,需要主动指定.

Java

1

2

3

4

5

6

7

8

// BIO

Socket client = new Socket(hostName, port);

client.setKeepAlive(true);

// NIO

socketChannel.setOption(StandardSocketOptions.SO_KEEPALIVE, true);

Does a TCP socket connection have a "keep alive"?
https://newbedev.com/does-a-tcp-socket-connection-have-a-keep-alive

TCP Keepalive HOWTO
https://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/文章来源地址https://www.toymoban.com/news/detail-650971.html

到了这里,关于TCP keepalive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux网络编程之TCP/IP实现高并发网络服务器设计指南

    目录 引言: 多进程服务器 例程分享: 多线程服务器  例程分享: I/O多路复用服务器 select 例程分享: poll 例程分享: epoll 例程分享: 总结建议         随着互联网的迅猛发展,服务器面临着越来越多的并发请求。如何设计一个能够高效处理大量并发请求的服务器成为

    2024年02月20日
    浏览(44)
  • 《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

    目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 运行结果:

    2024年02月10日
    浏览(44)
  • 判断服务器IP否被墙 是否被TCP阻断

    现在国内很多购买国外主机服务器的,但往往很多主机商的机子用的人多了,国内使用者用这些服务器做啥的都有,正儿八经的做外贸其实没多大事情,但往往有些人就是不遵守法律法规,长此以往用的人多了,这些国外的主机商提供的服务器ip就会遭到国内的封杀。 今天教

    2024年02月12日
    浏览(44)
  • 【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

             经过前面的铺垫,我们已经具备实现并发服务器的基础了,接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧!         在编写代码前,先让我们大致将多任务(回声)服务器的模型抽象一下,如下图所示:         当客户端请求服务(

    2024年02月08日
    浏览(136)
  • 网络字节序——TCP接口及其实现简单TCP服务器

    简单TCP服务器的实现 TCP区别于UDP在于要设置套接字为监控状态,即TCP是面向链接,因此TCP套接字需要设置为监听状态 socket函数原型 domain 表示协议族,常用的有 AF_INET (IPv4)和 AF_INET6 (IPv6)。 type 表示Socket类型,常用的有 SOCK_STREAM (TCP)和 SOCK_DGRAM (UDP)。 protocol 通常可

    2024年02月10日
    浏览(34)
  • TCP/IP客户端和服务器端建立通信过程

    使用Qt提供的类进行基于 TCP 的套接字通信需要用到两个类: QTcpServer 类用于监听客户端连接以及和客户端建立连接,在使用之前先介绍一下这个类提供的一些常用API函数: 构造函数 给监听的套接字设置监听 listen() 函数 在代码中 通过启动监听按钮 设置监听 参数: address :

    2024年02月07日
    浏览(49)
  • C#网络TCP服务器端的实现

    1、实现代码 2、运行效果

    2024年02月11日
    浏览(37)
  • 【网络编程】demo版TCP网络服务器实现

    UDP和TCP的区别: 对于TCP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 有连接(正式通信前要先建立连接) 3️⃣ 可靠传输(在内部帮我们做可靠传输工作) 4️⃣ 面向字节流 对于UDP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 无连接 3️⃣ 不可靠传输 4️⃣ 面向数据报 可以看到

    2024年02月06日
    浏览(42)
  • 【网络编程】TCP流套接字编程(TCP实现回显服务器)

    Socket(既能给客户端使用,也能给服务器使用) 构造方法 基本方法: ServerSocket(只能给服务器使用) 构造方法: 基本方法: 客户端代码示例: 服务器代码示例: 运行结果: 代码执行流程: 服务器启动,阻塞在accept,等待客户端建立连接. 客户端启动.这里的new操作会触发和服务器之间建立连

    2024年04月25日
    浏览(54)
  • 【TCP/IP】利用I/O复用技术实现并发服务器 - select函数

    目录 I/O复用技术 select函数 设置文件描述符 指定监视范围 设置超时 I/O复用服务器端的实现        由服务器创建多个进程来实现并发的做法有时会带来一些问题,比如:内存上的开销、CPU的大量占用等,这些因素会消耗掉服务器端有限的计算资源、进而影响程序之间的执

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包