nagle算法

TCP粘包, UDP丢包, nagle算法

杀马特。学长 韩版系。学妹 提交于 2020-05-01 21:36:29
一、TCP粘包 1. 什么时候考虑粘包 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题 (因为只有一种包结构,类似于http协议, UDP不会出现粘包现象 )。关闭连接主要要双方都发送close连接(参考tcp关闭协议)。如:A需要发送一段字符串给B,那么A与B建立连接,然后发送双方都默认好的协议字符如"hello give me sth abour yourself",然后B收到报文后,就将缓冲区数据接收,然后关闭连接,这样粘包问题不用考虑到,因为大家都知道是发送一段字符。 如果发送数据无结构,如文件传输,这样发送方只管发送,接收方只管接收存储就ok,也不用考虑粘包 如果双方建立连接,需要在连接后一段时间内发送不同结构数据,如连接后,有好几种结构: 1)"hello give me sth abour yourself" 2)"Don't give me sth abour yourself" 那这样的话,如果发送方连续发送这个两个包出去,接收方一次接收可能会是"hello give me sth abour yourselfDon't give me sth abour yourself" 这样接收方就傻了,到底是要干嘛?不知道,因为协议没有规定这么诡异的字符串,所以要处理把它分包

Nagle算法

青春壹個敷衍的年華 提交于 2020-01-25 18:55:08
简介 Nagle算法 是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小 缓冲 器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加 网络 软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用 TCP/IP网络 减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据,这样会导致 网络 由于太多的包而过载(一个常见的情况是发送端的" 糊涂窗口综合症(Silly Windw Syndrome) ")。从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的标题数据。这种情况转变成了4000%的消耗,这样的情况对于轻负载的 网络 来说还是可以接受的,但是重负载的福特网络就受不了了,它没有必要在经过节点和网关的时候重发,导致包丢失和妨碍传输速度。 吞吐量 可能会妨碍甚至在一定程度上会导致连接失败。Nagle的算法通常会在TCP程序里添加两行代码,在未确认数据发送的时候让发送器把数据送到 缓存 里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。尽管Nagle的算法解决的问题只是局限于福特 网络 ,然而同样的问题也可能出现在ARPANet

Nagle算法

余生长醉 提交于 2020-01-25 18:54:29
简介 Nagle算法 是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小 缓冲 器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加 网络 软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用 TCP/IP网络 减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据,这样会导致 网络 由于太多的包而过载(一个常见的情况是发送端的" 糊涂窗口综合症(Silly Windw Syndrome) ")。从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的包,其中包括1字节的有用信息和40字节的标题数据。这种情况转变成了4000%的消耗,这样的情况对于轻负载的 网络 来说还是可以接受的,但是重负载的福特网络就受不了了,它没有必要在经过节点和网关的时候重发,导致包丢失和妨碍传输速度。 吞吐量 可能会妨碍甚至在一定程度上会导致连接失败。Nagle的算法通常会在TCP程序里添加两行代码,在未确认数据发送的时候让发送器把数据送到 缓存 里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。尽管Nagle的算法解决的问题只是局限于福特 网络 ,然而同样的问题也可能出现在ARPANet

windows上关闭Nagle算法

£可爱£侵袭症+ 提交于 2020-01-25 18:53:48
下面的设置可以调整或禁用 nagel 算法。禁用 nagel 算法以后, 允许很小的包没有延迟立即发送。建议对某些游戏关闭 nagel 算法, 这样做对文件传输/吞吐量有负面影响。默认状态( 开启nagel )为了提高性能, 会把几个小数据包合并一起, 为了有效传输更大的数据包。虽然这提高了整体性能,并降低了TCP/ IP开销, 但可能会短暂延迟较小的数据包的传输。切记禁用 Nagle 算法可能对文件传输有一些负面影响, 只能帮助某些游戏减少延迟. 为了实现这个调整,在注册表编辑器(开始>运行> REGEDIT)找到: 此设置配置最大数量的ACKs ( Windows XP/2003/Vista/2008 ) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id} 将有多个网卡接口有列出,例如: {1660430C-B14A-4AC2-8F83-B653E83E8297}. 找到与你 IP 地址相同的地址, 创建一个新的 DWORD 值: TcpAckFrequency=1 解释:(DWORD value, 1=disable, 2=default, 2-n=send ACKs if outstanding ACKs before timed interval

TCP Nagle算法&&延迟确认机制

北慕城南 提交于 2019-12-06 23:58:20
TCP Nagle算法&&延迟确认机制 TCP Nagle算法 http://baike.baidu.com/view/2468335.htm 百度百科:TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。 (一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。 Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。(减少大量小包的发送) Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。 Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释): (1)如果包长度达到MSS,则允许发送; (2)如果该包含有FIN,则允许发送; (3)设置了TCP_NODELAY选项,则允许发送; (4)未设置TCP_CORK选项时, 若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送; (5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。 ‍ Nagle算法只允许一个未被ACK的包存在于网络

TCP之Nagle算法

江枫思渺然 提交于 2019-12-06 09:03:57
Nagle算法 Nagle算法是为了提高带宽利用率而设计的算法 ,该 算法主要用于避免过多小分节报文在网络中传输。比如一个20字节的TCP首部+20字节的IP首部+1个字节的数据组成的TCP数据报,有效传输通道利用率只有将近1/40。如果网络充斥着这样的小分组数据,则网络资源的利用率是相当低下的。 如果开启了这个算法 (TCP默认开启),则协议栈会累积数据直到以下两个条件之一满足的时候才真正发送出去:(1)积累的数据量达到MSS (2)有未确认的包存在时收到了一个 Ack包 Nagle算法在维基百科上用伪代码描述如下: if there is new data to send if the window size >= MSS and available data is >= MSS send complete MSS segment now else if there is unconfirmed data still in the pipe enqueue data in the buffer until an acknowledge is received else send data immediately end if end if end if 副作用 在介绍Nagle算法的副作用前要引入TCP的另外一个机制 TCP Delayed Acknoledgement

关于Nagle算法

匿名 (未验证) 提交于 2019-12-02 23:49:02
Nagle算法   TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。     Nagle算法的基本定义是 任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块;所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。   Nagle算法完全由TCP协议的ACK机制决定,这会带来一些问题,比如如果对端ACK回复很快的话,Nagle事实上不会拼接太多的数据包,虽然避免了网络拥塞,网络总体的利用率依然很低。 Nagle算法的规则:   (1)如果包长度达到MSS,则允许发送;   (2)如果该包含有FIN,则允许发送;   (3)设置了TCP_NODELAY选项,则允许发送;   (4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;   (5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。 TCP_NODELAY 选项   默认情况下,发送数据采用Negale 算法

TCP协议之网络延时

拟墨画扇 提交于 2019-11-27 14:15:48
影响TCP 网络时延的因素 硬件速度 网络和服务器的负载 请求和响应报文的尺寸 客户端和服务器之间的距离 TCP 协议的技术复杂性 TCP协议产生的时延 TCP 连接建立握手; TCP 慢启动拥塞控制; 数据聚集的 Nagle 算法; 用于捎带确认的 TCP 延迟确认算法; TIME_WAIT 时延和端口耗尽。 TCP连接建立 TCP连接的建立,需要经历3个报文的交互过程,沟通相关连接参数,这个过程称为三次握手(three-way handshake)。 因此,如果在每次发送数据之前,都重新建立一次TCP连接,那么建立连接的耗时将对性能产生较大的影响(特别是在发送少量数据的情况下)。 三次握手四次挥手(参考自coolshell) 优化方法 建立长连接,多次数据的发送复用同一条连接。 TCP慢启动 如果在发送方和接收方之间存在多个路由器和速率较慢的链路,此时多个发送方一开始便向网络发送多个报文段,由于受网络传输和服务端处理能力的影响,一些中间路由器必须缓存分组,并有可能最终耗尽存储器的空间,因而更多的报文发送将使网络出现拥塞。 TCP慢启动(slow start),就是用于防止因特网的突然过载和拥塞的一种流量控制机制。 慢启动为发送方的TCP增加了一个窗口:拥塞窗口(congestion window),简称cwnd。 刚建立连接时,拥塞窗口被初始化为1个报文段。每收到一个ACK