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 是互相排斥的)。下面就让我们仔细分析下其工作原理。