php socket keepalive,linux keepalive探测对应用层socket api的影响

问题

大部分人都知道tcp的keepalive. 假设读者知道keepalive会如何触发. 这篇文章想讨论keepalive触发后, 对socket使用者的影响.

keepalive设置

修改/etc/sysctl.conf

ubuntu# vim /etc/sysctl.conf

ubuntu# sysctl -p

fs.file-max = 131072

net.ipv4.tcp_keepalive_time = 10

net.ipv4.tcp_keepalive_intvl = 5

net.ipv4.tcp_keepalive_probes = 3

验证

ubuntu# sysctl -a | grep keepalive

net.ipv4.tcp_keepalive_intvl = 5

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_time = 10

tcp_server.py

import socket

import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_address = ('localhost', 22345)

sock.bind(server_address)

sock.listen(1)

connection, client_address = sock.accept()

while True:

data = connection.recv(1024)

print("data", data)

tcp_client.py

import socket

import sys

import time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

server_address = ('localhost', 22345)

sock.connect(server_address)

time.sleep(999999999)

bVbrwPB?w=1749&h=551

可以看到, 因为tcp_client开启了SO_KEEPALIVE, 所以tcp_client主动往tcp_server发起KEEPALIVE探测.

若tcp_server开启SO_KEEPALIVE, 则是tcp_server往tcp_client发送KEEPALIVE探测.

如果tcp_server/tcp_client都开启KEEPALIVE, 则会双向探测.

对应用层socket api的影响

准备工作

为了模拟keepalive生效的情况, 用docker模拟断网线的情况.

准备好安装有docker, python, vim, tcpdump的ubuntu镜像, 创建好docker 网络.

跑起来, 修改heartbeat设置.

ubuntu# sudo docker run -it \

--volume=//home/enjolras/code_repo/python/keepalive_test://home/enjolras/code_repo/python/keepalive_test \

--detach=true \

--name=tcp_server \

--privileged=true \

--network=multi-host-network \

ubuntu_with_python

08f89dcff3547bb15c7aed975dfa5a0821e4d0246d6d812e02fd1470f3cef6c3

ubuntu# sudo docker run -it \

--volume=//home/enjolras/code_repo/python/keepalive_test://home/enjolras/code_repo/python/keepalive_test \

--detach=true \

--name=tcp_client \

--privileged=true \

--network=multi-host-network \

ubuntu_with_python

对阻塞式send/recv的影响

tcp_server

import socket

import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_address = ('0.0.0.0', 22345)

sock.bind(server_address)

sock.listen(1)

connection, client_address = sock.accept()

connection.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

data = connection.recv(1024)

print("data", data)

tcp_client

import socket

import sys

import time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

server_address = ('tcp_server', 22345)

sock.connect(server_address)

time.sleep(999999999)

send/recv会以异常/错误码方式得知 heartbeat 检测到的链接断开.

可以看到, tcp_server/tcp_client互发心跳.

root@0b3f1ee81446:/# tcpdump -i any port 22345

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

12:29:34.491239 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [S], seq 2347845399, win 28200, options [mss 1410,sackOK,TS val 951128354 ecr 0,nop,wscale 7], length 0

12:29:34.491279 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [S.], seq 1169988006, ack 2347845400, win 27960, options [mss 1410,sackOK,TS val 2298965862 ecr 951128354,nop,wscale 7], length 0

12:29:34.491299 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951128354 ecr 2298965862], length 0

12:29:44.666952 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2298976038 ecr 951128354], length 0

12:29:44.666969 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951138530 ecr 2298965862], length 0

12:29:44.666978 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2298976038 ecr 951128354], length 0

12:29:44.666987 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951138530 ecr 2298976038], length 0

12:29:54.907019 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2298986278 ecr 951138530], length 0

12:29:54.907054 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951148770 ecr 2298976038], length 0

12:29:54.907059 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951148770 ecr 2298976038], length 0

12:29:54.907062 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2298986278 ecr 951138530], length 0

将tcp_server/tcp_client断网.

ubuntu# docker network disconnect multi-host-network tcp_client

可以看到tcp_server在连续3个探测包没有回复后, 往tcp_client发了一个RST.

12:31:47.547010 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951261408 ecr 2299088676], length 0

12:31:47.547019 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2299098916 ecr 951251168], length 0

12:31:47.547061 IP tcp_client.multi-host-network.57130 > 0b3f1ee81446.22345: Flags [.], ack 1, win 221, options [nop,nop,TS val 951261408 ecr 2299098916], length 0

12:31:57.787226 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2299109156 ecr 951261408], length 0

12:32:02.906612 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2299114276 ecr 951261408], length 0

12:32:08.026829 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [.], ack 1, win 219, options [nop,nop,TS val 2299119396 ecr 951261408], length 0

12:32:13.146776 IP 0b3f1ee81446.22345 > tcp_client.multi-host-network.57130: Flags [R.], seq 1, ack 1, win 219, options [nop,nop,TS val 2299124516 ecr 951261408], length 0

可以看到, 在心跳机制检测到socket状态异常后, 会通过异常/错误码等方式通知调用者.

3f1ee81446:/home/enjolras/code_repo/python/keepalive_test# python tcp_serv

Traceback (most recent call last):

File "tcp_server.py", line 11, in

data = connection.recv(1024)

socket.error: [Errno 110] Connection timed out

对select的影响

tcp_server

import socket

import sys

import select

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server_address = ('0.0.0.0', 22345)

sock.bind(server_address)

sock.listen(1)

connection, client_address = sock.accept()

connection.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

readable, writable, exeptional = select.select([connection], [], [])

print("readable", readable, writable, exeptional)

data = connection.recv(1024)

print("data", data)

对套接字select返回可读事件.

3f1ee81446:/home/enjolras/code_repo/python/keepalive_test# python tcp_serv

('readable', [], [], [])

Traceback (most recent call last):

File "tcp_server.py", line 14, in

data = connection.recv(1024)

socket.error: [Errno 110] Connection timed out

对epoll的影响

不做实验, 应该和select一致.

结论

heartbeat检测到tcp链接断开后, 会以可读事件方式通知应用层. 若无tcp heartbeat, 也无应用层heartbeat, 应用层无法得知链接的真实状态.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt 文字倾斜投影_帅呆!钢铁侠中的激光投影键盘终于量产了,炫酷又好用

看过电影《钢铁侠》的朋友,估计都会被钢铁侠的各种黑科技所折服,比如钢铁装甲、全息投影、人工智能贾维斯等等。不过这些黑科技想要实现还需要一段时间。但其中有一项黑科技已经被国产厂商实现了,那就是——激光投影键盘。早在去年&#xff0…

手机投电脑_把王者荣耀投屏到电脑上玩更爽哦——投屏神器幕享

今天给大家介绍一款投屏神器,它叫做幕享。直接摆观点——现今最好用的投屏工具,没有之一!它是全平台都有的软件哦,这意味着除了电脑,你还可以在安卓市场和Appstore下载到它。三个平台都有意味着什么呢,心细…

清华大学镜像_国内开源镜像站信息盘点

一、前言开源镜像站点是一个放置开源系统镜像文件的站点,免费提供镜像文件下载服务,可以刻盘也可以直接用虚拟光驱安装操作系统、开源软件、Linux源码网站。目前,各大高校都纷纷建立了自己的镜像站,一些有实力的大厂也开始为开源事…

labview圆环里实物动画图形_有趣的图形教案

有趣的图形教案作为一名优秀的教育工作者,通常会被要求编写教案,教案是保证教学取得成功、提高教学质量的基本条件。怎样写教案才更能起到其作用呢?以下是小编为大家整理的有趣的图形教案,希望对大家有所帮助。有趣的图形教案1活动…

安卓 图像清晰度识别_螺柱焊位置识别算法初稿

为了保证螺柱焊接时,螺柱焊接位置和螺柱所在凸台偏差太远带来的抱怨,打算采用图像识别的方法识别螺柱在所焊接凸台位置是否居中;在凸台上的的螺柱焊通过计算凸台圆弧的圆心和螺柱的圆心偏差来判断螺柱是否在凸台的中心,分以下几个…

电脑音频服务未运行怎么解决_电脑故障维修技巧教程:新手必看的修电脑技巧!...

日常生活工作中,我们的电脑总会出现各种各样的问题,如果掌握了一定的通用修电脑技巧,除了可以解决问题,说不定还能得到帮女神修电脑的机会,俗话说的好,电脑修的好,对象少不了!电脑故…

vue 保留小数点厚一位_2019黑龙江公务员考试行测资料分析:保留有效数字巧解对位数相乘...

在行测考试中,资料分析是很重要的一部分,同学们也都知道这一部分是绝对不能放弃的。资料分析在做题的时候无非就是找数据、列式,最后再计算,那么这个时候问题就来了:数据找得到,列式也能列得对,…

cad计算总长度插件_超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍...

超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍!今天被单位新来的实习生给上了一课,才知道原来CAD还有这么多好用便捷的插件。我厚着脸皮要来一份试了一下才体验到快速制图的快乐,这些全是平时制图能用得上的…

在linux操作系统Centos上安装服务器相关软件

如果您的服务器没有图形界面(GUI),您可以通过命令行(终端)来安装和配置Tomcat、JDK和MySQL等软件。以下是在没有图形界面GHome的 Linux 系统上安装这些软件的基本步骤: 对于CentOS Stream 9,您可以按照以下步骤在命令行上安装Tomcat、JDK 和 MySQL 数据库: 1. 安装JD…

rpc 服务器不可用_RPC和微服务

RPC全称Remote Procedure Call,即远程过程调用。其本质上其实就是主机A通过某种网络协议向支持相同协议的主机B发送一个任务执行命令,并且在某些情况下,还能支持任务执行结果的返回。几乎每一个RPC都有着自己的网络协议定义,如果要…

系统分析与控制_质量体系文件:测量系统分析控制程序

本公众号知识分享:体系管理、质量管理、书籍教程;国标行标、团标企标;课件教材、系统培训、资料下载、以及部分软件及教程等; 告诉我您的需求,小编随时恭候为您服务!下面让我们一起开启本章内容学习&#x…

python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程

人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊。于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我…

matlab 中曲线颜色,matlab曲线颜色样式设置

满意答案南渡江ndj2013.09.03采纳率:43% 等级:12已帮助:19801人你好 这是我总结的画图资料比如画一条蓝色的x号线plot(x,y,bg)画图:线形:-实线 -. 点划线 --长虚线 :短虚线符号 颜色 符号 线形b 蓝 . 点c 青 。 圈g 绿 标记k 黑 - 实线m …

小程序动态class_会后剧透!百度智能小程序的最新动态都在这儿了!

月活突破5亿,入驻智能小程序数量42万。这是百度智能小程序在万象-百度2020移动生态大会上交出的最新成绩单。当天,百度方面还以“生态进化,共创共荣”为主题,召开了智能小程序分论坛。分论坛上,百度特别邀请了百度副总…

matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并

区域分割一般认为有漫水填充,区域分裂与合并,分水岭,这篇是中间的区域分裂和合并。区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4个相等的子区域,当相邻的…

去调频体制下的 rd算法_【技术文章】一次调频工作原理及控制 学习1+1

1、基本概念一次调频:PrimaryFrequencyControl。在电网实际运行中,当电量消耗与电量供给不匹配时,即可引起电网频率出现变化较小、变动周期较短的微小分量,这种频率扰动主要靠汽轮发电机组本身的调节系统直接自动调整汽轮机调门完…

蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...

这是马克君的第 90 篇对比测评-建议佩戴耳机体验-?- 10款TWS耳机测评 -TWSTrue Wireless Stereo⇩真无线立体声自AirPods问世以来,真无线耳机的概念开始爆火?。虽然AirPods“真香”,但售价也是真滴贵,所以有没有便宜又好用的真无线蓝牙耳机…

数据库查询语句慢如何优化_常见Mysql的慢查询优化方式

1 概念 MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。 具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢查询日志中。 long_query_time的默…

c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云,作者:算法与编程之美前言对学算法的同学来说,动态规划是其必学且较为重要的问题之一;…

element ui 多个子组件_vue前端UI框架,一点都不圆润,盘它!

面对众多vue前端UI框架,看着它们干干巴巴、麻麻赖赖的样子,一点都不圆润,跟我一起盘它!Vue移动端UI框架1、Vux(star:15620)VUX(读音 [v’ju:z],同 views)是基于WeUI和Vue(2.x)开发的…