一、链路的有效性检测

当网络发生单通、连接被防火墙Hang住、长时间GC或者通信线程发生非预期异常时,会导致链路不可用且不易被及时发现。

特别是异常发生在凌晨业务低谷期间,当早晨业务高峰期到来时,由于链路不可用会导致瞬间的大批量业务失败或者超时,

这将对系统的可靠性产生重大的威胁。

从技术层面看,要解决链路的可靠性问题,必须周期性的对链路进行有效性检测。目前最流行和通用的做法就是心跳检测。

心跳检测机制分为三个层面:

1) TCP层面的心跳检测,即TCP的Keep-Alive机制,它的作用域是整个TCP协议栈;

2) 协议层的心跳检测,主要存在于长连接协议中。例如SMPP协议;

3) 应用层的心跳检测,它主要由各业务产品通过约定方式定时给对方发送心跳消息实现。

心跳检测的目的就是确认当前链路可用,对方活着并且能够正常接收和发送消息。

做为高可靠的NIO框架,Netty也提供了心跳检测机制,下面我们一起熟悉下心跳的检测原理。

不同的协议,心跳检测机制也存在差异,归纳起来主要分为两类:

1) Ping-Pong型心跳:由通信一方定时发送Ping消息,对方接收到Ping消息之后,立即返回Pong应答消息给对方,属于请求-响应型心跳;

2) Ping-Ping型心跳:不区分心跳请求和应答,由通信双方按照约定定时向对方发送心跳Ping消息,它属于双向心跳。

心跳检测策略如下:

1) 连续N次心跳检测都没有收到对方的Pong应答消息或者Ping请求消息,则认为链路已经发生逻辑失效,这被称作心跳超时;

2) 读取和发送心跳消息的时候如果发生了IO异常,说明链路已经失效,这被称为心跳失败。

无论发生心跳超时还是心跳失败,都需要关闭链路,由客户端发起重连操作,保证链路能够恢复正常。

二、基于TCP的通信为什么需要RETRY

TCP协议本身是可靠的,它的重传机制保证了消息的可送达性(如果没有收到对端的ACK确认,它会在等待一定时间后,尝试再次发送,且这是一个循环过程,上限是9分钟。超过9分钟,则认为连接已经断开,关闭socket)。
虽然有了TCP的可靠性保证,但是很多基于TCP的应用间通信依然会采用RETRY机制:发送消息后,如果在一定时间内没有收到对端的确认消息,则重发消息。明明TCP已经可以保证消息的可送达,为什么还要在应用层加这么一层实现呢?

1. 有些服务进程,基于性能或是内存容量方面的考虑,使用了限长的消息队列:如果收到的瞬时消息过多,超过了消息队列的可处理个数,所有超出的消息会被它丢弃。注意,在这种情况下,TCP确实是将消息成功送达了,只是应用层不接受而已。客户进程等待一小段时间,尝试再次发送,有可能此时服务端的处理压力已经降下来了,消息就能被处理了。

2. 进入了弱网环境的移动应用,发送超时往往意味着已经断连。

三、TCP 重试参数

对于每个连接,TCP管理4个定时器来完成数据的传输:

1. 重传定时器
2. 坚持定时器(persist):使窗口大小保持不断流动
3. 保活定时器(keepalive):检测空闲连接的另一端何时崩溃
4. 2MSL定时器:测量一个连接处于TIME_WAIT状态的时间

sysctl -a | grep tcp_syn_retries   对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃

  net.ipv4.tcp_syn_retries = 6

sysctl -a | grep tcp_synack_retries  对于远端的连接请求SYN,内核会发送SYN+ACK数据包,以确认收到上一个SYN连接请求包

  net.ipv4.tcp_synack_retries = 5

sysctl -a | grep tcp_retries1       放弃回应一个TCP连接请求前﹐需要进行多少次重试

  net.ipv4.tcp_retries1 = 3

 sysctl -a | grep tcp_retries2      在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试

  net.ipv4.tcp_retries2 = 15

参考:

TCP 参数优化

链路的有效性检测 及 基于TCP的通信为什么需要RETRY的更多相关文章

  1. Linux 系统编程 学习:008-基于socket的网络编程3:基于 TCP 的通信

    背景 上一讲我们介绍了 基于UDP 的通信 这一讲我们来看 TCP 通信. 知识 TCP(Transmission Control Protoco 传输控制协议). TCP是一种面向广域网的通信协议, ...

  2. Learning-Python【28】:基于TCP协议通信的套接字

    什么是 Socket Socket 是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口.在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Sock ...

  3. Android 基于TCP多线程通信实现群聊天的功能

    1.TCP多线程原理图 2.实现方法 (1)服务器端 (2)客户端 3.java后台代码 主界面 package com.lucky.test50socket2; import android.ann ...

  4. 基于TCP的通信程序设计

    套接字(Socket)是一种跨主机进程之间的双向通信接口,每个打开的套接字都可以通过一个套接字描述符来描述,因此可以使用低级文件编程库操作套接字. TCP是一中面向连接的网络传输控制协议.它每发送一个 ...

  5. 基于TCP的通信 客户端

    #include <WINSOCK2.H> #include <stdio.h> // socket 套接字 #pragma comment (lib,"Ws2_32 ...

  6. python中基于tcp协议的通信(数据传输)

    tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...

  7. Java:基于TCP协议网络socket编程(实现C/S通信)

    目录 一.前言:TCP原理简介 二.Socket编程通信 三.TCP服务器端(具体代码) 四.TCP客户端(具体代码) 五.通信效果演示 六."创意"机器人:价值一个亿的AI核心代 ...

  8. TCP连接有效性检测方法

    在写TCP服务的时候经常需要面对的问题就是如何知道一个TCP连接当前是否有效,但这个问题对很多初入门的同学来说是很困惑的,主要原因是当对方关闭连接后,另一方无法有效的知道:对于同步操作来说可以通过设置 ...

  9. 《基于TCP交换的电路交换与分组交换融合方法》读书笔记

    简介 在论文<Is IP going to take over the world (of communications)?>中作者对IP相关的一些说法(假设)提出了质疑,并得出结论:虽然 ...

随机推荐

  1. python学习之split()

    定义: Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 语法: str.split(str="", num=st ...

  2. curl编译

    首先下载并解压: wget http://curl.haxx.se/download/curl-7.37.1.tar.gz tar -xzvf curl-7.37.1.tar.gz 编译安装: cd ...

  3. Ream的入门使用

    一.介绍 Realm是一个不错的手机平台上的数据库,支持多种编程环境,如:Java.Object-C.React Native.Swift.Xamari等. Realm的官网:https://real ...

  4. linux命令之高级使用 service

    service命令,顾名思义,就是用于管理Linux操作系统中服务的命令. 1. 声明:这个命令不是在所有的linux发行版本中都有.主要是在redhat.fedora.mandriva和centos ...

  5. impala+hdfs+csv格式文件

    [创建目录]hdfs dfs -mkdir -p /user/hdfs/sample_data/csv/devicehdfs dfs -mkdir -p /user/hdfs/sample_data/ ...

  6. 小程序WXML 使用小结

    数据绑定 <view> {{message}} </view> // page.js Page({ data: { message: 'Hello MINA!' } }) 组件 ...

  7. [Django] 问题记录追踪表

    关注的网站: https://simpleisbetterthancomplex.com/ Linux部署 1. Ubuntu下vsftpd安装部署 2. Utuntu下Django+Apache+W ...

  8. VisualSVN 5.1.5 破解版 手动破解教程 生成dll文件

    VisualSVN 5.1.5 破解版 手动破解教程 生成VisualSVN.Core.L.dll文件 附上本人用到的命令: ildasm "D:\Program Files (x86)\V ...

  9. VC++显示文件或文件夹属性

    When you select a file or folder in Explorer window, and choose 'Properties' from the menu, you get ...

  10. py-faster-rcnn 训练自己的数据

    转载:http://blog.csdn.net/sinat_30071459/article/details/51332084  Faster-RCNN+ZF用自己的数据集训练模型(Python版本) ...