最好的分析协议方法,不是文字,而是协议分析软件,将它完整无缺展现在读者面前,读者就会豁然开朗。噢,原来是这样。。。

为了回答这个问题,作者做了一个小实验。用TFTP传输了一个小文件,并用wireshark记录下整个过程,下图为捕获报文的截屏图片:

TFTP是Trivial File Transfer Protocol的缩写,简单文件传输协议,使用UDP协议传输,服务器端在UDP 端口69侦听客户端请求。

众所周知,UDP协议是一个无状态协议,一个不可靠协议。而文件传输却不允许有任何差错,需要可靠传输。既然UDP是指望不上了,那就让TFTP协议承担起所有可靠传输的任务吧。

曾经写过一篇文章,TCP的可靠传输的精髓是,发送方对发送的数据进行编号,接收方对接收到的编号进行确认。

TFTP拜了TCP为师,师傅,请多多指教! 很快TFTP学会了这个简单的套路“编号、确认”。

捕获的报文一共10个报文,大体可以描述为:

发送方:“编号0已发送”

接收方:“编号0已确认”

发送方:“编号1已发送”

接收方:“编号1已确认”

发送方:“编号2已发送”

接收方:“编号2已确认”

发送方:“编号3已发送”

接收方:“编号3已确认”

发送方:“编号4已发送”

接收方:“编号4已确认”

如果任何一个编号在超时时间内,没有得到对方的确认,将会启动重传。重传这一招也是从TCP那儿学到的。

通过以上机制,可以将实现可靠的文件传输,无论怎样,只要中间没有坏人篡改文件,接收到的文件应该和发送的文件一摸一样。

数据完整性(Integrity)

通过抓包可以清晰地看出,TFTP协议是明文传输,如果TFTP在传输过程中被恶意篡改,接收方知道是否有人篡改过吗? 不知道!

为了确保文件没有被篡改,可以通过离线的方式,接收方事先知道文件的MD5值,然后对接收到的文件也做一次MD5,如果两个MD5值相同则校验成功,文件是完整的,否则文件无效!

那是否能把MD5值附在文件的末尾一起传输?

不可以,因为坏人能篡改文件,同样也能篡改MD5值。

接下来呈上两幅图片:

发送方:“编号0已发送”的截图

注意这里,请求报文的源端口 = 63394,目的端口 = 69

接收方:“编号0已确认”的截图

令人惊奇的是,回复报文的源端口竟然不是69,而是62018。

更令人大跌眼镜的是,双方竟然能够通信好好的!!!

要我说这不能怪同学们,TCP连接的概念已经深入人心。如果换作TCP,客户端使用69端口号访问服务器,服务器必须使用69端口来响应,不是吗?因为一个TCP连接时是依靠四元组来决定的。

而UDP却不是连接,所以被动响应方可以选择自己的端口号来响应,而不一定使用侦听(listen)端口号。

写到这里,读者应该理解为何很多NAT打洞的软件,会选择UDP,而不会选择TCP的原因了吧?

返程UDP报文的源端口号可能已经不等于去向UDP报文的目的端口号,为了保证返程UDP报文的顺利通过NAT,NAT设备必须放松限制,在这个例子里可以表达为:

(10.1.1.2,63394,10.1.1.1,*)

表示为允许来自10.1.1.1任何端口的通行。还有更宽松的:

(10.1.1.2,63394,*,*)

后面的两个*表示为,任何主机IP、任何端口号都可以通行。

而TCP实现却是这样的:

(10.1.1.2,63394,10.1.1.1,69)

很显然使用62018端口是无法通过NAT设备的。

更多内容,请参考文章:UDP又不关心丢包,TFTP是怎么保证数据完整性的呢?​mp.weixin.qq.com

python udp 丢包_TFTP 使用不关心丢包的 UDP 传输,它是怎么保证数据的完整性的?...相关推荐

  1. python的包文件叫什么_python之包和文件目录规范

    一.什么是包 包就是一个包含有__init__.py文件的文件夹 二.为何要有包 包的本质是模块的模块的一种形式,包是用来被当做模块导入 1.产生一个名称空间 2.运行包下的__init__.py文件 ...

  2. 数据丢包怎么修复_网络丢包率如何解决

    网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...

  3. Python网络编程-一文厘清socket、TCP和UDP那点事

    文章目录 网络基础 网络协议 IP地址与端口 socket套接字 概念 Python中socket模块 TCP下的服务器与客户端 TCP工作原理 TCP服务器的实现 TCP客户端的实现 UDP下的服务 ...

  4. python操作mysql数据库依赖包_python安装mysql的依赖包mysql-python操作

    一般情况下,使用pip命令安装即可: [root@dthost27 ~]# pip install mysql-python 但是在实际工作环境中,往往会安装失败,这是因为系统缺少mysql的相关依赖 ...

  5. python导入包相当于什么_Python 引入包的两种方式区别

    原博文 2014-05-16 11:18 − 1.import XXX仅仅是告诉我们需要使用这个包,但是你真正使用的时候,需要完整的导入这个包的全路径 比如: import wechat.views ...

  6. Py之matplotlib:python包之matplotlib库图表绘制包的简介、安装、使用方法(matplotlib颜色大全)详细攻略

    Py之matplotlib:python包之matplotlib库图表绘制包的简介.安装.使用方法(matplotlib颜色大全)详细攻略 目录 matplotlib简介 matplotlib安装 m ...

  7. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)

    python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...

  8. python解包操作_Python编程使用*解包和itertools.product()求笛卡尔积的方法

    本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法.分享给大家供大家参考,具体如下: [问题] 目前有一字符串s = "['a', 'b'],[ ...

  9. python模块和类_Python类、模块、包的区别

    类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...

最新文章

  1. 在Ubuntu 16.04.3 LTS上运行go install出错的问题
  2. tcc分布式事务_什么是 TCC分布式事务?
  3. springmvc 音频流输出_音频管理模块AudioDeviceModule解读
  4. 团队-爬虫豆瓣top250项目-项目进度
  5. python matplotlib.pyplot.scatter() 中的cmap参数是什么意思?
  6. QT的QPicture类的使用
  7. 关于无线的Idle Timeout和Session Timeout
  8. boot gwt_带Spring Boot的GWT
  9. python之Map函数
  10. 用了python之后笔记本卡了_应用
  11. arduino COM口被占用问题解决
  12. 创业公司如何做到零成本实现用户快速增长
  13. linux内存管理初始化
  14. 利用python脚本监控Tomcat服务器
  15. 洛谷·[HNOI2015]落忆枫音
  16. exlc表格怎么换行_在Excel中如何换行?Excel表格换行快捷键是什么?
  17. 经纬度转GeoHash
  18. UI设计 ,我只推荐这6个网站,真的太好用了。
  19. 微信公众号开发 - token获取(保证同一时间段内只请求一次)
  20. matlab中nabisect函数,数值分析在MATLAB中的实现(M函数文件)

热门文章

  1. tinymce富文本实现可编辑和不可编辑状态
  2. Android 放图片背景的时钟
  3. 424 B. Megacity
  4. 2021年资料员-通用基础(资料员)试题及解析及资料员-通用基础(资料员)复审考试
  5. python的格式化输入_一看就懂的Python输入和输出、格式化字符串方法
  6. 字节_signature完整算法分析以及实现!(混淆vm版本)
  7. html5捕鱼达人游戏
  8. Unity3D游戏开发之Lua与游戏的不解之缘(上)
  9. java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)
  10. 用计算机弹出娃娃脸,在windows xp中释放隐藏网速