Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

TFTP 协议

基本信息

  • 使用 UDP 协议,其设计目标是小型且易于实现,只有向远程服务器读写的功能
  • 与其他互联网协议一样,传递 8 位字节的数据
  • 无法列出目录,也没有提供用户身份验证机制
  • 三种传输模式:netascii 传输文本文件;octet 传输二进制文件;mail(已被废弃)

协议概述

  • 任何传输都始于读取或写入文件的请求,该请求也用于建立连接
  • 文件以 512 字节的固定长度块发送
  • 每个数据包包含一个数据块,在发送下一个数据包之前通过确认包进行确认
  • 传输小于 512 字节的数据包表示传输结束
  • 发送一个数据包,收到 ACK 后再发送下一个,超时则重传备份好的数据包
  • 发生错误时,一方会发一个 ERROR 包然后直接关闭连接,如果 ERROR 丢失则会因为超时来猜可能出错了
  • 三类事件引起错误:无法满足请求、接收到无法用网络延迟或重复解释的数据包、传输过程中失去对必要资源的访问权限

与其他协议的关系

  • 数据包包含 IP 报头、数据报报头和 TFTP 报头,还可能包含 LNI、ARPA 报头等,以便通过本地介质传输
    本地介质报头 IP 报头 数据报报头 TFTP报头
    adasd adasd asdad asdas
  • TFTP 协议不定义或修改 IP 层的字段,这些由操作系统自动填充
  • 在 TFTP 中 TID 就是 UDP 的端口号,范围在 0 到 65535 之间
  • TFTP 报头包含一个 2 字节的操作码字段,用于指示数据包的类型

初始连接协议

  • 传输通过发送请求(WRQ 和 RRQ)并接收肯定回复来建立,确认包包含数据包的块号
  • 每个数据包都有一个块号,连续的从 1 开始,ACK 从 0 开始(初始请求响应是 0)
  • 连接的每一端随机选择一个 TID,用于该连接的持续期间
  • 每个数据包都包含连接两端的 TID,这对 TID 组合唯一标识一个 TFTP 会话
  • 服务器初始响应端口固定是 69
  • 若源 TID 不匹配,则丢弃该数据包,向错误数据包源发送错误数据包(根据底层是否发送),不中断传输过程

TFTP 数据包

  • TFTP 支持五种类型的数据包,包含操作码与操作
    操作码 1 2 3 4 5
    操作 RRQ WRQ DATA ACK ERROR
  • 操作码为 1 或 2,文件名以 \0 结尾,模式为 netascii 或 octet 以 \0 结尾
    2 bytes string 1 byte string 1 byte
    opcode filename 0 mode 0
  • 现代主流的模式应该选用 octet,避免使用 netascii 产生的模式转换问题
  • 数据包的操作码应选 3,块编号 1 到 65535,数据大小为 0 到 512
    2 bytes 2 bytes n byte
    opcode block data
  • ACK 数据包操作码是 4,块编号从 0 到 65535,ACK(0) 仅用于对 WRQ 的响应 RRQ 不用 ACK(0)
    2 bytes 2 bytes
    opcode block
  • 错误数据包操作码是 5,错误代码是个整数,错误消息可自定义或遵循规范原则
    2 bytes 2 bytes string 1 byte
    opcode ErrorCode ErrMsg 0

程序终止

  • 最后一个数据小于 512 字节表述传输完毕
  • 传输最后一个数据包后不要立即终止,鼓励延迟终止,防止最后一个数据包丢失
  • 最后一个 ACK 确认后表示传输结束,关闭程序
  • 连接过程中发送错误后发送 error 包,随后终止会话

About

自制 TFTP 文件传输程序

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages