TFTP(简单文件传输协议)
是 TCP/IP 协议族中一个用于在客户端和服务器之间进行简单文件传输的协议
特点:
- 简单
- 占用资源小
- 适合传递小文件
- 适合在局域网进行传递
- 端口号为69
- 基于UDP 实现
当客户端发送 “下载” 请求时,需要向服务器的69号端口发送服务器若批准此请求,则使用一个新的,临时的端口进行数据传输
操作码 | 功能 |
1 | 读请求,即下载 |
2 | 写请求,即上传 |
3 | 表示数据包,即DATA |
4 | 确认码,即ACK |
5 | 错误 |
因为
udp
的数据包不安全,即发送方发送是否成功不能确定,所以
TFTP
协议中规定,为了让服务器知道客户端已经 接收到了刚刚发送的那个数据包,所以当客户端接收到一个数据包的时候需要向服务器进行发送确认信息,即发送 收到了,这样的包成为ACK(
应答包
)
为了标记数据已经发送完毕,所以规定,当客户端接收到的数据小于516(2字节操作码+2个字节的序号+512字节 数据)时,就意味着服务器发送完毕了,TFTP数据包的格式如下:
那既然是基于
UDP
实现的代码,那我们来看是如何实现的
服务器端代码:
# 开发者:Virtuous
# 开发版本:1.0
# 开发时间: 2022/9/21 5:41
from socket import *
s=socket(AF_INET,SOCK_DGRAM)
# 包括所有的IP 地址,里面还有一个括号:封装成一个元组
s.bind(('',69))
def server():
while True:
# 服务器等着客户端发送过来的数据,然后等着接收
recv_data,(client_ip,client_port)=s.recvfrom(1024)
print(recv_data,client_ip,client_port)
if __name__ == '__main__':
server()
TFTP客户端:
# 开发者:Virtuous
# 开发版本:1.0
# 开发时间: 2022/9/21 5:41
from socket import *
import struct #负责python数据结构和C语言的数据结构转换
file_name=input('请输入文件名字:')
#客户端的 socket
s=socket(AF_INET,SOCK_DGRAM) #两机进行通信,UDP协议
# 定义服务器地址和端口号
host_post=('172.20.10.4',69)
# 打包成一个数据包,网线网卡里传输的都是 C 里面的字节数据
# pack就是把Python 里面的数据结构转换成 C 里面的数据结构
data_package=struct.pack('!H%dsb5sb'%len(file_name),1,file_name.encode('utf-8'),0,'octet'.encode('utf-8'),0)
#file_name 不止一个字符,但不确定有多少所以用 %d 和 len()
# 把数据发送到目标服务器
s.sendto(data_package,host_post)