Progettare un pacchetto di rete semplice
-
06-07-2019 - |
Domanda
Sto imparando la programmazione socket (in Python) e mi chiedevo quale sia il modo migliore / tipico di incapsulare i dati? I miei pacchetti verranno utilizzati per inviare comandi di esecuzione, arresto, configurazione, ecc. Sul lato ricevente. È utile usare JSON o solo testo semplice?
Soluzione
Ti suggerisco di utilizzare un formato fisso o prevalentemente fisso, in quanto ciò semplifica le cose.
Usando quindi funzionalità come la struct.Struct della libreria standard, con i suoi metodi pack () e umpack (), o forse un pacakges leggermente più caratterizzato come Costruisci , dovresti svolgere gran parte del lavoro di analisi per te ;-)
Altri suggerimenti
Suggerisco di iniziare con il testo semplice: è più facile eseguire il debug. Il formato che assume il tuo testo dipende da cosa stai facendo, da quanti comandi, argomenti, ecc. Hai capito come appariranno i tuoi comandi? Una volta capito come appare, probabilmente suggerirà un formato tutto da solo.
Stai usando TCP o UDP? TCP è facile poiché è uno stream, ma se stai usando UDP tieni a mente la dimensione massima dei pacchetti UDP e quindi quanto può essere grande il tuo messaggio.
Se stai sviluppando qualcosa come un esercizio di apprendimento, potresti trovare la soluzione migliore per un formato di testo strutturato (cioè leggibile e scrivibile dall'uomo).
Un esempio potrebbe essere l'uso di un numero fisso di campi per comando, campi di testo a larghezza fissa e / o delimitatori di campi facilmente analizzabili.
Generalmente il testo è meno efficiente in termini di dimensioni del pacchetto, ma ha i vantaggi di poterlo leggere facilmente se si esegue un'acquisizione di pacchetti (ad es. utilizzando WireShark) o se si desidera utilizzare Telnet per simulare un client.
E se questo è solo un esercizio di apprendimento, la facilità di debug è un problema significativo.
Dai un'occhiata a come scapy (una fantastica libreria di manipolazione di pacchetti Python) lo implementa. Sembra che abbiano una manciata di campi .