Le décodage des paquets tcp à l'aide de python
Je suis en train d'essayer de décoder les données reçues sur une connexion tcp. Les paquets sont petits, pas plus de 100 octets. Cependant, quand il ya beaucoup d'entre eux-je recevoir les paquets réunis. Est-il un moyen d'empêcher cela. Je suis à l'aide de python
J'ai essayé de séparer les paquets, ma source, c'est ci-dessous. Les paquets de démarrage avec STX octet et à la fin avec ETX octets, l'octet suivant le STX est la longueur de paquet, (paquet de longueurs de moins de 5 sont invalides) la somme de contrôle est la dernière octets avant la ETX
def decode(data):
while True:
start = data.find(STX)
if start == -1: #no stx in message
pkt = ''
data = ''
break
#stx found , next byte is the length
pktlen = ord(data[1])
#check message ends in ETX (pktken -1) or checksum invalid
if pktlen < 5 or data[pktlen-1] != ETX or checksum_valid(data[start:pktlen]) == False:
print "Invalid Pkt"
data = data[start+1:]
continue
else:
pkt = data[start:pktlen]
data = data[pktlen:]
break
return data , pkt
Je l'utilise comme ceci
#process reports
try:
data = sock.recv(256)
except: continue
else:
while data:
data, pkt = decode(data)
if pkt:
process(pkt)
Aussi si il y a plusieurs paquets dans le flux de données, est-il préférable de renvoyer les paquets comme une collection de listes ou de simplement retourner le premier paquet
Je ne suis pas familier avec python, C, cette méthode est OK. Tout conseil serait grandement apprécié. Merci d'avance
Grâce
Vous devez vous connecter pour publier un commentaire.
Je voudrais créer une classe qui est responsable pour le décodage des paquets à partir d'un flux, comme ceci:
Et ensuite utiliser comme ceci:
TCP fournit un flux de données, pas de paquets individuels, au niveau de l'interface. Si vous voulez discret des paquets, vous pouvez utiliser UDP (et poignée de perte ou de l'ordre des paquets sur votre propre), ou de mettre certaines données séparateur de ligne. Il sonne comme le font déjà, avec STX/ETX que votre séparateurs. Cependant, comme vous le notez, vous obtenez plusieurs messages dans un segment de données à partir de votre pile TCP.
Noter que si vous faites d'autres traitements,
data
dans le code vous montrer ne contient pas nécessairement un nombre entier de messages. C'est, il est probable que la dernière STX n'aura pas de correspondance ETX. L'ETX sera dans le prochaindata
morceau sans STX.Vous devriez probablement vous lisez des messages à partir du flux de données TCP et retour comme ils se produisent.
Essayer scapy, un puissant interactif programme de manipulation de paquets.
D'où viennent les données ? Au lieu d'essayer de décrypter, à la main, pourquoi ne pas utiliser l'excellent Impacket package:
http://oss.coresecurity.com/projects/impacket.html
Agréable et simple...
:)
Le truc, c'est le fichier objet.
Et c'est tout! (Il ya aussi pas besoin de vérifier les sommes de contrôle lors de l'utilisation de TCP).
Et voici un de plus "solide"(?) version (il utilise STX et de somme de contrôle):
f.read(1)
bloquera jusqu'à ce que la réception de l'octet ou le autre côté de la socket est fermée. Cela pourrait vous causer des ennuis, puisque vous ne seriez pas en mesure de fermer le socket du client. Découvrez ce DONC, la question pour un exemple détaillé. Oh comment je souhaite que ce serait de travailler.