什么保证了TCP的可靠

本文正在参与 “网络协议必知必会”征文活动

可靠的基石——ACK机制

ACK机制是指接收方对发送方做出应答,由于TCP是基于字节流的,因此ACK对应的数据单位是字节,例如收到的数据报序号seq=x,报文数据的字节大小为1000,那么ACK报文中的ack=x+1000。

ACK报文中的应答序号表示的是“该序号之前的报文全部收到”,例如一个1M的文件被拆分成{0,1,…N-1,N,N+1,N+2} 几个报文进行传输,接收方接收后根据需要将其组装。如果接收的顺序为N-1,N+1,N+2,由于最后一个有序包为N-1,接收方仅会进行ACK(N-1)的确认。

在不可靠的信道中达成一致

在网络中不可靠的信道是必须被考虑的一点,三次握手的目的是:发送方和接收方确认要建立一条链接并确定报文序列号。

在不可靠的信道中进行两次握手会怎么样?在谢希仁的《计算机网络》中指出:在不可靠的网络下,当客户端的第一次连接请求在网络中滞留了,但实际上通过超时重发机制,客户端和服务器已经建立连接,那么当服务器接收到这个超时的连接后,如果仅通过两次握手建立连接,那么服务端会监听这个不会存在的连接,造成白白的资源浪费。

简而言之,要保证二者在不可靠信道中达成一致,三次是最小的握手次数

实现网络流控的技术——滑动窗口

TCP协议为保证可靠,必须对网络流量进行控制,以防止拥塞导致丢包。这个进行网络流控的技术就是“滑动窗口”,其通过控制发送方的发送速率来实现,如下图所示
image.png

对于发送端来说,滑动窗口从允许发送的字节开始,到已经ACK的字节结束。对于结束端可以直接从ack序号获取,而对于起始端,是从TCP协议中的window字段获取的。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。发送端根据接收端的处理能力来发送数据,以防接收端处理不过来。

参考

TCP 为什么是三次握手,而不是两次或四次?