TCP小包优化

接收方窗口大小通知

在《TCP滑动窗口与缓冲区》的博文中说过接收方会通知发送方滑动窗口的大小,但是如果应用程序每调用read函数读出一些数据,就通知发送方,那么网络中将会有大量的只通知对方窗口大小的报文,而每个TCP报文都会添加几十字节的头部信息,也就是说这个报文的有效负载非常低,网络带宽将浪费在这些小报文上。实际上RFC有优化的,不会缓冲区一变大,就通知对方接收窗口大小的,很多情况下是同数据报文或者ACK报文一块通知的。

ACK应答优化

TCP是可靠连接的,每个数据报文都得收到对方的ACK应答,才能从发送缓冲区删除,要是定时器等待ACK应答超时,那么会重发报文。但是如果接收方要是每收到一个数据报文,就回复一个没有数据的ACK报文,同第一种情况一样,将会浪费大量的网络资源。实际上TCP会通过接收方要发送的数据报文捎带过去的。如果接受到数据报文的时候,接收方的发送缓冲区没有数据要发送,那么会延迟一小段时间,要是稍后有数据要发送了,就连同数据报文一块发送出去。这就是延迟ACK。当然延迟的时间也不能太长,要不会触发发送端的超时,从而导致发送速度变慢,得不偿失。

发送方小数据包优化

当应用程序多次调用write函数,每次都只发送几个字节的小数据包,如果每次都调用write函数后,就立即发送报文。与前面2点类似,会导致网络带宽利用率不高,因为一个报文里的有效负载占比太小。TCP使用nagle算法限制大批量的小数据包的,其思想是如果飞行中的报文有一个数据报文不足一个MSS,那么需要等到获取到那个小报文的ACK应答报文后,才能发送下一个不足一个MSS的报文。到此你不知道是否有发现nagle算法与ACK延迟发送在互相等待对方?如下图所示假设延迟ACK的时延是20ms:
在这里插入图片描述
这个会导致发送速度变慢。为此linux提供了参数TCP_NODELAY参数用于控制是否打开nagle算法:

int on = 1; 
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on)); 

对于实时性要求高的场景可以考虑关闭,不过关闭后一定要测试一下系统的吞吐量等指标,因为对于nagle算法与延迟ACK,TCP已经优化的非常好了。其实对于这种小包,还是应用程序先组装成一个较大的报文,批量发送,这是一种更好的选择。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(传输控制协议)是一种面向连接的协议,用于在网络中可靠地传输数据。下面是建立TCP网络模型的步骤: 1. 确定通信目标:确定通信的目标IP地址和端口号。 2. 建立连接:使用TCP三次握手建立连接。 3. 传输数据:数据传输过程中,TCP会进行流量控制、拥塞控制等优化,以确保数据的可靠性和及时性。 4. 关闭连接:使用TCP四次挥手关闭连接。 优化TCP网络模型的方法如下: 1. 拥塞控制:TCP通过拥塞控制算法来控制发送速率,以避免网络拥塞。可以根据网络情况调整拥塞窗口大小,从而提高网络吞吐量。 2. 流量控制:TCP通过流量控制算法来控制接收端的数据接收速率,以避免接收端数据缓冲区溢出。可以根据接收端的缓冲区大小动态调整发送端的发送速率。 3. Nagle算法:Nagle算法可以减少小包的传输次数,从而提高网络吞吐量。该算法会将多个小数据包合并为一个大数据包进行传输。 4. 快速重传和快速恢复:TCP通过快速重传和快速恢复算法来提高数据传输的可靠性。当发生数据丢失时,快速重传和快速恢复算法可以快速重新传输丢失的数据,避免等待超时重传带来的延迟。 5. TCP/IP协议栈优化:对TCP/IP协议栈进行优化,可以提高网络性能。例如,可以优化TCP/IP协议栈的缓存机制、中断处理机制等。 综上所述,建立TCP网络模型和优化模型需要深入了解TCP协议的工作原理和优化算法,针对实际应用场景进行合理的配置和优化,以提高网络性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值