欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 《TCP/IP详解 卷1》读书心得及基于RFC手撮一个TFTP Server

《TCP/IP详解 卷1》读书心得及基于RFC手撮一个TFTP Server

2025/6/21 13:26:20 来源:https://blog.csdn.net/muyun2800/article/details/148789000  浏览:    关键词:《TCP/IP详解 卷1》读书心得及基于RFC手撮一个TFTP Server

文章目录

    • 1 书籍概况
    • 2 核心工具与技能
      • 2.1 协议分析工具
      • 2.2 Java网络编程
    • 3 实践案例:TFTP服务器开发
      • 3.1 需求背景
      • 3.2 协议要点
      • 3.3 Java实现
    • 4 小结

1 书籍概况

  • 书籍版本:第2版(建议与旧版对照阅读)
    9-1
  • 适用人群
    • 网络应用开发者
    • 系统管理员
    • 频繁使用TCP/IP应用的用户

2 核心工具与技能

2.1 协议分析工具

  • RFC文档
    • 标准协议来源(如HTTP1.1对应RFC2616)
    • 查询站点:www.faqs.org/rfcs
      9-2

RFC2616(HTTP协议)的内容:

9-3

  • Wireshark
    • 抓包必备工具,依赖 WinPcap 驱动
    • Windows版通过 WinPcap 实现抓包功能
      以下是wireshark的截图:
      9-4
      以下是 WinPcap 的安装界面
      9-5

以下是wireshark的入门书籍:
9-6

2.2 Java网络编程

工具列表

分类类库功能
传输层以上Java Socket API / NIO、Mina、Netty封装了TCP和UDP包的细节,提供高层网络通信接口。
传输层及以下JPCap直接操纵TCP、UDP、ICMP、IP等底层协议数据包。

JPCap库
Jpcap主要用于捕获、发送网络数据包。它提供以下功能:

  • 捕获末加工的原始数据包。
  • 保存捕获到的数据包到本地文件,从本地文件读出先前捕获的数据包。
  • 自动分辨数据包的类型并产生相应的Java类(如:Ethenet、IPv4、IPv6、ARP/RARP、TCP、UDP和ICMP包)。
  • 根据用户在程序代码中指定的过滤规则过滤数据包。
  • 向网络发送各种数型的数据包

JPCap库可用于开发以下几种应用

  • 网络以及协议的分析器:类似于 Wireshark
  • 网络监听器
  • 网络流量记录器
  • 网络流量发生器
  • 用户级的网桥、路由
  • 网络入侵检测系统
  • 网络扫描器
  • 网络安全工具箱

JPCap库注意事项

  • 需安装WinPcap
  • 需匹配JRE位数(32/64位)
  • 注意命名空间差异(jpcap vs net.sourceforge)

3 实践案例:TFTP服务器开发

3.1 需求背景

  • 设备升级工具需集成TFTP Server服务
  • 现有Java库缺陷:
    • 不支持选项协商(默认512字节/包)
    • 文件传输限制32MB

3.2 协议要点

TFTP Server的实现涉及以下4个主要的协议:

RFC编号描述代替选项
RFC1350基础协议783-
RFC2347option extension1782选项应答OACK
RFC2348block size option1783blksize
RFC2349Timeout Interval and Transfer Size Options1784timeout、tsize

核心RFC协议

  • RFC1350(基础协议),如下图所示:
    9-7

  • RFC2347(选项协商),如下图所示:
    9-8

抓包
为了对这些协议有一个感性的认识,我们构建一个场景来
运行一个c版的tftp服务端:tftpd32.exe,客户端使用tftp来下载一个文件:tftp -i 10.18.75.97 get session.log, 然后使用Wireshark进行抓包,如下:

  • 列表
    9-10

  • RRQ包:
    9-11

  • OACK包
    9-12

  • ACK包
    9-13

  • DATA包
    9-14

  • ACK包
    9-15

关键包类型总结

  • RRQ(读请求)。由客户端发起,里面包含了文件名,文件大小,文件类型等信息
  • OACK(选项确认)。由服务端发起,表示收到这个文件读求。
  • DATA(数据包)。下载时由服务端发起,上传时由客户端发起。
  • ACK(确认包)。客户端/服务端在收到数据包后确认。

3.3 Java实现

因为TFTP是使用UDP来传输的,这里直接使用socket api。
主要用到JDK中的2个UDP通信类:

DatagramSocket  // 套接字
DatagramPacket  // 数据包

TFTP包的结构如下
9-20

TFTP包的实现
9-21

ACK代码片断
9-23

块号与字节的转换
9-24
说明:

  • 块编号:0-65535。用2个字节来表示大端小端顺序。
  • 网络字节序列:大端。高位在前,低位在后。Java:小端。低位在前,高位在后。

4 小结

前文的TFTP实现主要偏原理的介绍,不能用于生产环境。作者开发了一个可用于生产环境的TFTP Server,基于netty实现,已托管在github上,参见: netty-tftp

此项目严格遵守以下rfc规范:

  • https://tools.ietf.org/html/rfc1350
  • https://tools.ietf.org/html/rfc2347
  • https://tools.ietf.org/html/rfc2348
  • https://tools.ietf.org/html/rfc2349

功能特性如下:

  • 可传输大于32M的文件。
  • 支持协商选项blksize。用于配置每次传输多少字节,当块大小为8192B时,会比512B要快16倍。
  • 支持协商选项timeout,用于配置丢包时重试等待的时间。当网络状态良好时,timeout可以配置得低一些,这样传输会快一些。
  • 支持协商选项tsize,用于指示要传输的文件的大小,可以据此实现下载进度功能。
  • 实现了简单的权限功能,可以配置为是否可读、是否可写、是否可覆盖。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词