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 between two systems with socket options SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY and SO_LINGER
Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。...
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 ...
9. **套接字选项(Socket Options)**:Socket类还有一些可配置的选项,如KeepAlive、NoDelay等,它们可以优化网络连接的行为。 通过这个"TCP.rar"压缩包,初学者可以学习到如何使用C#构建TCP客户端和服务器,理解...
### SO_KEEPALIVE/TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT 这些选项用于维护长时间未使用的连接的活动状态,防止因网络故障等原因导致连接意外中断。 **应用场景:** - **保持连接活跃:** - 通过设置`SO_...
10. **套接字选项与网络参数**:Java的Socket类还可以设置套接字选项,如SO_LINGER(控制linger时间)、TCP_NODELAY(禁用Nagle算法)等,以优化网络通信性能。 以上只是Java TCP/IP Socket编程的一些基本概念和...
1. **SOCKET选项**:在编程中,我们可以通过设置socket选项来修改TCP的行为,如TCP_NODELAY(禁用Nagle算法,减少小包延迟)、TCP_QUICKACK(快速确认,提高效率)和TCP_KEEPALIVE(保持连接活动,检测死连接)。...
- TCP_KEEPALIVE:启用TCP连接的空闲检测,防止死连接。 测试代码通常会涵盖多种选项,通过`getsockopt`和`setsockopt`的组合使用,来验证不同设置对Socket行为的影响,这对于理解和优化网络程序的性能至关重要。 ...
- `TCP_KEEPALIVE`: 定义了keep-alive选项,用于维持空闲连接。 - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `TCP_KEEPINTVL`: 75 秒,两次keep-alive探测之间的间隔。 -...
通过设置TCP窗口大小(例如,使用setsockopt与SO_SNDBUF和SO_RCVBUF选项),可以优化TCP流的吞吐量。 4. **动态优化GNU/Linux TCP/IP栈**: Linux内核提供了多种可调整的TCP/IP栈参数,以适应不同网络条件和应用...
- **TCP层面的SO_NODELAY**:禁用Nagle算法,减少数据包的延迟,但可能增加网络流量。 #### 示例代码解析 在给定的部分内容中,示例代码展示了如何使用 `getsockopt()` 来获取Socket的发送和接收缓冲区大小: ```...
- **TCP选项**:如TCP_NODELAY(禁用Nagle算法,立即发送小数据包)、TCP_KEEPALIVE(启用心跳检测,防止空闲连接被关闭)等,可以通过`setsockopt()`函数设置。 7. **连接关闭**: - **四次挥手(Four-Way ...
高级TCP/IP编程还包括对TCP选项的使用,如TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(保持连接活跃)等。同时,需要关注性能优化,如缓冲区管理、多线程/进程并发处理、异步I/O等。此外,理解和处理网络异常情况...
此外,理解和应用TCP选项,如TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(维持连接活性)等,也是提高网络通信效率和稳定性的重要手段。 在网络层,IP协议处理数据包的路由和分片,而ICMP(Internet Control ...
5. Socket选项和标志:Winsock API提供了丰富的socket选项,如SO_REUSEADDR、SO_KEEPALIVE、TCP_NODELAY等,可以调整套接字的行为。例如,SO_REUSEADDR允许立即重用刚关闭的套接字地址,TCP_NODELAY禁用Nagle算法以...
#设定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_NODELAY`禁用Nagle算法以减少小数据包的延迟,`TCP_KEEPALIVE`开启心跳检测,防止空闲连接被网络设备意外关闭。 8. **安全连接**: 虽然TCP提供了可靠的数据传输,但不保证数据的...
例如,TCP_NODELAY(禁用Nagle算法)、TCP_KEEPALIVE(启用空闲连接检测)等。 5. **连接到服务器**:使用`connect`函数与目标服务器建立TCP连接。需要提供服务器的IP地址和端口号。 6. **发送和接收数据**:使用`...
- **tcp_nodelay**:如果开启,会立即发送数据,不等待TCP缓冲区填满,但可能增加网络往返次数;关闭时,会等待一定量的数据再发送,减少网络交互次数。 3. **Nginx负载均衡**: - **upstream模块**:Nginx使用...
7. **TCP优化**:包括TCP选项的设置,如TCP_NODELAY(禁用Nagle算法)和TCP_CORK,以优化小包传输效率;还有TCP Keepalive,用于检测长时间无数据交换的连接是否存活。 8. **UDP协议**:与TCP相比,UDP是一种无连接...