我对TCP实际如何工作感到困惑。我在几本书和文章中读到,它负责在接收主机上重新传输传输的数据报。但是,我一直在阅读RFC 793,并且找不到这样的规范。另一方面,RFC 791(Internet协议)明确规定Internet协议负责重新排列接收主机上发送的数据包。有帮助吗?谢谢!
我对TCP实际如何工作感到困惑。我在几本书和文章中读到,它负责在接收主机上重新传输传输的数据报。但是,我一直在阅读RFC 793,并且找不到这样的规范。另一方面,RFC 791(Internet协议)明确规定Internet协议负责重新排列接收主机上发送的数据包。有帮助吗?谢谢!
Answers:
从IP的角度来看,数据包是单个数据单元。它可能会碎片化,因为它遍历具有不同MTU(最大传输单元)的设备,并负责将这些碎片放回到另一端。因此,当一个1500字节的数据包以300 MTU遍历网络的一部分时,它可能被分成5个片段,然后在另一端重建数据包。
另一方面,TCP处理数据流,包括任意数量的IP数据包。因此TCP负责确保1)流中数据包的顺序正确(当传递到下一层时),以及2)它们都通过 - 或者指示错误否则
因此,他们都负责自己层中的数据序列。
但是每个ISO层都不了解上层。因此,IP不可能以正确的顺序为TCP重新安排数据包 - TCP期望数据包所在的序列对IP没有意义。与TCP无法确保正确配置HTTP调用的方式相同,或者以太网知道IP数据包已正确寻址。
IP协议前面的底线没有关于数据顺序的概念。IP数据包是彼此无关的单个实体。IP协议唯一的责任是从A点到B点获取数据包。它可以处理由于传输中传输的MTU较小而发生的数据包碎片,它会将碎片重新放在接收器上,但它没有用于订购数据的工具。
TCP是具有IP协议的合作协议。TCP协议提供所谓的TCP / IP套件的传输层。传输层由TCP和UDP协议组成。TCP提供通过IP发送的状态和传递确认数据包。UDP是无状态的,实际上只提供IP地址到端口号的轻量级映射,它在流应用程序中使用很多,或者快速和小型比可靠性更好。
TCP提供了一些关键功能,可确保您收到所有数据包。一旦两个客户端建立TCP连接,则在它们到达之间发送的每个分组在到达时根据序列号和分组长度进行计算。这是通过Sliding Window Data Transfer和Acknowledgement系统完成的。
系统的关键是来自接收器的每个确认包仅确认来自发送者的连续流中接收的最后一个包。因此,如果数据包1,2和4到达发送方,则它们将从IP传递到TCP,而不进行任何处理。然而,TCP将仅确认接收到包2(并且隐含地包1),因为它可以基于序列号和包长度来判断应该存在包3。
取决于发送系统上的TCP 3和4的实现,以确保它们被接收。重新发送之前的时间基于计算机上TCP实现中内置的时序,并且可以根据网络的速度和链路的性能而改变。随着时间的推移,如果您的链路不可靠,那么在没有先前数据包的ACK的情况下发送的数据包数量将会变小。
同样,底线,IP不知道您的数据包属于哪个顺序。我只知道如何从这里获取数据包。