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源码网站。目前,各大高校都纷纷建立了自己的镜像站,一些有实力的大厂也开始为开源事…

php ci上传图片,CodeIgniter上传图片成功的全部过程分享

/*注意,这里是userfile,$this->upload->do_upload(),这里do_upload默认上传文件的表单名为userfile;当然也可以使用do_upload($filename),这里的$filename一定要和form_upload()里面的字符串一致.我在这里范了糊涂,最后看了手册才明白,希望大家注意哦!*/controller代码: …

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

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

python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》

在过去的这十年,深度学习已经席卷了整个科技界和工业界,2016年谷歌阿尔法狗打败围棋世界冠军李世石,更是使其成为备受瞩目的技术焦点。今日,小编就为大家推荐一本能让初学者和“老司机”同样感到非常有用的机器学习图书——《深入…

java kcp,重新认识KCP - osc_rreaoxa0的个人空间 - OSCHINA - 中文开源技术交流社区

什么是KCPKCP是一种网络传输协议(A Fast and Reliable ARQ Protocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟。因为TCP协议的大…

python科学计算第三版-python科学计算pdf下载

python科学计算第二版是一本Python语言基础教程,由张若愚编著,小编从网上收集而来,为各位免费提供下载和阅读;本书将使用Python各种扩展库完成数值计算、界面制作、三维可视化、图像处理、提高运算速度等任务。 ​python科学计算第…

pakeage php国内镜像,Packagist/Composer中国全量镜像 | 严佳冬

有两种方式启用本镜像服务:1.将配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置)。2.将配置信息添加到单个项目的 composer.json 文件中(单个项目配置)。1:修改 composer 的全局配置文件(推荐方式)打开命令行窗口(windows用户)或控制台…

分割函数python_python strip() 函数和 split() 函数的详解及实例

一直以来都分不清楚strip和split的功能,实际上strip是删除的意思;而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。下面就详细说一下这…

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

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

matlab库存点仿真教程,基于MATLABSimulink库存系统建模与仿真.doc

基于MATLABSimulink库存系统建模与仿真基于MATLABSimulink库存系统建模与仿真摘要:库存系统是管理系统中最普遍的一种,在库存系统中要通过不同的需求情况,确定何时订货和定多少货为宜。本文通过对经济批量订货库存系统的分析,建立…

python 执行文件内容_python执行文件

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

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

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

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

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

matlab输出高分辨率图片有白色毛刺,科学网—图片空白边缘处理/统计直方图---matlab/保存生成高质量的清晰图 - 杨小林的博文...

这里介绍hist函数结合bar函数绘制统计直方图一组原始采集数据,如:data[2 3 -4 -1 4 -5 1 5 -2 -3]; 数据范围为range-5:5;首先可以采用hist函数进行分组:nhist(data,range); 将数据data根据range进行分组;返回数组n,n的…

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

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

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

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

python 异步下载图片_python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解...

制作解析网址的get1 defgethtml(url,postdata):23 header {User-Agent:4 Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0,5 Referer:6 http://image.baidu.com,7 Host: image.baidu.com,8 Accept: text/plain, */*; q0.01,9 Accept-Encoding:gzi…

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

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