`

TCP 的 SO_KEEPALIVE TCP_NODELAY

 
阅读更多

 

                                         TCP  的 SO_KEEPALIVE   TCP_NODELAY

 

 --一段使用netty的程序代码:

private void doOpen() throws Throwable {

    bootstrap = new Bootstrap();

   

    bootstrap.option(ChannelOption.SO_KEEPALIVE, true);

    bootstrap.option(ChannelOption.TCP_NODELAY, true);

 

    bootstrap.group(group).channel(NioSocketChannel.class).handler(channelInitializer);

    }

 

 疑问: SO_KEEPALIVE 和 TCP_NODELAY  是干嘛的 ?

 

 

SO_KEEPALIVE :

Channeloption.SO_KEEPALIVE参数对应于套接字选项中的SO_KEEPALIVE,该参数用于设置TCP连接,

当设置该选项以后,连接会测试链接的状态,这个选项用于可能长时间没有数据交流的连接。

当设置该选项以后,如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文。

 

TCP_NODELAY :

ChannelOption.TCP_NODELAY参数对应于套接字选项中的TCP_NODELAY,该参数的使用与Nagle算法有关.

Nagle算法是将小的数据包组装为更大的帧然后进行发送,而不是输入一次发送一次,因此在数据包不足的时候会等待其他数据的到了,

     组装成大的数据包进行发送,虽然该方式有效提高网络的有效负载,但是却造成了延时。

而该参数的作用就是禁止使用Nagle算法,使用于小数据即时传输。

 

于TCP_NODELAY相对应的是TCP_CORK,该选项是需要等到发送的数据量最大的时候,一次性发送数据,适用于文件传输。

 

 

 

https://blog.csdn.net/qianym1211/article/details/52251872

 

1. 什么是保活与心跳,作用是什么

SO_KEEPALIVE 直译过来就是保活的意思,另一个更通俗易懂解释就是心跳,类似于人的心脏按一定频率跳动证明你还活着,

但软件心跳不是用来证明自己还活着,而是要来证明或检测对方是否还活着,那为什么要来检查对方是否活着呢?

 

 我们知道正常情况tcp连接关闭的时候,无论是客户端发起关闭还是服务发起关闭都会正常关闭连接,

 双方都会释放该连接占用的资源:应用释放资源,tcp层也会释放资源(主要是内存资源)。

 但是有些情况,该不该释放资源,就不知道了,如果服务端与客户端以长连接的方式保持连接,

 但是服务端已经长时间没有收到客户端发来的数据,造成这种原因包括以下几方面:

 

客户端确实没有需要发送的数据

客户端进程意外终止运行

客户端所在的服务器宕机,或停电

网络中间设备掐断连接,如防火墙对长时间不活动的连接,进行强制关闭

 

针对以上4种情况,只有1是正常情况,不应该关闭双方的连接,其它都是异常情况,服务端就应该关闭已经建立的连接,释放服务端的资源。

如果不释放,就会存在很多半连接状态的连接,占用服务端大量资源。

由于存在1这种正常的情况,服务端就不断随意关闭连接,需要一种手段来解决连接该不该关闭的问题。

TCP/IP协议实现中就包含了心跳机制,在服务端程序程序中我们只需要设置SO_KEEPALIVE参数,那么如连接超过指定的时间没有收到数据,

就会触发TCP层发起心调检测,从这里看可以看出TCP协议自身心跳的目的是检测异常链接,关闭链接,及释放资源。 

而应用侧心调还有其它目的。

 

 

 

https://elf8848.iteye.com/blog/1961192

 

socket心跳机制so_keepalive的三个参数详解

 

SO_KEEPALIVE 保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。

 

设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自动给对方 发一个保持存活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节.它会导致以下三种情况:

 

1、对方接收一切正常:以期望的ACK响应,2小时后,TCP将发出另一个探测分节。

 

2、对方已崩溃且已重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET,套接 口本身则被关闭。

 

3、对方无任何响应:源自berkeley的TCP发送另外8个探测分节,相隔75秒一个,试图得到一个响应。在发出第一个探测分节11分钟15秒后若仍无响应就放弃。套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host unreachable(主机不可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。

 

 

 

有关SO_KEEPALIVE的三个参数详细解释如下:

 

(16)tcp_keepalive_intvl,保活探测消息的发送频率。默认值为75s。

 

发送频率tcp_keepalive_intvl乘以发送次数tcp_keepalive_probes,就得到了从开始探测直到放弃探测确定连接断开的时间,大约为11min。

 

(17)tcp_keepalive_probes,TCP发送保活探测消息以确定连接是否已断开的次数。默认值为9(次)。

 

注意:只有设置了SO_KEEPALIVE套接口选项后才会发送保活探测消息。

 

(18)tcp_keepalive_time,在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测消息的时间,即允许的持续空闲时间。默认值为7200s(2h)。

分享到:
评论

相关推荐

    Echo-service-using-TCP-sockets-.rar_Keepalive_Linger_SO_KEEPALIV

    Echo service using TCP sockets between two systems with socket options SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY and SO_LINGER

    linux 网络编程 socket选项的实现

    Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。...

    nginx-tcp-lua-module:基于Nginx的带lua支持的TCP服务器

    so_keepalive tcp_nodelay 超时 解析器 resolver_timeout 允许 否定 访问日志 方向对齐 client_body_buffer_size lua_code_cache lua_package_path lua_package_cpath process_by_lua process_by_lua_file ...

    TCP.rar_C#TCP网口_网口_网口通信_网口通信程序

    9. **套接字选项(Socket Options)**:Socket类还有一些可配置的选项,如KeepAlive、NoDelay等,它们可以优化网络连接的行为。 通过这个"TCP.rar"压缩包,初学者可以学习到如何使用C#构建TCP客户端和服务器,理解...

    我提出来的主要有数据交换

    ### SO_KEEPALIVE/TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT 这些选项用于维护长时间未使用的连接的活动状态,防止因网络故障等原因导致连接意外中断。 **应用场景:** - **保持连接活跃:** - 通过设置`SO_...

    Java_TCP_IP_Socket编程(原书第2版)

    10. **套接字选项与网络参数**:Java的Socket类还可以设置套接字选项,如SO_LINGER(控制linger时间)、TCP_NODELAY(禁用Nagle算法)等,以优化网络通信性能。 以上只是Java TCP/IP Socket编程的一些基本概念和...

    log_tcp_源码

    1. **SOCKET选项**:在编程中,我们可以通过设置socket选项来修改TCP的行为,如TCP_NODELAY(禁用Nagle算法,减少小包延迟)、TCP_QUICKACK(快速确认,提高效率)和TCP_KEEPALIVE(保持连接活动,检测死连接)。...

    socket的属性设置测试代码

    - TCP_KEEPALIVE:启用TCP连接的空闲检测,防止死连接。 测试代码通常会涵盖多种选项,通过`getsockopt`和`setsockopt`的组合使用,来验证不同设置对Socket行为的影响,这对于理解和优化网络程序的性能至关重要。 ...

    Lwip之TCP实现.pdf

    - `TCP_KEEPALIVE`: 定义了keep-alive选项,用于维持空闲连接。 - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `TCP_KEEPINTVL`: 75 秒,两次keep-alive探测之间的间隔。 -...

    提高 Linux 上 socket 性能

    通过设置TCP窗口大小(例如,使用setsockopt与SO_SNDBUF和SO_RCVBUF选项),可以优化TCP流的吞吐量。 4. **动态优化GNU/Linux TCP/IP栈**: Linux内核提供了多种可调整的TCP/IP栈参数,以适应不同网络条件和应用...

    socket选项说明

    - **TCP层面的SO_NODELAY**:禁用Nagle算法,减少数据包的延迟,但可能增加网络流量。 #### 示例代码解析 在给定的部分内容中,示例代码展示了如何使用 `getsockopt()` 来获取Socket的发送和接收缓冲区大小: ```...

    linux下TCP程序

    - **TCP选项**:如TCP_NODELAY(禁用Nagle算法,立即发送小数据包)、TCP_KEEPALIVE(启用心跳检测,防止空闲连接被关闭)等,可以通过`setsockopt()`函数设置。 7. **连接关闭**: - **四次挥手(Four-Way ...

    高级TCP/IP编程

    高级TCP/IP编程还包括对TCP选项的使用,如TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(保持连接活跃)等。同时,需要关注性能优化,如缓冲区管理、多线程/进程并发处理、异步I/O等。此外,理解和处理网络异常情况...

    高级tcp/ip编程

    此外,理解和应用TCP选项,如TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(维持连接活性)等,也是提高网络通信效率和稳定性的重要手段。 在网络层,IP协议处理数据包的路由和分片,而ICMP(Internet Control ...

    Windows网络编程技术

    5. Socket选项和标志:Winsock API提供了丰富的socket选项,如SO_REUSEADDR、SO_KEEPALIVE、TCP_NODELAY等,可以调整套接字的行为。例如,SO_REUSEADDR允许立即重用刚关闭的套接字地址,TCP_NODELAY禁用Nagle算法以...

    nginx配置教程

    #设定mime类型,类型由mime.type文件定义 ... tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]."; #设定请求缓冲 client_header_buffer_size 128k; large_client_header_buffers 4 128k;

    tcp网络编程

    TCP还有一些可选的设置,如`TCP_NODELAY`禁用Nagle算法以减少小数据包的延迟,`TCP_KEEPALIVE`开启心跳检测,防止空闲连接被网络设备意外关闭。 8. **安全连接**: 虽然TCP提供了可靠的数据传输,但不保证数据的...

    VC++GETTCPCFG

    例如,TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(启用空闲连接检测)等。 5. **连接到服务器**:使用`connect`函数与目标服务器建立TCP连接。需要提供服务器的IP地址和端口号。 6. **发送和接收数据**:使用`...

    Niginx操作配置+KeepAlive负载均衡

    - **tcp_nodelay**:如果开启,会立即发送数据,不等待TCP缓冲区填满,但可能增加网络往返次数;关闭时,会等待一定量的数据再发送,减少网络交互次数。 3. **Nginx负载均衡**: - **upstream模块**:Nginx使用...

    高级TCP-IP编程

    7. **TCP优化**:包括TCP选项的设置,如TCP_NODELAY(禁用Nagle算法)和TCP_CORK,以优化小包传输效率;还有TCP Keepalive,用于检测长时间无数据交换的连接是否存活。 8. **UDP协议**:与TCP相比,UDP是一种无连接...

Global site tag (gtag.js) - Google Analytics