tcp cork quickack

本文探讨了TCP的DelayedAck机制及其默认40ms的延迟原因,并讲解了如何在RedHat系统中通过调整tcp_delack_min参数来改变这一设定。同时,深入解析了TCP_CORK选项的作用,特别是在高性能Web服务器如Nginx中的应用,以及其与TCP_NOPUSH选项之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下均为转载摘录


https://blog.youkuaiyun.com/u011006622/article/details/81086439

Delayed Ack 为什么是40ms?这个时间能不能调整呢?

首先在redhat的官方文档中,有如下说明:

一些应用在发送小的报文时,可能会因为TCP的Delayed Ack机制,导致一定的延迟。其值默认为40ms。可以通过修改tcp_delack_min,调整系统级别的最小延迟确认时间。例如:

echo 1 > /proc/sys/net/ipv4/tcp_delack_min
不过在slackware和suse系统下,均未找到这个选项,也就是说40ms这个最小值,在这两个系统下,是无法通过配置调整的。


TCP_CORK

当TCP_CORK选项被设置时,TCP链接不会发送任何的小包,即只有当数据量达到MSS时,才会被发送。当数据传输完成时,通常需要取消该选项,以便被塞住,但是又不够MSS大小的包能及时发出去。为提升性能及吞吐量,Web Server、文件服务器这一类一般会使用该选项。

著名的高性能Web服务器Nginx,在使用sendfile模式的情况下,可以设置打开TCP_CORK选项:将nginx.conf配置文件里的tcp_nopush配置为on。(TCP_NOPUSH与TCP_CORK两个选项实现功能类似,只不过NOPUSH是FreeBSD下的实现,而CORK是Linux下的选项)。另外Nginx为了减少系统调用,追求性能极致,针对短连接(一般传送完数据后,立即主动关闭连接,对于Keep-Alive的HTTP持久连接除外),程序并不通过setsockopt调用取消TCP_CORK选项,因为关闭连接会自动取消TCP_CORK选项,将剩余数据发出。


TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK

https://blog.youkuaiyun.com/dog250/article/details/52664508

在 Qt 中可以使用 QTcpSocket 类来实现 TCP 断开重连的功能。具体实现步骤如下: 1. 创建一个 QTcpSocket 对象。 ``` QTcpSocket *socket = new QTcpSocket(this); ``` 2. 连接服务器。 ``` socket->connectToHost(host, port); ``` 3. 在连接成功的槽函数中,设置一些连接参数,如超时时间和重连次数等。 ``` void connected() { socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1); socket->setSocketOption(QAbstractSocket::LowDelayOption, 1); socket->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 1024 * 1024); socket->setSocketOption(QAbstractSocket::SendBufferSizeSocketOption, 1024 * 1024); socket->setSocketOption(QAbstractSocket::SocketOption(0x00030000), 1); // TCP_NODELAY socket->setSocketOption(QAbstractSocket::SocketOption(0x00040000), 1); // TCP_CORK socket->setSocketOption(QAbstractSocket::SocketOption(0x00080000), 1); // TCP_QUICKACK connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); m_reconnectCount = 0; } ``` 4. 在断开连接的槽函数中,根据需要进行重连操作。 ``` void onDisconnected() { if (m_reconnectCount < m_maxReconnectCount) { ++m_reconnectCount; QTimer::singleShot(m_reconnectInterval, this, SLOT(reconnect())); } else { qDebug() << "Maximum retry count reached"; } } void reconnect() { qDebug() << "Reconnecting..."; socket->connectToHost(host, port); } ``` 5. 在错误处理的槽函数中,如果是连接超时等错误,也可以进行重连操作。 ``` void onError(QAbstractSocket::SocketError error) { if (error == QAbstractSocket::ConnectionRefusedError || error == QAbstractSocket::RemoteHostClosedError || error == QAbstractSocket::SocketTimeoutError) { if (m_reconnectCount < m_maxReconnectCount) { ++m_reconnectCount; QTimer::singleShot(m_reconnectInterval, this, SLOT(reconnect())); } else { qDebug() << "Maximum retry count reached"; } } else { qDebug() << "Socket error:" << error; } } ``` 注意:在进行重连操作时,需要考虑一些细节问题,如重连次数、重连间隔等。此外,如果重连过程中发现了一些错误,也需要及时处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值