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

文章目录

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

1 书籍概况

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

2 核心工具与技能

2.1 协议分析工具

  • RFC文档

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 Server的实现涉及以下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通信类:

java 复制代码
DatagramSocket  // 套接字
DatagramPacket  // 数据包

TFTP包的结构如下

TFTP包的实现

ACK代码片断

块号与字节的转换

说明:

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

4 小结

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

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

功能特性如下:

  • 可传输大于32M的文件。
  • 支持协商选项blksize。用于配置每次传输多少字节,当块大小为8192B时,会比512B要快16倍。
  • 支持协商选项timeout,用于配置丢包时重试等待的时间。当网络状态良好时,timeout可以配置得低一些,这样传输会快一些。
  • 支持协商选项tsize,用于指示要传输的文件的大小,可以据此实现下载进度功能。
  • 实现了简单的权限功能,可以配置为是否可读、是否可写、是否可覆盖。
相关推荐
lsnm6 分钟前
【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信
linux·网络·c++·网络协议·ubuntu·udp·centos
wanhengidc21 分钟前
对于网站业务安全SCDN都能够从哪些方面进行保护?
网络·安全
剁椒豆腐脑31 分钟前
阶段二JavaSE进阶阶段之设计模式&继承 2.2
java·设计模式·跳槽·学习方法·改行学it
扫地僧9851 小时前
免费1000套编程教学视频资料视频(涉及Java、python、C C++、R语言、PHP C# HTML GO)
java·c++·音视频
青春:一叶知秋1 小时前
【C++开发】CMake构建工具
java·开发语言·c++
77tian1 小时前
Java Collections工具类:高效集合操作
java·开发语言·windows·microsoft·list
2401_826097621 小时前
JavaEE-Mybatis初阶
java·java-ee·mybatis
等等5431 小时前
Java EE初阶——网络编程
网络
KIDAKN1 小时前
JavaEE->多线程2
java·算法·java-ee
wu_android1 小时前
Java匿名内部类访问全局变量和局部变量的注意事项
java·开发语言