偶尔找到“计算机网络 自顶向下方法” 一书,它从可靠数据传输的基本原理慢慢过渡到tcp协议的实现,个人觉得非常不错并且容易把握重点,因此本文也算是学习笔记。
计算机网络本身可能出现数据包受损、丢失、乱序到达等问题,如果在编写网络应用时有一套可靠传输协议,就可以避免这些复杂的底层问题;如果没有那么所有的网络应用都要实现数据包的容错机制,也算是重复解决同一个问题,因此就出现了tcp可靠传输协议。
tcp协议本身非常复杂,它的实现依赖于可靠传输的基本原理,主要内容如下:
1、由于数据包可能受损,因此发送方除了发送数据本身,还需附带数据的校验和;接受方拿到数据后会重新计算校验和并与接受的校验和进行比较,如果相等则数据是完整的。
2、如果数据确实受损,接受方就会发送一个反馈消息要求发送方重新发送数据,反之发送一个正常接受的反馈消息要求发送下一个数据包;
3、由于反馈消息也可能受损,导致发送方不能正确识别,因此需要将原先的数据再发送一遍。如果是正常接受的反馈消息受损,发送方仍会重新发送当前数据包,但是接受方如何分辨新接受的数据包是之前的数据包还是新数据包呢(如果不分辨,接受方会处理两份相同的数据包,在逻辑上就已经发生错误)?解决的方法是发送方在发送数据包时附带一个递增的数据编号;
4、有了数据的校验和、序号机制和应答机制已经可以解决数据包的受损和乱序到达问题,但数据包还可能会丢失(包括数据包本身和反馈消息),发送方很可能永远收不到接受方的反馈消息,此时发送方需要定期发送数据包,这个期限应该是网络数据包正常往返的平均时间,如果超过接受期限未接受到反馈消息就重新发送数据包。
现在已经可以初步实现一个可靠的数据传输通道了,但是还不能正式投入使用,因为还有效率问题待解决。