2010-02-15 11 views
5

ho fatto questa domanda precedente qui:quando viene il flag PUSH trova nel segmento TCP

tcp two sides trying to connect simultaneously

Ho provato il metodo indicato nella soluzione e durante l'invio durante l'utilizzo di netcat e annusando i pacchetti con eterea ho osservato che quando ho inviato una stringa "ciao" da un lato all'altro è stato inviato in un segmento con il flag di spinta impostato.

chi decide di impostare il flag di spinta? quali sono le regole per l'impostazione del flag push o urgente in un segmento tcp? è possibile farlo usando le prese api?

risposta

6

Il flag PUSH viene utilizzato dallo stack tcp per dire in pratica "ho finito per ora". Sta solo indicando che il segmento di dati è completamente trasmesso dalla fonte.

Non c'è modo di indicarlo o controllarlo in userland (il tuo socket api), poiché questo è solo lo stack/implementazione TCP per farlo. Come la bandiera URGENT.

(Fonte: Richard Stevens - Tcp/ip illustrated vol 1, capitolo 20)

+7

Il commento sopra riportato non è corretto in quanto non esiste un modo per controllare il flag di invio inviato dallo spazio utente. Vedi le opzioni di socket TCP_NODELAY e TCP_CORK (man 7 tcp) e il flag MSG_MORE (man 2 send). – MaZe

5

È possibile impostare il flag URGENTE utilizzando send() con il set MSG_OOB bandiera. Poiché ciò implica, i dati inviati saranno Out-Of-Band, ovvero non saranno normalmente ricevuti dal lato chiamante chiamando semplicemente read(). Il lato ricevente riceverà qualche indicazione dei dati OOB come il segnale SIGURG, o il socket diventerà eccezionale e può essere controllato come tale usando select().

La maggior parte delle volte non si desidera impostare il flag URGENT.