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 分别是写请求, 确认和数据类型数据包的名称. 附录包含读取文件的类似示例.
- 主机 A 向主机 B 发送"WRQ", 源 = A 的 TID, 目标 = 69.
- 主机 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, 则可以维护第一个连接, 同时通过返回错误包拒绝第二个连接.