在之前,我们已经初步接触了TCP协议
TCP是传输层的协议它的主要特点有:
- TCP是面向连接的(TCP的三次握手和四次挥手)
- TCP面向字节流
- TCP带缓冲的(不会立即发送,会等到一个合适的时机再发,因为有可能来不及应答)
- TCP是全双工的
- TCP保证了可靠传输
- TCP具有流量控制
今天我们主要谈一下TCP是如何保证可靠性的
确认应答机制
TCP的确认应答机制就是,发送端给接收端发送的数据,当接收端收到之后会返回一个确认消息,这个确认消息也就是确认应答ACK
TCP的确认应答机制是基于序列号实现的,这个序列号也就是我们TCP报头中的序号和确认序号。TCP的报文到达确认,是对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号。例如,主机A发送的当前数据序号是1,数据长度是400,则接收端收到后会返回一个确认号是401的确认号给主机A,表示下次想从401开始接收数据。
上一张图:
可以看出来,TCP通过这种确认应答机制来判断接收端是否收到发送端发出的数据。
可是如果发生数据包丢失,或者确认应答丢失的情况怎么办呢?
超时重传机制就可以解决这个问题
超时重传机制
超时重传机制指定是,发送的数据包在没有收到相应的ACK,等待一段时间,超时之后就会认为这个数据包丢失了,就会重新发送。
如图所示主机B由于网络或其他原因没有收到主机A发送的数据(也可能是主机B收到数据后检测到该数据包有差错而丢弃),主机A只要超过了一段时间仍然没有收到主机B的确认应答就会认为刚才发送的报文丢失了,因而重传该报文。
再想想,如果是主机B的确认报文丢失了呢?
同样的,主机A没有收到主机B的确认就会重发刚刚发送的数据,那么主机B不就会有重复数据了吗?我们利用刚刚谈过确认应答机制中序号就很容易做到去除重复