tcp no delay(TCP粘包问题)

阅读数:106 评论数:0

跳转到新版页面

分类

网络/通信

正文

一、概述

TCP是流式传输,没有数据包的概念,所以每次会先把缓冲池填满后再发送。这就会产生粘包和拆包的问题。

UDP常用于实时较高、对数据准确性要求相对较低的场景,每个UDP数据包都是一个完整的单元,因此不会发生TCP中常见的粘包现象。

二、Nagle算法

Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

随着网络环境的改善,Nagle 算法的优势也不如当初那么明显。主要的变化有以下几点

1 网络带宽大幅提高。现在的网络速度已经非常快,小数据包带来的开销相对已经不那么明显。
2 应用对延迟的敏感度更高。Nagle 算法会增加首次数据发送的延迟,对交互式应用影响较大。
3 TCP 窗口大小增加。TCP 窗口越大,Nagle 算法带来的优势就越小。
4 TCP 连接数量增加。Nagle 算法主要针对单个 TCP 连接的优化,在大量并发连接下效果不明显。

三、解决TCP粘包

定长包协议 TCP 连接数量增加。Nagle 算法主要针对单个 TCP 连接的优化,在大量并发连接下效果不明显。
特殊标志协议 发送方在每个数据包尾部添加特殊标志如特定的换行符(如’\n’),接收方通过识别换行符来划分不同的数据包。
长度字段协议 发送方在每个数据包前部添加一个表示数据包长度的字段,接收方根据该长度字段来解析数据包边界,确保正确分离每个数据包。
自定义协议  

四、TCP_CORK & TCP_NODELAY

TCP_CORK

可以禁用Nagle化,TCP中的CORK意思是将连接塞住,使得数据先不发出去,等到拔去塞子后再发出去。

Nagle算法和CORK算法非常类似,但是它们的着眼点不一样,Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。

TCP_NODELAY

TCP链接的过程中,默认开启Nagle算法。

这个时候可以置位TCP_NODELAY关闭Nagle算法

你可以设置选项,其方式正好同相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。 
      




相关推荐