Nagle算法
Nagle算法是为了避免网络中存在太多的小包(协议头比例非常大)造成拥塞。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
算法如下:若发送应用进程要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方接收对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段再发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。
它的主要职责是数据的累积,实际上有三个门槛:
1)缓冲区中的字节数达到了一定量(超过阈值MSS)
2)等待了一定的时间(一般的Nagle算法都是等待200ms)
3)紧急数据发送。
TCP的黏包
TCP报文粘连就是,本来发送的是多个TCP报文,但是在接收端收到的确是一个报文,把多个报文合成了一报文。
TCP报文粘连的原因:“粘包”可发生在发送端,也可发生在接收端。在流传输中出现,UDP不会出现粘包,因为它有消息边界(两端数据间是有界限的)。
1、由Nagle算法造成的发送端的粘包
Nagle算法产生的背景是,为了解决发送多个非常小的数据包时(比如1字节),由于包头的存在而造成巨大的网络开销。简单地讲,Nagle算法就是当有数据发送时,先不立即发送,而是稍微等一小会,看看在这一小段时间内,还有没有其他需要发送的消息。当等过着一小会以后,再把要发送的数据一次性都发出去。这样就可以有效地减少包头的发送次数。
2、接收端接收不及时造成的接收端粘包
TCP会把接收到的数据存在自己的缓冲区种,然后通知应用层取数据。当应用层由于某些原因不能及时地把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据,产生报文粘连的现象。
TCP报文粘连的解决方法
1、关闭Nagle算法。在socket选项中,TCP_NODELAY表示是否使用Nagle算法。
2、接收端尽可能快速的从缓冲区读数据。
3、可以在发送的数据中,添加一个表示数据的开头和结尾的字符,在收到消息后,通过这些字符来处理报文粘连。
如何用UDP实现TCP(UDP的可靠性怎么提高)?
如果要通过UDP传输数据,但却要保证可靠性的话,要通过第七层(应用层)来实现的。