Skip to main content

4. Initial Connection Protocol (初始连接协议)

通过发送请求 (WRQ用于写入外部文件系统,或RRQ用于从中读取)并接收肯定回复 (对于写入是确认包,对于读取是第一个数据包)来建立传输.通常,确认包将包含正在确认的数据包的块编号.每个数据包都有与之关联的块编号;块编号是连续的,从1开始.由于对写入请求的肯定响应是确认包,因此在这种特殊情况下块编号将为零.(通常,由于确认包是在确认数据包,因此确认包将包含正在确认的数据包的块编号.) 如果回复是错误包,则请求已被拒绝.

为了创建连接,连接的每一端为自己选择一个TID,用于该连接的持续时间.为连接选择的TID应该是随机选择的,以便在紧接的连续中选择相同编号的概率非常低.每个数据包都有与之关联的连接两端的两个TID,即源TID和目标TID.这些TID被传递给支持的UDP (或其他数据报协议)作为源端口和目标端口.请求主机按上述方式选择其源TID,并将其初始请求发送到服务主机上的已知TID 69 (十进制,105八进制).在正常操作下,对请求的响应使用服务器选择的TID作为其源TID,并使用请求者为先前消息选择的TID作为其目标TID.然后,这两个选择的TID用于传输的其余部分.

作为示例,以下显示了用于建立写入文件连接的步骤.请注意,WRQ,ACK和DATA分别是写入请求,确认和数据类型数据包的名称.附录包含了读取文件的类似示例.

  1. 主机A向主机B发送"WRQ",源= A的TID,目标= 69.
  2. 主机B向主机A发送"ACK" (块编号= 0),源= B的TID,目标= A的TID.

此时,连接已建立,主机A可以发送序列号为1的第一个数据包.在下一步以及所有后续步骤中,主机应确保源TID与步骤1和2中商定的值匹配.如果源TID不匹配,则应将数据包丢弃为从其他地方错误发送的.应向不正确数据包的源发送错误包,同时不干扰传输.只有当TFTP实际接收到具有不正确TID的数据包时,才能做到这一点.如果支持协议不允许,则不会出现这种特定的错误情况.

以下示例演示了协议的正确操作,其中可能发生上述情况.主机A向主机B发送请求.在网络中的某个位置,请求数据包被复制,因此向主机A返回两个确认,其中主机B响应两个请求而选择了不同的TID.当第一个响应到达时,主机A继续连接.当对请求的第二个响应到达时,它应该被拒绝,但没有理由终止第一个连接.因此,如果在主机B上为两个连接选择了不同的TID,并且主机A检查其接收的消息的源TID,则可以维持第一个连接,同时通过返回错误包拒绝第二个连接.