1、简单
2、占用资源小
3、适合传递小文件
4、适合在局域网进行传递
5、端口号为69
6、基于UDP实现
TFTP分组中并不提供用户名和口令。这是TFTP的一个特性(即"安全漏洞")。由于TFTP是设计用于系统引导进程,它不可能提供用户名和口令。
目前大多数TFTP服务器提供了一个选项来限制只能访问特定目录下的文件,这个目录中只包含无盘系统进行系统引导时所需的文件
当服务器找到需要现在的文件后,会立刻打开文件,把文件中的数据通过TFTP协议发送给客户端
<ignore_js_op>
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#coding=utf-8 2
3 #进行对应包的引用
4 from socket import *
5
6 import struct
7
8 import sys
9
10 #创建一个套接字进行网络通信
11 soc = socket ( AF_INET , SOCK_DGRAM )
12 13 #获取对应传递的ip地址参数
14 strIp = sys.argv[ 1 ]
15 16 #元组,放对应的ip地址和端口号
17 addr = ( strIp , 69 )
18 19 #参数:现在文件的名字
20 strName = sys.argv[ 2 ]
21 22 #进行组包,提交给TFTP服务
23 sendData = struct.pack ( "!H" + str ( len ( strName ) ) + "sb5sb" , 1 , strName , 0 , "octet" , 0 )
24 25 #数据的发送
26 soc.sendto ( sendData , addr )
27 28 #初始化文件管理对象
29 fil = ''
30 31 #下载后的文件重命名
32 filName = sys.argv[ 2 ]
33 34 while True :
35 #接受服务器的相应数据(内容,(ip,端口))
36 recvData , recvAddr = soc.recvfrom ( 1024 )
37 38 #对接受的数据进行处理
39 opkey = struct.unpack ( "!HH" , recvData[ : 4 ] )
40 41 print ( opkey )
42 43 #变量存储序号
44 pNum = opkey[ 1 ]
45 46 #3判断,从服务器上下载的数据
47 if opkey[ 0 ] = = 3 :
48 #第一次数据传递时,进行对应的文件的创建
49 if pNum = = 1 :
50 fil = open ( filName , "w" )
51 #数据的写入
52 fil. write ( recvData[ 4 : ] )
53 54 if len ( recvData ) < 516 :
55 56 fil. close ( )
57 print ( "下载完成!" )
58 break
59 60 #5判断,TFTP服务器出现错误
61 if opkey[ 0 ] = = 5 :
62 print ( "运行错误!" )
63 break
64 65 #组包
66 ackData = struct.pack ( "!HH" , 4 , pNum )
67 68 soc.sendto ( ackData , recvAddr )
69 soc. close ( )
|