笔试时,有一道题目,tftp的端口号是多少。这个以前没有接触过,就随便写了个端口。tftp全称是Trivial File Transfer Protocol,简单文件传输协议,比ftp还要简单,没有认证机制,它使用UDP协议,端口号是69。
我用IPOP开启了tftp服务器,使用wireshark抓包时,发现只有客户端发给服务器的tftp包,比如读请求,然后收到块后的确认,却没有收到服务器发来的数据包,倒是看到了服务器发给tftp客户端的ICMP包,我没有使用ping命令,却产生了ICMP报文,展开ICMP包,发现里面还有几层,IP层,UDP,然后是tftp数据,这些数据是服务器发给客户端的,它每个块的大小都是512字节,最后一个块会小于512字节,因此可以判断传输文件的结束。
tftp有两种操作,WRQ和RRQ,分别是请求写入远程系统和请求读取远程系统。和ftp类似,它并不通过69端口传递数据,而是协商端口。ftp通过端口20传递数据。
tftp使用UDP协议传输数据,而且每传送完一个数据块,都要等待对方发送确认数据包,如果确认数据包丢失,或者携带数据块的包丢失,就需要重传数据包,因此tftp协议效率不高,另外,tftp协议类似TCP协议的停止-等待协议,每发一个包,就要进行确认,这也是效率不高的主要原因之一。
如果没有条件搭建测试环境,在wiki.wireshark.org上,可以下载tftp数据包,查看相关的协议字段。
比如下面的截图,1号数据包:客户端192.168.0.1向服务器发出WRQ请求。UDP内容包括,opcode字段,目标文件名字和传输模式。
2号数据包是服务器发出的确认包,但确认号是0,说明服务器还没有收到数据,但它使用的源端口2087会作为接收数据的端口,一会儿客户端就会向该端口发送数据。
再来看3号数据包,刚才服务器用2087端口来向客户端发送了确认数据包,这时,客户端就知道向服务器的哪个端口传送数据了,客户端每次传送512字节的数据,然后等待服务器返回的确认包,再传送剩余的数据。
这个过程一直持续,直到客户端传送最后一个数据包,最后一个数据包携带的数据一定小于512,我们看到99号数据包只有23个字节。如果文件大小正好是512字节的整数倍呢,这个我还没实验过,猜测会发送一个0字节大小的数据包。可以看到last字样,因为数据大小小于512字节。
100号数据包是对99号数据包的确认。我们可以看到一共有49个块数据,最后一个块数据的大小是23字节,所以文件大小一共是48*512+23字节。
也可以分析读远程请求的数据包,使用同样的方式。
-------------------------------------------
9-17
tftp的报文格式如下:
2 bytes string 1 byte string 1 byte
------------------------------------------------
| Opcode | Filename | 0 | Mode | 0 |
------------------------------------------------
Opcode占2个字节,Opcode的取值范围是1-5,分别代表5种操作。如下:
1 读请求
2 写请求
3 数据
4 确认包
5 错误包
每种操作都有自己的格式,不难猜出,读请求和写请求的格式是相同的。