TCP的ACK

当TCP接收到连接的另一端点发来的数据时,它会发送一个确认。这个确认可能不会立即发送,而会延迟片刻。TCP使用的ACK是累积的,因此,一个指示字节号N的ACK暗示所有直到N的字节(但不包括N)都已经被接收了。这对于ACK丢失来说,提供了一定的鲁棒性,因为如果序列号1212的ACK丢失,但是收到序列号1213的ACK,则说明发送1212的报文已经被接收方收到并处理了。

TCP头里有个32位的序列号字段seqNo,它标识了TCP发送端到TCP接收端的数据流的一个字节,该字节是该序列号的报文段中的第一个字节在整个报文段中的编号。这个sqeNo是一个32位的无符号数,到达2的32次幂后再循环到0,TCP给数据报中的每个字节赋予一个序列号。当建立一个新的TCP连接时,客户端发给服务器一个SYN报文,这个SYN报文会带上一个随机的初始化序列号(Initial Sequence Number)ISN,而不是0或者1,因为更安全。TCP提供给应用程序的是全双工的服务,因此,接收方和发送方各自维持一个数据流方向上的序列号。

正因为使用序列号,一个TCP接收端可以丢弃重复的报文段和对随机到达的乱序报文重排序后处理。因为TCP使用IP来传输报文段,IP不提供重复消除或保证到达的次序的功能。但是TCP是一个字节流协议,TCP不能将乱序的数据流发给应用程序。因此,TCP接收端的窗口里如果缺失序列号小的报文段,即便收到了大序列号的报文段,也不会交给应用程序处理,必须等到小序列号报文段的位置被填满。

ACK里还有一个16位的窗口大小Window Size,由接收方反馈给发送方,发送方由此来控制发送速率,这是TCP流量控制的关键。

CWR:拥塞窗口减速,由中间网络发送给发送方,发送方由此来降低它的发送速率。

猜你喜欢

转载自blog.csdn.net/Wengzhengcun/article/details/84790318
ACK