ciò che è TCP Half Open Connection e connessione a metà chiuso TCP

Sto cercando di capire qual è la differenza tra TCP Half Open Connection e TCP Half closed connection può qualcuno dire che cosa sono esattamente?

Questo post si espande su connessioni mezze chiuse. Per metà collegamenti aperti vedere la corretta descrizione di KContreau.

Quali sono le connessioni a metà chiuso? Oppure: non è un bug – è una caratteristica!

Ogni connessione TCP è costituita da due metà collegamenti che sono chiusi indipendentemente l'uno dall'altro. Quindi, se una estremità invia una FIN, allora l'altra estremità è libera di ACK solo FIN (invece di FIN + ACK-ing), che segnala l'estremità di invio FIN che ha ancora dati da submit. Quindi entrambe le estremità finiscono in uno stato stabile di trasferimento dati diverso da ESTABLISHED – cioè FIN_WAIT_2 (per l'estremità di ricezione) e CLOSE_WAIT (per l'estremità di invio). Tale collegamento è detto di essere metà chiuso e TCP è in realtà progettato per supportre tali scenari, quindi metà chiuso connessioni è una funzionalità TCP.

La storia della connessione a metà chiuso

Mentre RFC 793 descrive solo il meccanismo grezzo senza menzionare il termine "mezza chiusa", RFC 1122 elabora su quella materia nel paragrafo 4.2.2.13. Si può chiedere chi diavolo abbia bisogno di questa caratteristica. I progettisti di TCP hanno anche implementato il TCP / IP per il sistema Unix e, come tutti gli utenti di Unix, amano il redirezione degli I / O. Secondo W. Stevens (TCP / IP illustrato, sezione 18.5) la voglia di I / O-redirect i flussi TCP è stata la motivazione per introdurre la funzionalità. Consente alla FIN ack di assumere il ruolo di o essere tradotto come EOF. Quindi è fondamentalmente una funzionalità che consente di creare casualmente un'interazione impomptu in stile di richiesta / risposta sul livello applicativo, where il FIN segnala "fine richiesta".

Gli altri ragazzi hanno fatto un lavoro abbastanza decente di descrivere le connessioni semi-aperte e semestrate, ma l'idea di connessioni semi-aperte è anche spesso ricercata nel context di un problema di PROBLEM.

Ci sono argomenti su internet su come la terminologia "semiaperta" o "mezza chiusa" dovrebbe rappresentare, ma per quanto mi riguarda, la terminologia è solo semantica. Alcuni dicono che le connessioni "semiaperte" sono un "problema", mentre "metà chiuso" sono una caratteristica di progettazione che consente di chiudere il stream di invio chiudendo il stream di invio prima che il download di file venga completato in uno stato semestrale ( come descritto dagli altri utenti).

Tuttavia, per quanto riguarda l'altro … il "problema": richiede una stretta di mano a 3 vie per aprire una connessione TCP e una stretta di mano a 4 direzioni per chiuderla.

TCP ha una vulnerabilità in quanto il pacchetto fin FIN inviato a un client può essere potenzialmente scartato da router / reti che hanno come risultato una connessione che è semiaperta quando l'intento attuale è quello di chiudere completamente la connessione. Questo approccio e simili sono stati tipi popolari di attacchi di Denial of Service, in quanto non richiedono molta width di banda, ma potenzialmente preoccupano maniglie, prese e thread a seconda dell'attuazione del server, ma possono accadere anche nel mondo reale con frequenza crescente grazie ai nostri porttori wireless scadenti.

I sisthemes operativi hanno tentato di combattere contro gli attacchi DDoS semiaperti limitando il numero di connessioni aperte / chiuse che possono essere presenti nel sistema operativo in un dato momento e introducendo lunghezze di tempo che le connessioni possono rimanere in un mezza apertura / stato chiuso. Ultimamente ho controllato, personalmente, tuttavia, il limite di tempo su Windows era abbastanza alto (2 giorni, se mi ricordo).

Questa condizione è ulteriormente aggravata dalla natura facoltativa dei mantenitori TCP che, se completamente implementati, erano intesi come una soluzione a livello di protocollo (a differenza della soluzione applicativa) per rilevare le connessioni dead / zombie. Ma quando è stato progettato il protocollo TCP, la width di banda era notevolmente più preziosa di quanto non sia attualmente e ci sono state preoccupazioni che i temporizzatori mantoventi mandatari per TCP sarebbero troppo "chiacchierati". Pertanto i mantenitori sono facoltativi, non generalmente utilizzati e non garantiti per essere trasmessi dai router secondo RFC1122. Così … anche se abiliti i mantenitori al livello TCP nel tentativo di rilevare / gestire lo scenario, potresti scoprire che mentre il tuo traffico viaggia in giro per il mondo, alcuni router stanno lasciando i pacchetti di mantenimento … creando potenzialmente un altro scenario raro da testare.

Le connessioni Half-Open rappresentano un po 'una sfida di ingegneria per i codificatori che scrivono server basati su TCP, in particolare perché possono apparire involontariamente a caso, durante i momentjs di carico elevato … e tipicamente sui server di produzione … e possono essere difficile da notare nelle fasi di test Alpha / Beta. Nella mia esperienza, ho trovato che si verificano in forse 1 su 40.000 connessioni su server che gestiscono connessioni 2.5million / giorno, ma questi numbers variano a seconda delle condizioni del traffico e delle condizioni del traffico di each parte dell'interface tra il server e il client .

Come ingegnere, può essere difficile individuare i problemi che si verificano in modo non frequente e solo su server in diretta e distribuiti, quindi è importnte cercare di simulare questo raro stato di connessione durante la scrittura del codice server TCP per analizzare come il server reagirà quando di fronte a questa situazione. Ad esempio, se il server TCP utilizza un numero statico di thread di lavoratori, ad esempio, tutti possono essere consumati da connessioni zombi quando si distribuisce alla produzione. Se i collegamenti richiedono molta memory di lavoro, il risultato finale potrebbe apparire simile a una perdita di memory. ecc. ecc.

Senza una soluzione di mantenimento al 100% vera e propria, TCP lo lascia al livello utente per determinare il modo in cui vengono gestiti le connessioni half-open / closed, quindi il codice deve disporre di un piano / meccanismo per rilevare, time-out e clean- up quando questa condizione si verifica … cioè supponendo che questo sia un protocollo che hai inventato e non uno dei tanti (cattivi) standard aperti che i programmatori usano tipicamente. Naturalmente mi riferisco a protocolli come HTTP, che funzionano esclusivamente su TCP. Questi protocolli sono estremamente sopravvalutati a giudizio di questo programmatore.

Riconoscendo le debolezze di TCP e la sua sfortuna popolarità per la trasmissione del traffico HTTP / Web, le aziende intelligenti hanno cercato di cercare una sostituzione. Ad esempio, Google ha sperimentato un protocollo denominato QUIC, che trasmette HTTP su UDP. C'è anche un protocollo aperto chiamato TSCP. Nessuno di questi protocolli ha visto un'ampia adozione.

Di regola, costruisco tutti i miei server per parlare esclusivamente sul mio protocollo basato su UDP. L'UDP è più complicato di quanto si possa pensare, e mi sento come se lo stessi sempre adattando per essere più veloce, più intelligente, a latenza più bassa, a bassa congestione … ma alless non ho più a che fare con le connessioni semiaperte; )

Quando TCP stabilisce una connessione, è considerato garantito in quanto avviene una stretta di mano:

  1. Il computer di avvio invia la richiesta di connessione inviando un SYN
  2. Il computer rispondente concede la richiesta, rispondendo con un SYN-ACK
  3. Il computer di avvio invia un riconoscimento, rispondendo con un ACK

A quel punto viene stabilita la connessione ei dati iniziano a scorrere. Al contrario, un pacchetto UDP non è garantito, ed è appena inviato nelle speranze che arriva lì.

http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment

immettere qui la descrizione dell'immagine

Ufficialmente, secondo la RFC, una connessione TCP semiaperta è quando un lato della connessione stabilita si è schiantato e non ha inviato la notifica che la connessione era terminata. Questo non è l'uso comune di oggi.

Unofficialmente, se si può fare riferimento a una connessione embrionale, che è una connessione nel process di stabilizzazione.

http://en.wikipedia.org/wiki/Embryonic_connection

Half-closed è l'opposto di quella definizione non ufficiale. È uno stato da qualche parte nel mezzo in cui i computer stanno abbattendo la connessione stabilita.

La connessione mezza chiusa è un process che viene stabilito quando un'estremità del server e il client intendono terminare la connessione. TCP è un process orientato alla connessione, quindi each socket viene aperta per una particolare applicazione. In TCP non esiste alcuna pressione per terminare l'applicazione. Quindi il process connesso alla connessione prolunga la terminazione con segnali di attesa. questo viene chiamato come metà chiuso in TCP (connessione)