wireshark和TFTP下载器

wireshark

    • TFTP下载器

wireshark和TFTP下载器_第1张图片
time:是抓数据的时间,是开始抓包时间,source是原IP的地址发送方的IP地址,destination是目的地址,protool是使用的协议,length是包长度,info是wireshark对数据的理解,每一行是一个具体信息。

广播:C类地址,如192.168.1.23里面的前三位是网络号。
在这里插入图片描述wireshark和TFTP下载器_第2张图片图中圈出来的是四个255也是广播地址,只要10.10.255.255,也可能是广播地址,
wireshark和TFTP下载器_第3张图片wireshark和TFTP下载器_第4张图片wireshark和TFTP下载器_第5张图片这分别是不同网络层次,包括网络层之后的6个层次。
wireshark和TFTP下载器_第6张图片抓取数据的真实信息,右边是对数据的解析,通过将其Ascall码来翻译,
wireshark和TFTP下载器_第7张图片每一行都是TCP/IP协议对应的数据。
wireshark和TFTP下载器_第8张图片黑色数据代表数据有问题,可能是握手失败?
在这里插入图片描述在这一行,可以查询某一个特定的IP地址传输的消息。
wireshark和TFTP下载器_第9张图片在发消息之后,立刻显示出来有消息交互,在发消息之后立马会有消息信息,IP信息。
在这里插入图片描述接收消息之后立马能显示双方IP。

TFTP下载器

wireshark和TFTP下载器_第10张图片TFTP相当于一个服务器软件,搭建一个CS架构(client server),b/s架构browser server指的是直接打开浏览器,cs架构需要客户端。
wireshark和TFTP下载器_第11张图片
wireshark和TFTP下载器_第12张图片要是两个程序相同的话要创建两个相同的协议TFTP协议,以及知到怎么下载,怎么关闭。
wireshark和TFTP下载器_第13张图片C(客户端)先向服务器请求。
在这里插入图片描述上图就是请求过程,当要传输数据过大时,会分步传输,如每次发送100字节,但是UDP不稳定可能丢包
wireshark和TFTP下载器_第14张图片在发送消息后会有回复,

wireshark和TFTP下载器_第15张图片在收到的时候会有回复,是为了保证数据稳定性。
实际上tftp在发送的时候会有下载请求:
在这里插入图片描述
操作码:写1代表下载,写0代表上传,写入文件名字,模式只能写octet。
在这里插入图片描述其实只能修改的是文件名字。
在这里插入图片描述
每次发送512字节,块编号代表的是序号,代表是哪次发送的,操作码代表是文件的行为区分.
wireshark和TFTP下载器_第16张图片ACK是确认包,代表回复确认。
1是下载,2是上传,3则是带有文件内容的实际内容,4是回复确认,5是错误信息。
wireshark和TFTP下载器_第17张图片69端口只能接受下载请求,而不能接受别的信息。
wireshark和TFTP下载器_第18张图片所有服务器多数据信息都要转化为大端存储。

import struct
from socket import *
s="test.jpg"
udpSocket = socket(AF_INET, SOCK_DGRAM)
so="octet"

sendData=struct.pack("!H8sb5sb", 1,s.encode("utf-8"),0,so.encode("utf-8"),0)
udpSocket.sendto(sendData,("169.254.63.36",69))
udpSocket.close()
#  !代表的是大端存储,网络字节序列,!是固定的格式,H会替换为两个字节,相当于占了一个坑,代表的是01,8s代表的是八个字节,test.jpg,

这里的struct是使用utf-8的模式,但是python默认的是unicode模式所以在开始报错:
在这里插入图片描述在这里插入图片描述在这里插入图片描述这里是抓包工具,显示03接收文件实际内容,后两个字节表示大端存储。


# 1、什么叫下载
# 2、怎么完成下载?
#   1、创建一个空文件夹
#     2、向里面写数据
#     3、关闭

import struct
from socket import *

filename = "car.jpg"#设置下载文件
server_IP = "169.254.63.36"#设置服务器地址
send_data = struct.pack("!H%dsb5sb" % len(filename), 1, filename.encode("utf-8"), 0,"octet".encode("utf-8"), 0)  # struct.pack 封装成字节流,将文件名长度保存为len(filename)
#1代表下载,
s = socket(AF_INET, SOCK_DGRAM)#创建套接字,使用的是UDP协议
s.sendto(send_data, (server_IP, 69))  # 第一次发送,连接服务器69端口
with open(filename,"ab")as f:
    print(f)
# 以追加模式打开(必要时可以创建)b 二进制打开
while True:
    recv_data = s.recvfrom(1024)#设置最长的接受1024个字节
    action_code, ack_num = struct.unpack("!HH", recv_data[0][:4])  # 获取数据号编号,获取接收到的文件操作码
    rand_port = recv_data[1][1]
    if int(action_code) == 5:#action code=5的时候代表出现了错误消息
        break
    print("操作码:%d,ACK:%d,服务器随机端口:%d,数据长度:%d" % (action_code, ack_num, rand_port, len(recv_data[0])))
    f.write(recv_data[0][4:])
    if len(recv_data[0]) < 516:#每次接收长度是516在接收字节数小于516的时候代表文件传输完成
        break
    ack_data = struct.pack("!HH", 4, ack_num)
    s.sendto(ack_data, (server_IP, rand_port))



tftp下载器

你可能感兴趣的:(python)