TFTP协议解析及C/C++代码实现
TFTP 用于以非常简单的方式传输文件。与其他文件传输协议(如:FTP 或 HTTP)相比,TFTP 更简单,代码量也更小,因此更易于实现。
通常,TFTP 使用 UDP 作为其传输协议。众所周知的 TFTP 流量 UDP 端口是 69。
什么是 TFTP? (普通文件传输协议)
普通文件传输协议是一种在网络设备之间传输文件的技术,是更强大的文件传输协议的简化版本。 TFTP 是在 1970 年代为缺乏足够内存或磁盘空间以提供完整 FTP 支持的计算机开发的。
与 FTP 一样,TFTP 使用客户端和服务器软件在两个设备之间建立连接。 从 TFTP 客户端,可以将单个文件上传到服务器或从服务器下载。 服务器托管文件,客户端请求或发送文件。
TFTP 协议如何工作?
要启动传输过程,主要要求是服务器形成连接,以便它可以读取或写入要传输的文件。一旦建立连接,发送文件的过程就开始了。这些文件以 512 字节的固定长度块的小数据包传输。
这些数据包进一步分为块,每个包由一个块组成。
一旦发送了一个数据包,它需要在发送另一个数据包之前由确认包确认。
现在要完全传输并得到确认,数据包至少应为 512 字节。如果数据包的大小小于 512 字节,则导致数据包终止。反过来,这会导致传输过程超时,发送方必须重新传输数据包。
该过程中涉及的两台机器都被视为发送者和接收者。这是因为当一个发送数据并接收确认时,另一个发送确认并接受数据。
TFTP 存在的安全隐患
由于 TFTP 是为简单易用而设计的,因此通常用于保护数据的任何机制都没有在其协议中实现。
这导致了许多安全问题。因为所有 TFTP 数据包都是通过网络以明文形式发送的,没有数据加密。
任何在与 TFTP 会话相同的网段上捕获网络流量的人都可以轻松收集传输的数据并重新创建原始文件。
如果文件包含敏感数据,例如用户名和密码,那么任何捕获流量的人都可以轻松使用它。
TFTP 三种传输模式
目前支持三种传输方式:
1、 netascii
2、octet
3、mail
支持三种不同的传输模式:“netascii”,“octet"和"mail”,前两种符合FTP协议中的"ASCII"和"image(binary)"模式;第三种从来很少使用,当前已经废弃。
TFTP 协议格式
TFTP共定义了五种类型的包格式,格式的区分由包数据前两个字节的Opcode字段区分,分别是:
读文件请求包:Read request,简写为RRQ,对应Opcode字段值为1
写文件请求包:Write requst,简写为WRQ,对应Opcode字段值为2
文件数据包:Data,简写为DATA,对应Opcode字段值为3
回应包:Acknowledgement,简写为ACK,对应Opcode字段值为4
错误信息包:Error,简写为ERROR,对应Opcode字段值为5
Opcode字段区分:
#define RRQ 01/* read request */
#define WRQ 02/* write request */
#define DATA 03/* data packet */
#define ACK 04/* acknowledgement */
#define ERROR 05/* error code */
- 读/写请求包
1.操作码(2字节),它用来表示当前数据包的类型(取值1表示该数据包是个读请求,2表示该数据包是写请求);
2.可变长字段,它用来表示要读取或上传的文件名,它使用ASCII码并以0表示结尾;
3.Mode,也是可变长字段,用来表示传输文件的数据类型,如果传输的是字符串文件,那么它填写字符串”netascii”,如果传输的是二进制文件,那么它填写字符串”octet”,这些字符串都以0结尾。
RRQ 和 WRQ 数据包(分别为操作码 1 和 2)具有以下格式
文件名是netascii中的字节序列以零字节终止。 模式字段包含字符串“netascii”、“octet”或“mail”
- 数据包格式
数据实际上以数据包的形式传输。
数据包(操作码 = 3)具有块号和数据字段。 块数据包上的数字从 1 开始,每增加一个新的数据块。 此限制允许程序使用单个区分新数据包和重复数据包的编号。 数据字段长度为 0 到 512 个字节。 如果它是 512 字节长,则block 不是最后一个数据块; 如果它是从零到 511 字节长,它表示传输结束。
传输数据块的DATA数据包,它头2字节也是操作码,取值3用于表示数据包用于数据块传输,接下来的2字节用于表示数据块编号,最后是可变长字段Data,用于装载数据块。
- ACK包
ACK 数据包由 DATA 或 ERROR 数据包确认。ACK包(Acknowledgement)用于确认数据包已收到,和接收到的数据包数据块号相同。ACK包的操作码为4。
当接收方收到一个数据包后,会向发送方发送一个ACK包;而发送方则会在收到一个ACK包后继续发送下一个包。若发送完未能收到ACK包,则会使用超时机制,重新发送刚才的数据包。
- 错误包
错误ERROR数据包,它开始的2字节表示操作码,取值5;接下来2字节表示错误码;最后的是可变长字段,它用字符串的形式描述具体错误。
TFTP协议解析及C/C++代码实现
static bool dissect_embeddedtftp_heur(u_char *tvb, packet_info *pinfo)
{conversation_t *conversation;unsigned short opcode;if (tvb_captured_length(tvb) < MIN_HDR_LEN)return FALSE;opcode = tvb_get_ntohs(tvb, 0);switch (opcode) {case TFTP_RRQ:case TFTP_WRQ:if (!is_valid_requerest_body(tvb))return FALSE;case TFTP_DATA:case TFTP_ACK:case TFTP_OACK:case TFTP_INFO:break;case TFTP_ERROR:switch (tvb_get_ntohs(tvb, 2)) {case TFTP_ERR_NOT_DEF:case TFTP_ERR_NOT_FOUND:case TFTP_ERR_NOT_ALLOWED:case TFTP_ERR_DISK_FULL:case TFTP_ERR_BAD_OP:case TFTP_ERR_BAD_ID:case TFTP_ERR_EXISTS:case TFTP_ERR_NO_USER:case TFTP_ERR_OPT_FAIL:break;default:return FALSE;}break;default:return FALSE;}dissect_tftp_message(tftp_info_for_conversation(conversation), tvb, pinfo);return TRUE;
}static void dissect_tftp_message(tftp_conv_info_t *tftp_info,u_char *tvb, packet_info *pinfo,)
{switch (opcode) {case TFTP_RRQ:...break;case TFTP_WRQ:...break;case TFTP_INFO:...break;case TFTP_DATA:...break;case TFTP_ACK:...break;case TFTP_ERROR:...break;case TFTP_OACK:...break;default:...break;}...
}
...
运行结果:
FTP 与 TFTP 协议
尽管这两种协议都用于将文件从一台计算机传输到另一台计算机,但它们之间仍然存在一些显着差异。 一些变化点如下:
1、FTP 使用 TCP(传输控制协议),而 TFTP 使用 UDP(用户数据报协议)。
2、FTP 协议适用于两个端口,即。 20 和 21,而 TFTP 协议在单个端口(69)上工作。
3、与 TFTP 协议相比,FTP 协议非常复杂。
4、FTP 协议提供了许多消息,而 TFTP 协议只有五个消息。
总结
TFTP 是一种非常有用的技术,用于服务器和客户端之间的文件通信。它可以轻松使用,因为它需要更少的编码,更少的内存使用,并且由于不需要身份验证和安全机制,因此可以轻松使用。
参考:RFC1350
欢迎关注微信公众号【程序猿编码】,需要 TFTP协议解析完整源码 的添加本人微信号(c17865354792)
TFTP协议解析及C/C++代码实现相关推荐
- MongoDB数据库协议解析及C/C++代码实现
MongoDB 是由 MongoDB Inc 开发的 NoSQL 数据库,它是无模式的.它是使用 c++ 和 javascript 设计和创建的,允许更高的连接性. MongoDB 是一个 NoSQL ...
- Oracle(TNS)协议解析及C/C++代码解析
Oracle客户端和服务器使用TNS作为其数据交换协议. 它提供了一种对用户透明的层, 为不同的工业标准协议提供统一, 通用的接口. 基本上是TNS以这样的方式指定了端口1521上的会话是" ...
- UDT协议解析及C/C++代码实现
基于 UDP 的协议 (UDT) 是一种高性能数据传输协议.用于广域高速网络上的分布式数据密集型应用程序. UDT 使用 UDP 传输具有自己的可靠性控制和拥塞控制机制的批量数据. 新协议可以以比 T ...
- MySQL协议解析及C/C++代码实现
MySQL 常用于许多知名网站,包括 Facebook.Google.Twitter 和 YouTube等等.它于 1995 年首次发布.MySQL 是用 C 和 C++ 编写的. MySQL 适用于 ...
- SMTP协议解析及C/C++代码实现
SMTP 是一种应用层协议. 要发送邮件的客户端打开到 SMTP 服务器的 TCP 连接,然后通过该连接发送邮件. SMTP 服务器是一种永远在线的侦听模式. 一旦它侦听来自任何客户端的 TCP 连接 ...
- 英雄远征Erlang源码分析(5)-协议解析与玩家登录处理
现在,客户端与服务器的连接算是正式建立了,此时用户需要做的第一件事就是登陆.不过在登录之前,我们要先研究下前后端通信的协议. 客户端与服务端建立连接后,通过提前制定好的协议进行交互.具体的协议文档在d ...
- tftp 源代码解析
我先研究udp 传输的机制,tftp是用udp 设计的一个不错应用. 在网上查找tftp 源代码,发现 https://github.com/ideawu/tftpx 上的源码比较好看,这个只是lin ...
- LinuxC语言简单实现客户端使用TFTP协议文件下载-网络编程-应用层
目录 编写客户端,使用TFTP协议,完成文件下载的功能. 1.安装tftpd32 2.TFTP协议 3.打开服务器tftpd32 4.客户端 代码实现 执行结果 注意 6.非原创 编写客户端,使用TF ...
- RAW 原始套接字 TCP UDP协议解析
前言 公司的项目终于告一段落了,终于有时间了 - - leetcode 终于又可以 提上日程了 rust 驱动开发,也可以继续做了 kernel的驱动开发,也得继续进行了 驱动框架我又回来了 RFC ...
最新文章
- deepLink iOS 应用到自己APP 记录
- vue2.0 配置 选项 属性 方法 事件 ——速查
- 第十三周学习进度情况
- 七周三次课(11月29日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法...
- alsa 测试 linux_Linux低延迟服务器系统调优
- MYSQL优化---hidba
- System类的常用方法
- ArcGIS Engine 10.2开发环境搭建
- linux 秒数转时间格式,通过delphi将秒数转换成日期格式
- pyhive 连接 Hive 时错误
- 设计思路工作笔记-使用当天时间戳的差值读取实时数据绕过错误数据
- ROS queue_size和buff_size设置
- session和token的区别
- Toeplitz matrix 与 Circulant matrix
- Qt 定制字体选择 QFontComBobox
- 营业执照编码验证规则(15位和18位)
- 爱的魔力转圈圈-流水灯电路原理详解-PCB系列教程4-1
- 密码学总结(一) 数学常识
- C#招行支付流程(一网通支付-PC扫码支付)
- 微信开发总结1——关于微信企业号API,Auth验证