目录

0x00 wireshark

0x01 Tftpd32

0x02 客户端怎样从服务器下载文件呢?

0x03完整程序:


0x00 wireshark

注意目标ip中 只要是是主机号全部是1的地址 全部是广播地址,例如:

192.168.2.255

10.10.255.255

10.255.255.255

255.255.255.255 这些都是广播地址。

wireshark 中黑色和红色往往表示数据包有错误

0x01 Tftpd32

Tfpd32 运行起来之后,就开启了一个文件共享服务器

我们的任务是要写一个客户端,可以从这个ftp服务器上下载文件。

0x02 客户端怎样从服务器下载文件呢?

首先,下载的过程是这样的:

  1. 创建一个空文件:f = open("test.jpg","bw")
  2. 向里面写数据:
  3. 关闭文件
while True:recvData = udpSocket.recvfrom(1024)if 没有数据了:breakelse:f.write(recvData)
f.close()

但是,服务器怎么知道客户端要那个文件呢?客户端怎么告诉服务器自己要那个文件呢?这就要用到tftp协议(即简单文件传输协议)了,tftp协议是tcp/ip协议族中的一个用来在客户端和服务器之间进行简单文件传输的协议,它基于udp实现,tftp服务器默认打开udp69号端口。

具体下载过程:

首先,客户端向tftp服务器的udp69端口发送一个请求包(读请求(下载请求)或者写请求(上传请求)),服务器如果批准该请求,则会开启一个新的端口(随机)进行数据的传输

比如说服务器收到一个读请求,即客户端请求下载文件,那么服务器在找到需要下载的文件后,会立即打开该文件,然后从文件中读取数据到内存中,然后将读取到的数据通过tftp协议发送给客户端,如果文件的总大小较大,那么服务器会分多次发送,每次会从文件中读取512个字节的数据发送过来。

因为发送的次数有可能很多,为了让客户端对接受到的数据进行排序,服务器会在发送那512个字节数据的时候,多发两个字节的数据,用来存放序号(序号从1开始),并且将序号放在512个字节数据的前面,

当服务器中不存在客户端请求下载的文件时,服务器会发给客户端一个错误信息。为了能够区分服务器发送的包表示错误信息还是表示数据包,在序号(即块编号)的最前面 又添加了两个字节 表示 操作码:

操作码含义表
操作码 功能
1 读请求(下载请求)
2 写请求(上传请求)
3 表示该包内容为数据(即DATA)
4 确认码(即ACK)
5 错误

因为用udp模块发包,只管一个劲的发包,而不在乎对方是否收到(UDP协议接受方不需要回复ack),所以数据包是否发送成功不能确定,所以TFTP协议为了弥补udp协议的不足,规定为了让服务器知道客户端已经成功收到了刚刚发送的那个数据包,当客户端收到一个数据包的时候,必须向服务器发送一个ack包,表示已收到

同时为了标记数据已经发送完毕,tftp协议规定,当客户端接收到的数据小于516(2个字节操作码+2个字节序号+512个字节的数据)时,就意味着服务器发送完毕了。

总结:

tftp协议通信中涉及到的四种数据包:读写请求包(客户端),数据包(客户端或者服务器),ack包(客户端或者服务器),错误包

其中读写请求包中的模式默认为 octet。ack包的块编号和收到数据包的块编号相对应。

tfpt通信过程图解:

注意:UDP 69端口只接受 读写请求包,ack包会发送给 服务器新开的随机端口。

那么如何实现用python发送请求包呢?

首先让我们复习下大端模式和小端模式。

  1. 小端模式就是低位字节放在内存的低地址端,高位字节放在内存的高地址端。例如:0x11 22 中11 为高位字节,22位低位字节。那么22就会先被存储在低地址位,22就会被存储在高位地址。
  2. 大端模式就是高位字节放在内存的低地址端,低位字节放在内存的高地址端。

一般而言,pc机中用小端模式,但是有些服务器中却使用大端模式。这样一来,PC机中用小端模式存储的数据发送给服务器,服务器用大端模式存储,就出现了乱套。因此,网络协议中规定 只要这个数据是多个字节组成的,那么就必须将该数据 转化 为大端模式 来发送。

import struct
from socket import *#构造 下载请求包
sendData  = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)
#"!H8sb5sb" 是占位符,H表示占两个字节对应 1,8s表示占8个字节的位置(对应test.jpg),b表示占一个字节对应0,5s表示占5个字节对应octet. !表示组织该数据 按照网络的格式组织,即大端模式组织。该函数的返回值就是我们组织好的数据。udpSocket = socket(AF_INET,SOCK_DGRAM)
udpSocket.sendto(sendData,("192.168.43.4",69))

那么如何将从服务器发来的数据解包呢?

import struct
from socket import *#构造 下载请求包
sendData  = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)
data = struct.unpack('!HH',sendData[:4])
#截取sendData的前4个字节,并对其解包,返回值为一个元组
print(data)

0x03完整程序:

tftp客户端.py

import struct
from socket import *
import sysif len(sys.argv) != 2:print(len(sys.argv))print("Usage:tftp.py ip")exit()ip = sys.argv[1]
#print(ip)udpSocket = socket(AF_INET,SOCK_DGRAM)
sendData = struct.pack("!H8sb5sb",1,"test.jpg",0,"octet",0)
udpSocket.sendto(sendData,(ip,69))
already_recv_num = 0
while True:data,info = udpSocket.recvfrom(1024)#print(data)#print(info)op_num = struct.unpack("!HH",data[:4])op = op_num[0]num = op_num[1]if op == 5:print("error")breakelif op == 3:if len(data) < 516:print("receive successfully")f.close()udpSocket.close()breakif num == 1:f = open("test.jpg",'a')if already_recv_num+1 == num:f.write(data[4:])already_recv_num += 1print("already received data num:%d",already_recv_num)ack = struct.pack("!HH",4,num)udpSocket.sendto(ack,info)

python_day08:网络编程02(wireshark,tftpd32,客户端怎样从服务器下载文件,tftpd客户端)相关推荐

  1. C#从服务器下载文件到客户端源码

    1.在window窗体加个button控件,双击进去 2.进入方法体中,编写方法 private void btnDownload_Click(object sender, EventArgs e) ...

  2. 服务器客户端传输文件,服务器传输文件到客户端

    服务器传输文件到客户端 内容精选 换一换 在本章节中,您将运行已部署好的游戏,登录游戏客户端.已准备好Windows机器,硬盘至少20G,且必须安装有显卡.服务器地址:节点的弹性IP地址,请登录CCE ...

  3. 客户端从服务端下载文件的流程分析

    客户端从服务端下载文件的流程分析: 浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下. 服务器接受到该请求以后,马上运行该down.php文件 运行该文件的时候 ...

  4. c++网络编程:实现简单的聊天——基于服务器/客户端的模式

    c++ socket编程 服务器/客户端 最近在学c++网路编程,写个帖子记录自己的学习过程,部分内容参考一个博主的,附上他的链接: link 实现: 客户端往服务器端发送一条数据,服务器端接收数据并 ...

  5. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

    网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...

  6. 【Linux网络编程学习】使用socket实现简单服务器——多进程多线程版本

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 多进程版 1.1 思路 大体思路与上一篇的单进程版服务器–客户端类似,都是遵循下图: 多进程版本有以下几点需要注意: 由于TCP是点 ...

  7. 【UNIX网络编程】| 【03】TCP客户/服务器程序示例

    文章目录 1.概述 2.TCP回射服务器程序 3.TCP回射客户程序 3.正常启动 4.正常终止 5.POSIX信号处理 5.1 signal函数 5.2 POSIX信号语义 6.处理SIGCHID信 ...

  8. C++网络编程(四):多进程并发服务器

    部分内容转自Linux并发服务器编程之多进程并发服务器. 目录 前言 创建进程 Linux下的进程 进程创建函数fork与vfork exec函数 使用fork函数实现多进程并发服务器 分割I/O程序 ...

  9. Qt网络编程——使用OpenCV与TCP搭建图像处理服务器

    前言 前面的博客有写过如果使用TCP搭建一个客户端与服务器,连接并互发信息,这里主是演示,如何把客户端的图像发往服务器,服务器得到图像后,按指令做不同的处理,并返回给客户端处理之后的结果,客户端只负责 ...

最新文章

  1. YARN的job提交过程
  2. Java中如何锁文件
  3. kettle中java组件_kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
  4. 电脑屏幕变黄如何调整_如何调整电脑屏幕比例
  5. SAP 电商云 Spartacus UI 的交货模式 Delivery Mode 设计
  6. linux之errno值为104(connetction reset by peer)
  7. void init(void) 分析 ! \linux-1.0\init\main.c
  8. 癌中之王:基质微环境塑造胰腺癌瘤内结构|Cell
  9. 服务器设置 上传excel文件夹,excel上传服务器
  10. 创意视觉应用︱基于深度学习的CVaaS计算机视觉即服务案例(Computer Vision as a Service)
  11. 油猴脚本使用方法与管理插件方法+开发插件与安装插件的方法
  12. mysql视图存放位置_MySQL基础备忘(2)之视图
  13. 【ZZULIOJ】1116: 删除元素
  14. 哈工大2022计算机系统大作业
  15. 数据、数据元素、数据项、数据对象的理解
  16. mysql 迪卡尔运算_「笛卡尔乘积」mysql笛卡儿积 - seo实验室
  17. 在windows上实现ubuntu、centos的远程桌面控制
  18. 七个习惯之二:以终为始
  19. RAID10 (146G*8) vs EMC VNX 5300 (8G Fibre Channel)
  20. 搭建线上网校?推荐这套Github上最好的开源网校系统

热门文章

  1. MySQL表相关操作
  2. Java代码的三板斧
  3. Gitee+typora+picgo+插件,markdown图床配置,一键将markdown中本地图片上传至图床
  4. 适用于大中型银行的云原生网络体系建设方案攻略
  5. p4899 [IOI2018] werewolf 狼人
  6. 十四届蓝桥青少组省赛Python中高级选拔赛——20221030
  7. cpu压力 测试软件,破坏测试工具——CPU压力
  8. matlab三维可视化,MATLAB中三维数据可视化及应用
  9. 下载excel文件(旺铺助手)的方法
  10. HCIA ENSP WLAN基础配置