PXE 技术:TFTP 协议篇

354 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

一、什么是 TFTP 协议 ?

  • 1. 概述
    • TFTP,又称普通文件传输协议。是一种基于 C/S 架构模式,简单的锁步(Lockstep)文件传输协议。
    • 允许客户端从远程服务器下载文件,或者上传文件给远程服务器。
    • 用途,一般用于服务器从LAN(局域网)启动的早期阶段。
    • 协议及端口号是,UDP/69 。
  • 2. 使用场景
    • 通过网络进行引导和启动系统(无盘工作站,如网吧)
    • 通过网络进行 PXE 装机(下载引导程序、以及内核文件等)

二、为什么要使用 TFTP 协议 ?

  • 两点原因:
    1. 网络引导过程,由两阶段组成:
      • 一个阶段是通过 DHCP 为主机提供IP及其他参数信息
      • 二个阶段是主机需要通过网络传输方式下载引导程序及内核相关软件。
    2. 由于网卡 ROM 大小的限制,TFTP 协议使用 UDP 协议及锁步模式,这使得程序代码实现简单,内存占用小,从而使 ROM 中的 TFTP 客户端程序也占用较小。

三、TFTP 协议是如何工作的 ?

  • 传输流程三个阶段简述
    1. 初始连接:TFTP 客户端向服务端发送初始请求来建立连接,服务端响应客户端并打开连接。
      • TFTP 客户端使用一个随机端口向服务端 69 端口发送读请求(RRQ)或者写请求(WRQ)。
      • 服务端接收请求后,也要生成并使用一个随机端口而非69进行回复确认(ACK)。
        • 目的:
          • 能够支持多个 TFTP 客户端与服务端进行通信。
          • 通过源端口与目的端口标识数据包,减少包头大小,增加实际数据量。
    2. 数据传输:建连后,客户端与服务端进行数据交互,一方发送数据,另一方发送确认。
      • 此时,TFTP 客户端与服务端都是通过双方的随机端口进行锁步形式的数据交互。
    3. 连接终止:当包含数据的最后一个 TFTP 消息已发送并得到确认后,连接将被终止。
      • 数据传输过程中,当接收数据方收到 0-511字节数据包时,则表明数据传输结束。
  • Lockstep(锁步)
    • 一种客户端与服务器的通信方式,由于 UDP 不可靠,此方式有利于保证 TFTP 的重传机制。即,两个角色在初始交互后,会以”锁步“的方式进行数据和信息的交互。也就是,一个设备发送数据消息后等待确认,另一个发送确认后等待数据消息。但这种方式也带来一个缺点,传输效率低
    • 参考资料:TFTP General Operation, Connection Establishment and Client/Server Communication
  • TFTP 读写请求示意图
    • TFTP读写请求示意图.png
  • 参考资料

四、如何使用 TFTP 协议 ?

  • TFTP 相关应用
    • Tftpd
  • 使用方法
    • 安装:
      • CentOS:yum -y install tftp-server xinetd
        • tftp 依赖于 xinetd 服务
      • Ubuntu:apt-get install tftpd-hpa
    • 配置:
    # CentOS
    $ vim /etc/xinetd.d/tftp
    service tftp 
    { 
    	socket_type 	= dgram 
    	protocol 		= udp 
    	wait 			= yes 
    	user 			= root 
    	server 			= /usr/sbin/in.tftpd 
    	server_args 	= -s /var/lib/tftpboot 
    	disable 		= no #默认为yes,这里我们将其更改为no 
    	per_source 		= 11 
    	cps 			= 100 2 
    	flags 			= IPv4 
    }
    $ systemctl restart xinetd
    
    # Ubuntu
    $ vim /etc/default/tftpd-hpa
    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/var/lib/tftpboot"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="-l -c -s"
    
    #-c: Allow new files to be created
    #-s: Change  root  directory  on startup.
    #-l:  Run the server in standalone (listen) mode, rather than run from inetd.
    $ systemctl restart tftpd-hpa
    

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情