2012-01-05 18 views
7

Ho uno scenario in cui un client apre una connessione TCP a un server dopo aver impostato un valore TOS TOS (setsockopt(.., IP_TOS, ..). Sul server, voglio recuperare il valore TOS ricevuto e impostarlo sullo zoccolo in modo che la TOS ricevuta si rifletta sui pacchetti client-serverrecupero del valore TOS su un socket TCP

Il problema è, dal lato server, come posso recuperare il valore TOS ricevuto dal client? Posso supporre che il client non cambierà i TOS valore durante l'intera sessione, quindi è sufficiente ottenere e impostare il valore TOS una volta inizialmente

L'impostazione IP_RECVTOS e l'utilizzo di dati ausiliari funziona per UDP ma non per i socket TCP. qualcosa di simile si può ottenere sui socket TCP? getsockopt(2) con SO_PRIORITY o IP_TOS restituisce i valori configurati sul socket locale. Quindi se ho fatto uno setsockopt() localmente, lo getsockopt() riflette quel valore. Non riflette ciò che viene ricevuto sulla rete.

+0

solo per chiedersi, ma perché si dovrebbe lasciare che un'opzione configurata alla fine modifichi le tue _your_ priorità del traffico in uscita? – Alnitak

+0

ToS è stato sostituito da DSCP per un tempo molto lungo. –

risposta

2

Il valore TOS può cambiare per ogni datagramma TCP ricevuto.

Quindi non è un'opzione costante per lo che riceve il socket TCP.

Da quest'ultimo si può concludere che non è possibile per il ricevitore estrarre un valore per TOS dal socket TCP ricevente in termini di un'opzione il cui valore può essere letto utilizzando getsockopt().

Poiché non v'è alcuna caratteristica così come "messaggi" ausiliari disponibili per TCP l'unico modo che vedo per scoprire ciò che il mittente insieme come TOS è di ispezionare direttamente le intestazioni del pacchetto TCP ricevuto.

+0

Sì, sono d'accordo sulla contraddizione di TCP e un pacchetto per quantità di pacchetti come TOS. Questo è il motivo per cui ho detto che possiamo supporre che il cliente non cambierà le cose durante la vita della sessione per quello che potrebbe valere. Per quanto riguarda il commento di ispezionare direttamente l'intestazione ricevuta, intendevi usare qualcosa come iptables per leggere e impostare i valori DSCP o hai in mente qualcos'altro? – SanjayT

+1

Non avevo in mente niente di speciale. Volevo solo sottolineare che i valori TOS non sono necessariamente un attributo di un socket di ricezione. Inoltre, direi che questo potrebbe non essere nemmeno il caso se non si modifica il valore TOS del socket di invio, poiché durante la trasmissione dei datagrammi TCP le loro intestazioni potrebbero essere modificate in questo senso dagli hop intermedi. – alk

+1

@SanjayT: è possibile dare un'occhiata a libpcap per consentire all'applicazione di monitorare le proprie connessioni TCP in ingresso a un livello inferiore. – alk

Problemi correlati