一、介绍
TFTP
(Trivial File Transfer Protocol
)是一种简单的文件传输协议,用于在网络上进行文件传输。它基于UDP
协议,使用无连接的方式进行数据传输,不具备TCP
协议的可靠性和流量控制等特性,因此适用于小文件的快速传输。
TFTP
最初由RFC 783
定义,后来又通过RFC 1350
、RFC 2347
、RFC 2348
和RFC 2349
等标准进行了扩展和完善。它主要用于网络引导(booting
)、配置文件传输、固件升级等场景,常见于嵌入式设备、路由器、交换机等网络设备中。
而tftpd
是一个TFTP
服务器,用于在网络上提供文件传输服务。它可以运行在Linux
、Unix
、Windows
等操作系统上,并支持IPv4
和IPv6
两种网络协议。
(一)功能
TFTP
具有以下主要功能:
- 文件传输:可以在网络上传输文件。
- 简单性:非常简单,只支持最基本的文件传输功能。
- 可靠性:使用数据包确认机制确保数据传输的可靠性。
- 跨平台:跨平台的,可以在不同的操作系统和硬件上运行。
TFTPD
的主要功能包括:
- 提供
TFTP
服务:作为TFTP
服务器,响应客户端的读取请求(RRQ
)或写入请求(WRQ
),并向客户端发送数据报文或确认应答。 - 支持多线程:支持多线程处理客户端请求,可以同时处理多个客户端的文件传输请求。
- 配置灵活:可以通过配置文件进行参数设置,如监听地址、传输模式、日志级别等。
- 记录日志:可以记录传输过程中的详细日志信息,方便用户进行故障排查和问题定位。
(二)工作原理
TFTP
协议的工作原理比较简单,通常包括以下步骤:
- 客户端向服务器发送读取请求(
RRQ
)或写入请求(WRQ
),并指定要读取或写入的文件名和传输模式(如octet
、netascii
等); - 服务器收到请求后,根据文件名查找相应的文件,并向客户端发送确认应答(
ACK
)或错误应答(ERROR
); - 客户端收到应答后,开始向服务器发送数据报文,每个数据报文都会被服务器确认;
- 当所有数据传输完成后,客户端发送结束传输请求(
ACK
)给服务器,服务器收到后也发送确认应答,然后关闭连接。
需要注意的是,TFTP
协议本身并不提供身份验证和加密等安全机制,因此在使用时需要注意安全问题。同时,由于TFTP
使用UDP
协议进行数据传输,可能会受到丢包、重复、乱序等问题的影响,因此不适合用于大文件或对数据可靠性要求较高的场景。
(三)优缺点
- 优点:
- 简单易用:(实现非常简单,易于使用)
- 小巧轻便:(实现非常小巧,占用资源少)
- 跨平台:(可以在不同的操作系统和硬件平台上运行)
- 支持
UDP
:(使用UDP
协议进行数据传输,因此可以快速传输数据)
- 缺点:
- 安全性较低:(没有身份验证机制,容易受到攻击)
- 功能有限:(只支持最基本的文件传输功能,不支持目录传输、文件夹传输等高级功能)
- 传输速度较慢:(使用
UDP
协议进行数据传输,因此在网络拥塞或者丢包情况下传输速度会变慢)
(四)应用
TFTP
通常用于以下场景:
- 在本地网络中传输配置文件、固件、操作系统映像等文件。
- 在嵌入式系统中进行软件更新。
- 在路由器、交换机等网络设备中进行配置文件的传输。
总之,TFTP
是一种简单、轻便的文件传输协议,适用于小规模文件传输。虽然它的功能有限,但是在特定的场景下仍然具有非常重要的作用。
二、构建
在Linux系统中,TFTP
服务器的配置可以通过以下步骤完成:
- 安装
TFTP
服务器; - 配置
TFTP
服务器; - 创建
TFTP
服务器的根目录; - 启动
TFTP
服务器。
(一)安装
linux@localhost:~$ sudo apt-get install tftpd-hpa tftp-hpa
(二)配置
编辑TFTP
服务器的配置文件/etc/default/tftpd-hpa
,修改以下参数:
TFTP_USERNAME
:指定TFTP
服务器运行的用户,默认设置为tftp
。意味着TFTP
服务器将以用户tftp
的身份运行;TFTP_DIRECTORY
:指定TFTP
服务器的根目录,默认设置为/srv/tftp
。意味着/srv/tftp
是此服务器上的目录,可以通过TFTP
访问该目录;TFTP_ADDRESS
:指定TFTP
服务器的监听地址和端口号,其中,:69
表示监听所有可用的IP地址(0.0.0.0
)和默认的TFTP
端口号69
。TFTP_OPTIONS
:指定TFTP
服务器的选项,默认设置为--secure
。(1.--secure
:启用安全模式,禁止TFTP
服务器访问文件系统以外的文件;2.-c
:允许客户端上传文件到TFTP
服务器;3.-l
:允许客户端列出TFTP
服务器上的文件列表;4.-s
:指定TFTP
服务器的根目录,等同于TFTP_DIRECTORY
参数;5.-v
:启用详细日志输出。)
使用vim
编辑器打开配置文件进行编辑。
linux@localhost:~$ sudo vim /etc/default/tftpd-hpa
如果要配置TFTP
服务器,则必须修改此配置文件并重新启动tftpd-hpa
服务器,或者直接使用默认配置创建默认根目录并赋予权限即可:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
默认参数修改
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/mnt/shared/tftpd-hpa"
TFTP_ADDRESS="0.0.0.0:52013"
TFTP_OPTIONS="--secure -l -c"
TFTP
服务器以独立(侦听)模式运行服务器,指定侦听52013
端口上运行,服务器允许上传文件。
(三)权限
创建用户自定义目录
linux@localhost:~$ sudo mkdir -p /mnt/shared/tftpd-hpa
设置所有者和所属组为tftp
linux@localhost:~$ sudo chown tftp:tftp /mnt/shared/tftpd-hpa
设置访问目录权限
linux@localhost:~$ sudo chmod -R 755 /mnt/shared/tftpd-hpa
设置防火墙端口权限允许
linux@localhost:~$ sudo ufw allow 52013
(四)启动
服务启动
linux@localhost:~$ sudo service tftpd-hpa restart
检查服务是否启动:
linux@localhost:~$ systemctl status tftpd-hpa
● tftpd-hpa.service - LSB: HPA's tftp server
Loaded: loaded (/etc/init.d/tftpd-hpa; bad; vendor preset: enabled)
Active: active (running) since Wed 2020-11-26 00:53:13 PST; 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 3873 ExecStop=/etc/init.d/tftpd-hpa stop (code=exited, status=0/SUCCESS)
Process: 3884 ExecStart=/etc/init.d/tftpd-hpa start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/tftpd-hpa.service
└─3898 /usr/sbin/in.tftpd --listen --user tftp --address 0.0.0.0:52013 -l -c -s /home/tftpd-hpa
Nov 26 00:53:13 ubuntu systemd[1]: Stopped LSB: HPA's tftp server.
Nov 26 00:53:13 ubuntu systemd[1]: Starting LSB: HPA's tftp server...
Nov 26 00:53:13 ubuntu tftpd-hpa[3884]: * Starting HPA's tftpd in.tftpd
Nov 26 00:53:14 ubuntu tftpd-hpa[3884]: ...done.
Nov 26 00:53:14 ubuntu systemd[1]: Started LSB: HPA's tftp server.
设置开机自启动
linux@localhost:~$ sudo systemctl enable tftpd-hpa
四、测试
- 在客户端中使用
Tftp
进行上传和下载测试 - 当前服务器主机设置
Ip
地址为 :192.168.1.128
- 建议关闭客户端所有安全软件和防火墙
[ root@arm / ] # tftp
Usage: tftp [OPTIONS] HOST [PORT]
Transfer a file from/to tftp server
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file
-b SIZE Transfer blocks of SIZE octets
- 上传本地文件
[ root@arm / ] # ls -la
-rwxr-xr-x 1 root root 47328 Jan 20 2020 3G.png
[ root@arm / ] # tftp -p -l 192.168.1.128:52013 3G.png
3G.png 100% |*******************************| 47328 0:00:00 ETA
- 下载远端文件
[ root@arm / ] # tftp -g -r 192.168.1.128:52013 light.png
light.png 100% |*******************************| 20022 0:00:00 ETA
五、帮助
注意:上面测试的tftp
为开发板当中的版本,如想要在其他平台使用,则要自行查看命令或软件的帮助手册,如下:
- 查看帮助
linux@localhost:~$ tftp 192.168.1.128 52013
tftp> help
tftp-hpa 5.2
Commands may be abbreviated. Commands are
connect connect to remote tftp
mode set file transfer mode
put send file
get receive file
quit exit tftp
verbose toggle verbose mode
trace toggle packet tracing
literal toggle literal mode, ignore ':' in file name
status show current status
binary set mode to octet
ascii set mode to netascii
rexmt set per-packet transmission timeout
timeout set total retransmission timeout
? print help information
help print help information
- 上传和下载
linux@localhost:~$ tftp 192.168.1.128 52013
tftp> put 3G.png
tftp> get light.png
tftp>