文章目录
- 1 书籍概况
- 2 核心工具与技能
- 2.1 协议分析工具
- 2.2 Java网络编程
- 3 实践案例:TFTP服务器开发
- 3.1 需求背景
- 3.2 协议要点
- 3.3 Java实现
- 4 小结
1 书籍概况
- 书籍版本:第2版(建议与旧版对照阅读)
- 适用人群:
- 网络应用开发者
- 系统管理员
- 频繁使用TCP/IP应用的用户
2 核心工具与技能
2.1 协议分析工具
- RFC文档
- 标准协议来源(如HTTP1.1对应RFC2616)
- 查询站点:www.faqs.org/rfcs
RFC2616(HTTP协议)的内容:
- Wireshark
- 抓包必备工具,依赖
WinPcap
驱动 - Windows版通过
WinPcap
实现抓包功能
以下是wireshark的截图:
以下是WinPcap
的安装界面
- 抓包必备工具,依赖
以下是wireshark的入门书籍:
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 Serve
r的实现涉及以下4个主要的协议:
RFC编号 | 描述 | 代替 | 选项 |
---|---|---|---|
RFC1350 | 基础协议 | 783 | - |
RFC2347 | option extension | 1782 | 选项应答OACK |
RFC2348 | block size option | 1783 | blksize |
RFC2349 | Timeout Interval and Transfer Size Options | 1784 | timeout、tsize |
核心RFC协议:
-
RFC1350(基础协议),如下图所示:
-
RFC2347(选项协商),如下图所示:
抓包
为了对这些协议有一个感性的认识,我们构建一个场景来
运行一个c版的tftp服务端:tftpd32.exe
,客户端使用tftp
来下载一个文件:tftp -i 10.18.75.97 get session.log
, 然后使用Wireshark进行抓包,如下:
-
列表
-
RRQ包:
-
OACK包
-
ACK包
-
DATA包
-
ACK包
关键包类型总结:
- RRQ(读请求)。由客户端发起,里面包含了文件名,文件大小,文件类型等信息
- OACK(选项确认)。由服务端发起,表示收到这个文件读求。
- DATA(数据包)。下载时由服务端发起,上传时由客户端发起。
- ACK(确认包)。客户端/服务端在收到数据包后确认。
3.3 Java实现
因为TFTP是使用UDP来传输的,这里直接使用socket api。
主要用到JDK中的2个UDP通信类:
DatagramSocket // 套接字
DatagramPacket // 数据包
TFTP包的结构如下:
TFTP包的实现
ACK代码片断
块号与字节的转换
说明:
- 块编号: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,用于指示要传输的文件的大小,可以据此实现下载进度功能。
- 实现了简单的权限功能,可以配置为是否可读、是否可写、是否可覆盖。