python udp 丢包_TFTP 使用不关心丢包的 UDP 传输,它是怎么保证数据的完整性的?...
最好的分析协议方法,不是文字,而是协议分析软件,将它完整无缺展现在读者面前,读者就会豁然开朗。噢,原来是这样。。。
为了回答这个问题,作者做了一个小实验。用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 传输,它是怎么保证数据的完整性的?...相关推荐
- python的包文件叫什么_python之包和文件目录规范
一.什么是包 包就是一个包含有__init__.py文件的文件夹 二.为何要有包 包的本质是模块的模块的一种形式,包是用来被当做模块导入 1.产生一个名称空间 2.运行包下的__init__.py文件 ...
- 数据丢包怎么修复_网络丢包率如何解决
网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...
- Python网络编程-一文厘清socket、TCP和UDP那点事
文章目录 网络基础 网络协议 IP地址与端口 socket套接字 概念 Python中socket模块 TCP下的服务器与客户端 TCP工作原理 TCP服务器的实现 TCP客户端的实现 UDP下的服务 ...
- python操作mysql数据库依赖包_python安装mysql的依赖包mysql-python操作
一般情况下,使用pip命令安装即可: [root@dthost27 ~]# pip install mysql-python 但是在实际工作环境中,往往会安装失败,这是因为系统缺少mysql的相关依赖 ...
- python导入包相当于什么_Python 引入包的两种方式区别
原博文 2014-05-16 11:18 − 1.import XXX仅仅是告诉我们需要使用这个包,但是你真正使用的时候,需要完整的导入这个包的全路径 比如: import wechat.views ...
- Py之matplotlib:python包之matplotlib库图表绘制包的简介、安装、使用方法(matplotlib颜色大全)详细攻略
Py之matplotlib:python包之matplotlib库图表绘制包的简介.安装.使用方法(matplotlib颜色大全)详细攻略 目录 matplotlib简介 matplotlib安装 m ...
- python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)
python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...
- python解包操作_Python编程使用*解包和itertools.product()求笛卡尔积的方法
本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法.分享给大家供大家参考,具体如下: [问题] 目前有一字符串s = "['a', 'b'],[ ...
- python模块和类_Python类、模块、包的区别
类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...
最新文章
- 在Ubuntu 16.04.3 LTS上运行go install出错的问题
- tcc分布式事务_什么是 TCC分布式事务?
- springmvc 音频流输出_音频管理模块AudioDeviceModule解读
- 团队-爬虫豆瓣top250项目-项目进度
- python matplotlib.pyplot.scatter() 中的cmap参数是什么意思?
- QT的QPicture类的使用
- 关于无线的Idle Timeout和Session Timeout
- boot gwt_带Spring Boot的GWT
- python之Map函数
- 用了python之后笔记本卡了_应用
- arduino COM口被占用问题解决
- 创业公司如何做到零成本实现用户快速增长
- linux内存管理初始化
- 利用python脚本监控Tomcat服务器
- 洛谷·[HNOI2015]落忆枫音
- exlc表格怎么换行_在Excel中如何换行?Excel表格换行快捷键是什么?
- 经纬度转GeoHash
- UI设计 ,我只推荐这6个网站,真的太好用了。
- 微信公众号开发 - token获取(保证同一时间段内只请求一次)
- matlab中nabisect函数,数值分析在MATLAB中的实现(M函数文件)
热门文章
- tinymce富文本实现可编辑和不可编辑状态
- Android 放图片背景的时钟
- 424 B. Megacity
- 2021年资料员-通用基础(资料员)试题及解析及资料员-通用基础(资料员)复审考试
- python的格式化输入_一看就懂的Python输入和输出、格式化字符串方法
- 字节_signature完整算法分析以及实现!(混淆vm版本)
- html5捕鱼达人游戏
- Unity3D游戏开发之Lua与游戏的不解之缘(上)
- java中使用ElasticSearch聚合查询代码实例(个人笔记,不喜勿喷)
- 用计算机弹出娃娃脸,在windows xp中释放隐藏网速