问题大部分人都知道tcp的keepalive. 假设读者知道keepalive会如何触发. 这篇文章想讨论keepalive触发后, 对socket使用者的影响.keepalive设置修改/etc/sysctl.confubuntu# vim /etc/sysctl.conf ubuntu# sysctl -pfs.file-max = 131072net.ipv4.tcp_keepalive_time = 10net.ipv4.tcp_keepalive_intvl = 5net.ipv4.tcp_keepalive_probes = 3验证ubuntu# sysctl -a | grep keepalivenet.ipv4.tcp_keepalive_intvl = 5net.ipv4.tcp_keepalive_probes = 3net.ipv4.tcp_keepalive_time = 10tcp_server.pyimport socketimport syssock = 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.pyimport socketimport sysimport timesock = 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)可以看到, 因为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 commit -a “enjolras” -m “ubuntu python” 92edf5cfb2e0 ubuntu_with_python对send/recv的影响对select的影响对epoll的影响