热度 2
2015-7-5 17:04
1803 次阅读|
0 个评论
在TCP/IP中,延时ACK和Nagle算法。 TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法来处理他们。 延时ACK: TCP在接收到数据的时候,并不立即发送ACK,而是等待一段时间,如果在此时间内,有需要发送的数据,则将ACK和数据一起发送。因为在回复ACK的时候,可以等待一段时间(大部分实现时延为200ms,RFC规定不超过500ms),避免了回复没有有效载荷的ACK分节。 Nagle算法: 但是在拥塞严重的网络中,就需要Nagle算法,它保证每一时刻,最多只有一个没有被确认的ACK分节,在前一个ACK没有到来之前,不发送其他小分组,且收集少量的分节,并在下次ACK到来的时候,将这些小的分节一一个分节的方式发送出去。优势:自适应网络变化,即ACK达到越快,数据发送越快。避免发端持续发送导致收端无法及时接收数据和回复ACK,造成发送方阻塞,同时也避免了出现大量小数据分节。 延时的ACK适合局域网,成块数据流使用, Nagle算法适合广域网、小分节数据、可能存在网络拥塞的情况下使用。 而同样,对于在实际应用中设计应用层协议的时候,合适的ACK机制很重要。即使是基于TCP/IP的应用层,也要实现自己的ACK机制。因为TCP/IP的ACK是传输层的ACK,并不一定表示应用层已经处理了收到的消息,因为数据可能还在内核中没有被应用层读取。所以,应用层协议要有自己的ACK,进行应用层的消息确认。 对于移动网络下的应用层协议设计,由于网络的不稳定性,使用停止等待协议可能会确保移动端收到数据,同时避免网络不佳的时候网络阻塞,实现也比较简单。也可以借鉴TCP使用的滑动窗口协议,在停止等待确认前,发送多个分节。 在低功耗无线通信中的应用层协议设计中,频繁的数据通信情况下,时延的ACK可以节省功耗,避免网络碰撞。同时,可以在发送端设置是否需要ACK确认,只对需要的数据进行ACK确认。 ACK的设计,对于整个系统都会有很大的影响,所以在设计的时候要综合系统的各方面因素,来设计一个适合的当前系统的ACK机制。