网络编程-TCP/IP如何保证长连接安全
学习此文,先看雄文: http://c.biancheng.net/socket/1(1天玩转socket通信技术(非常详细))
TCP/IP如何保证长连接安全?Socket 通信中如何处理 1 个服务器和 1 个客户端有多个长连接? 有两种方式 第一种是应用层自己发送心跳包。 第二种是TCP的keepAlive保活机制。
先来说说TCP的握手协议: 这是TCP三次握手的完整建立过程,第一个报文从发起方发起SYN,第二个报文SYN ACK是从被连结方发起,第三个报文ACK确认对方的SYN,第三个从ACK确认对方的SYN,ACK已经收到。 真正的数据是从第四个报文开始。 如果连接建立以后,如果应用层或者上层协议一直不发数据,或者隔很长时间才发送一次数据,这种情况下需要确定对方是否存活,这时候服务端会发送一个空的报文给对方,如果对方回应了这个报文,说明对方还在线,如果对方没有回复,则说明对方不在线。
TCP的keepAlive机制是侧重在保持客户端和服务端的连接,一般是服务端发起的。
KeepAlive是默认不开启的,在LInux系统上没有一个全局的选项区开启TCP的keepAlive,需要开启KeepaLive的应用必须在TCPde socket中开启,LinuxKernel有三个选项影响到KeepAlive的行为, 1.net.ipv4.tcpkeepaliveintvl = 75 2.net.ipv4.tcpkeepaliveprobes = 9 3.net.ipv4.tcpkeepalivetime = 7200
tcpkeepalivetime的单位是秒,表示TCP链接在多少秒之后没有数据报文传输启动探测报文; tcpkeepaliveintvl单位是秒,表示前一个探测报文和后一个探测报文之间的时间间隔,tcpkeepaliveprobes表示探测的次数。
TCP socket也有三个选项和内核对应,通过setsockopt系统调用针对单独的socket进行设置:
TCPKEEPCNT: 覆盖 tcpkeepaliveprobes TCPKEEPIDLE: 覆盖 tcpkeepalivetime TCPKEEPINTVL: 覆盖 tcpkeepalive_intvl
socket各个阶段: socket() bind() connect() listen accept