传输确认
为保证数据传输的可靠性,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将一次