TCP/IP协议是计算机通信网络中目前使用最多的协议,同时也融入了生活的方方面面,不管是浏览网页使用的http/https协议、物联网设备使用的MQTT/MQTTS协议与下载文件使用的ftp协议、工业以太网中使用的Modbus TCP协议等很多应用层协议,都是基于TCP/IP协议。TCP/IP协议在传输数据的同时,也提供了以下功能:
慢启动:网络环境拥塞检测
重传机制:保证数据的完整性与连接可靠性
滑动窗口:流量控制,降低网络环境压力,避免数据丢包
Keep-alive:链路异常检测
TCP协议简介
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它提供了一种全双工的、面向连接的、可靠的字节流服务,是TCP/IP协议簇中最重要也是最复杂的协议。
TCP的主要特点包括:
面向连接:通信前需要先三次握手建立连接,通信后四次挥手释放连接。
可靠:通过序号解决报文乱序/丢失、超时重传、拥塞控制、滑动窗口、检验和等方式保证数据传输的可靠性。
字节流:没有固定的报文边界,数据在TCP中以字节流的形式传输。
全双工:通信两端在任意时刻可以互相发送数据,既可以是客户端也可以是服务端。
TCP假设它可以从较低级别的协议获得简单的、可能不可靠的数据报服务,原则上TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
TCP Keep-alive应用场景
一般的,TCP的客户端与服务器的连接类型可以分为:
短链接:客户端连接到服务器后,即开始与服务器交互,请求资源,上报数据等,交互完毕后即断开与服务器的连接,如HTTP协议等。
长连接:客户端连接到服务器后,不一定会立即进行数据的传递,而是一直保持连接状态,且双方一般不会主动断开连接,如MQTT协议等
需要注意的是,不管是长连接还是短连接都不是TCP协议本身所规定的,TCP只是给应用层提供了建立与断开连接的方法与资源管理。
可以想到,当客户端与服务器处于长连接状态下,如果服务器突然断电了,服务器也无法通知客户端异常状况,客户端就无法察觉服务器异常。只有当客户端向服务器发送数据时,由于超时机制,客户端才能知道服务器异常。并且数据也自然丢弃了。而且如果异常连接无法释放,也会导致系统资源的消耗与浪费。所以在长连接下,就可以启用TCP 的keep-alive机制,避免一方可能意外断电、死机、崩溃、重启,还是中间路由网络无故断开,从而导致的异常连接。
TCP Keep-alive机制
相关参数
SO_KEEPALIVE:是否开启保活
TCP_KEEPIDLE:Start keeplives after this period
TCP_KEEPINTVL:Interval between keepalives
TCP_KEEPCNT:Number of keepalives before death
SO_KEEPALIVE:Keep-alive可以是双向的,即客户端可以主动给服务器发,或服务器主动给客户端发送。在使能了SO_KEEPALIVE后,即启用了保活机制。
TCP_KEEPIDLE:当客户端与服务器没有交互数据达到TCP_KEEPIDLE的空闲时间后,TCP将会给对方发送探测包。
TCP_KEEPINTVL:如果上一次的探测包没有得到响应,那么将用TCP_KEEPINTVL作为下一次的探测包间隔。
TCP_KEEPCNT:当连续发送了TCP_KEEPCNT次数的探测包都未收到响应后,本地将会释放当前连接资源,并且通知应用层连接断开。
TCP Keep-alive实例
正常探测包
掉线过程
接下来测试Keep-alive断开:正常TCP建立连接后,拔掉网线,重新抓包如下图所示:
>>>亿佰特支持TCP/IP协议的产品方案
领取专属 10元无门槛券
私享最新 技术干货