《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,用于指示要传输的文件的大小,可以据此实现下载进度功能。
  • 实现了简单的权限功能,可以配置为是否可读、是否可写、是否可覆盖。
相关推荐
我不会插花弄玉3 小时前
6.传输层协议UDP【由浅入深-网络】
网络·网络协议·udp
火云代理3 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
budingxiaomoli4 小时前
Spring统一功能处理
java·后端·spring
Flynn Liang6 小时前
可观测性与成本治理:一次对话的 17 个观测点
java·langchain·可观测性·micrometer·langchain4j·token 成本·llm 监控
xbzb6 小时前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
金銀銅鐵6 小时前
带您看懂字节码指令(三):同一行加法,为什么有四种指令
java·jvm
火云代理7 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
坤坤子吖7 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
文丑颜不良啊10 小时前
LeetCode2821~2840题目解析
java·leetcode
火云代理10 小时前
Python 使用代理 IP 前,先弄清 Requests 的配置来源与验证方法
网络·python·网络协议·tcp/ip·ip