Qual è l'uso della colonna Recv-Q e Send-Q nell'output di comando netstat E quando lo usiamo nello scenario in tempo reale? Nel mio sistema, entrambe le colonne sono sempre mostrate come zero. Qual è il significato per questo?Uso di Recv-Q e Send-Q
risposta
Dalla mia pagina man:
Recv-Q
Fondata: Il numero di byte non copiati dal programma utente collegato a questa presa.
Ascolto: dal kernel 2.6.18 questa colonna contiene il backlog syn corrente.
Send-Q
Fondata: Il numero di byte non riconosciuti dall'host remoto .
Ascolto: dal kernel 2.6.18 questa colonna contiene la dimensione massima del backlog syn.
Se questo è bloccato a 0, ciò significa solo che le applicazioni, su entrambi i lati della connessione, e la rete tra loro, stanno facendo OK. I valori istantanei effettivi possono essere diversi da 0, ma in modo transitorio e fuggitivo che non si ha la possibilità di osservarlo realmente.
Esempio di scenario di vita reale in cui questo potrebbe essere diverso da 0 (su connessioni stabilite ma penso che si ottiene l'idea):
Recentemente ho lavorato su un dispositivo embedded Linux a parlare con un (mal progettato) dispositivo di terze parti. Su questo dispositivo di terze parti, l'applicazione si è chiaramente bloccata a volte, non leggendo i dati ricevuti sulla connessione TCP, facendo sì che la finestra TCP scendesse a 0 e rimanesse bloccata lì per decine di secondi (fenomeno osservato tramite wireshark su una porta speculare tra i 2 ospiti). In tal caso:
Recv-Q: esecuzione
netstat
il terzo dispositivo parte (che avevo non significare fare) può avere mostrerebbe un aumento Recv-Q, fino a un valore tetto dove l'altro lato (io) interrompe l'invio di dati perché la finestra ottiene fino a 0, poiché l'applicazione non legge i dati disponibili su suo socket e questi dati rimangono bufferizzati nell'implementazione TCP nel il SO, non andando per l'applicazione bloccata ->dal lato ricevitore , problema di applicazione.Send-Q: esecuzione
netstat
sul mia lato (che non ho provato perché 1/il problema era chiaro da Wireshark e fu il primo caso di cui sopra e 2/questo non era al 100% riproducibile) possono avere mostrare un non-zero Send-Q, se l'altra implementazione TCP lato a livello del sistema operativo sono stati stucked e si fermò ACKnowleding miei dati ->dal lato del mittente , ricevendo implementazione TCP (tipicamente a t he livello OS) problema.
Nota che lo scenario Send-Q descritto sopra può anche essere un problema lato di invio (lato mia) se mia implementazione Linux TCP era comportato male e ha continuato a inviare i dati dopo la finestra TCP è sceso a 0 : il lato ricevente non ha più spazio per questi dati -> non ACKnowledge.
Si noti inoltre che il problema Send-Q potrebbe non essere causato dal ricevitore, ma da qualche problema di routing tra il mittente e il destinatario. Alcuni pacchetti sono "al volo" tra i 2 host, ma non ancora ACKnowledge. D'altra parte, il problema Recv-Q è definitivamente su un host: pacchetti ricevuti, ACK riconosciuti, ma non letti ancora dall'applicazione.
EDIT:
Nella vita reale, con gli host e le applicazioni, come si può ragionevolmente aspettarsi, scommetterei la questione Send-Q per essere causato la maggior parte del tempo da qualche problema di routing non schifosi/scarsa prestazione della rete tra il lato di invio e quello di ricezione. Lo stato "on the fly" dei pacchetti non dovrebbe mai essere dimenticato:
Il pacchetto può essere in rete tra il mittente e il destinatario,
(o percepiti, ma ACK non ancora inviare, vedi sopra)
o l'ACK può trovarsi sulla rete tra il destinatario e il mittente.
Richiede un RTT (round time trip) per un pacchetto da inviare e quindi ACKed.
- 1. Uso di FFmpeg e IPython
- 2. Uso di neocomplcache e clang_complete?
- 3. DDD e uso di getter e setter
- 4. Uso latex e Vim
- 5. Uso Meteor.methods e Meteor.call
- 6. Uso di Node.js con Django e Backbone.js
- 7. Uso di AND e OR in SQLite
- 8. Uso di color e color.darker in Android?
- 9. Uso efficiente di as.numeric() e factor()
- 10. Uso di sempre e sempre dichiarazioni
- 11. PyQt uso corretto di emit() e pyqtSignal()
- 12. Uso di Velocity con piastrelle e molla
- 13. uso efficiente di R data.table e unico()
- 14. Uso corretto di ParallelOptions, TaskCreationOptions e Task.Factory.StartNew?
- 15. Uso corretto di os.path e os.join
- 16. Uso di rendimento e rendimento in Ruby
- 17. Uso di Ninject con Owin e InRequestScope
- 18. Uso simultaneo di ActiveMQ e RabbitMQ
- 19. Uso di utenti mysqldump e database
- 20. Uso List.Exists e predicati correttamente
- 21. quando uso getDefaultSharedPreferences e getSharedPreferences
- 22. Uso corretto (o non uso) di Dispatcher.CheckAccess()
- 23. Uso di diverse DLL per build di debug e release
- 24. Modello Singleton e uso corretto di URLRequestConvertible di Alamofire
- 25. Caching di AppFabric - Uso corretto di DataCacheFactory e DataCache
- 26. Uso di const e decltype con una variabile di puntatore
- 27. WebRTC: uso di getStats()
- 28. Uso di ActivityManager
- 29. Uso di Assert.Inconclusive
- 30. uso corretto di scipy.optimize.fmin_bfgs