网络编程——TFTP(上)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星梦∞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值