TCP的可靠传输机制

传输确认

在这里插入图片描述
为保证数据传输的可靠性,TCP要求对传输的数据进行确认。TCP协议通过序列号和确认号来确保传输的可靠性。每一次传输数据时,TCP都会标明该段的起始序列号,以便对方确认。在TCP协议中并不直接确认收到哪些段,而是通知发送方下一次该发送哪一个段,表示前面的段都已收到。序列号还可以帮助接收方对乱序到达的数据进行排序。

收到一个段确认一个段的方法虽然简单,但是会消耗网络资源较多。为了提高通信效率,TCP采取了一些提高效率的方法。

首先,TCP并不要求对每个段一对一地发送确认。接收端可以用一个ACK确认之前收到HostA在收到
的所有数据。例如,接收到的确认序列号为N+1时,表示接收方对到N为止的所有数据全部正确接收。

另外,TCP并不要求必须单独发送确认,而是允许将确认放在传输给对方的TCP数据段中。如果收到一个段后没有段要马上传到对方,TCP通常会等待一个微小的延时,希望将确认与后续的数据段合并发出。

由于每个段都有唯一的编号,这样当对方收到了重复的段时容易发现,数据段丢失后也容易定位,乱序后也可以重新排列。在动态路由网络中,一些数据包很可能经过不同的路径,因此报文可能会乱序到达。32位的序列号由接收端计算机用于把段的数据重组成最初形式。

上图给出了一个经过简化的TCP传输过程示例。为了便于理解,本例只关注从HostA到HostB的单向传输。假设HostA向HostB发送的初始序列号为1,且发送窗口为4096字节,HostA向HostB发送的每个段数据长度为1024字节,HostA将一次性向HostB发送4个段。而HostB收到并校验了数据的正确性后,在回送确认时只需发送确认号4096+1=4097,就可以表示4096之前的全部数据都已经正确接收,下一次期望接收从4097开始的数据。下一次HostA仍然一次发送总量为4096字节的4个段给HostB。

超时重传

在这里插入图片描述

上图给出了一个经过简化的典型的TCP重传过程示例。假设HostA向HostB发送的序列号为1025的第二个段在途中丢失。HostB只对全部按序无错接收到的序列号最高的段给以确认,即HostB只以确认号1025向HostA确认第一个段已收到。

HostA在收到这个确认时,并不能确定HostB没有收到第二个段,因为也许第二个段也许还没有到达HostB,或者HostB发出的第二个确认可能被延迟了,因此,HostA不能立即重传第二个段。只有在第二个段发出超过RTT(Round Trip Time,往返时间)而仍没有收到确认时,HostA才认为这个段已经丢失,并重传这个段。

HostB收到重传的第二个段后,按序无误收到的最后一个段的序列号为3073,因此向HostA发送确认号为4097的确认,表示之前的数据均正确无误地收到。

TCP接收方并不通过“错误通知”告知发送方重传。如果HostA向HostB发送的序列号为1025的第二个段到达了HostB,但被检查出校验错误,HostB也不会向HostA发送“错误通知”要求重传。因此,RTA仍然需要等待RTT时间之后再重传这个段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值