Repository files navigation
使用 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 支持五种类型的数据包,包含操作码与操作
操作码
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 包,随后终止会话
You can’t perform that action at this time.