Domanda

Per quanto tempo posso aspettare che una connessione TCP client / server duri in natura?

Voglio che rimanga permanentemente connesso, ma le cose accadono, quindi il client dovrà riconnettersi. A che punto dico che c'è un problema nel codice piuttosto che un problema con alcune apparecchiature esterne?

È stato utile?

Soluzione

Sono d'accordo con Zan Lynx. Non esiste alcuna garanzia, ma è possibile mantenere attiva una connessione quasi indefinitamente inviando dati su di essa, presupponendo che non vi siano problemi di connettività o larghezza di banda.

Generalmente ho optato per l'approccio keep-alive a livello di applicazione, sebbene ciò sia dovuto in genere alle specifiche del client, quindi ho dovuto farlo. Ma basta inviare alcuni brevi dati ogni minuto o due, a cui ti aspetti una sorta di riconoscimento.

Se contate un errore nel riconoscere come la connessione fallita dipende da voi. Generalmente questo è ciò che ho fatto in passato, anche se c'era un caso in cui avevo aspettato tre risposte non riuscite di seguito per interrompere la connessione perché l'app all'altra estremità della connessione era estremamente instabile nel rispondere a " sei tu ? ci " richieste.

Se la connessione fallisce, cosa che a un certo punto probabilmente, anche con macchine sulla stessa rete, allora prova a ristabilirla. Se fallisce un determinato numero di volte, allora hai un problema. Se la connessione si interrompe in modo persistente dopo che è stata connessa per un po ', poi di nuovo, hai un problema. Molto probabilmente in entrambi i casi è probabilmente un problema di rete, piuttosto che il tuo codice, o forse un problema con lo stack TCP / IP sulla tua macchina (è noto: ho riscontrato problemi con questo su una vecchia versione di QNX - sarebbe cadere casualmente). Detto questo potresti avere un problema con il software e l'unico modo per saperlo con certezza è spesso collegare un debugger o effettuare l'accesso. Per esempio. se riesci sempre a connetterti correttamente, ma dopo un po 'smetti di ricevere ACK, anche dopo la riconnessione, forse il tuo server si sta bloccando o si blocca in un ciclo o qualcosa del genere.

Ciò che è veramente utile è impostare una serie di test di lunga durata in una varietà di condizioni di carico, dal solo invio del keep-alive sei lì? / ack richieste e risposte, al completo danneggiamento del server. Questo in genere ti darà più fiducia sui tuoi componenti software e può essere davvero utile per scovare alcuni problemi davvero strani che non causeranno necessariamente un problema con la tua connessione, anche se potrebbero causare problemi con le transazioni in corso. Ad esempio, una volta stavo scrivendo un server di applicazioni per telecomunicazioni che forniva servizi come la traduzione numerica e lo lasciavamo in esecuzione per giorni alla volta. Il fatto era che quando sabato sarebbe arrivato, per tutto il giorno, avrebbe rifiutato ogni richiesta di chiamata in arrivo, che ammontava a milioni di chiamate, e non avevamo idea del perché. Si è scoperto essere a causa di un singolo errore di battitura in un codice di conversione della data che ha causato un problema solo il sabato.

Spero che sia d'aiuto.

Altri suggerimenti

Penso che l'idea più importante qui sia teoria vs. pratica.

La teoria originale era che le connessioni non avevano vita. Se avevi una connessione, è rimasta aperta per sempre, anche se non c'era traffico, fino a quando un evento non lo ha fatto chiudere.

La nuova teoria è che la maggior parte delle versioni del sistema operativo ha attivato il timer keep-alive. Ciò significa che le connessioni dureranno per sempre, a condizione che il sistema dall'altra parte risponda a uno scambio occasionale a livello TCP.

In realtà, molte connessioni verranno interrotte dopo tempo, con una varietà di criteri e situazioni.

Due esempi davvero validi sono: il client remoto utilizza DHCP, il lease scade e l'indirizzo IP cambia.

Un altro esempio sono i firewall, che sembrano essere sempre più intelligenti e in grado di identificare il traffico keep-alive rispetto ai dati reali e chiudere le connessioni in base a criteri di alto livello, in particolare i tempi di inattività.

Il modo in cui vuoi implementare la logica di riconnessione dipende molto dalla tua architettura, dall'ambiente di lavoro e dai tuoi obiettivi prestazionali.

Non dovrebbe importare davvero, dovresti progettare il tuo codice per riconnetterti automaticamente se questo è il comportamento desiderato.

Non c'è davvero modo di dirlo. Non c'è nulla di inerente a TCP che causerebbe la caduta della connessione dopo un certo periodo di tempo. Qualcuno su una connessione affidabile potrebbe avere anni di uptime, mentre qualcuno su una connessione diversa potrebbe dover riconnettersi ogni 5 minuti. Non c'è modo di dirlo o persino di indovinarlo.

Avrai bisogno di alcuni dati che superano periodicamente la connessione per mantenerla attiva - molti sistemi operativi o firewall lasceranno cadere una connessione inattiva.

Scegli un valore. Una goccia ogni ora probabilmente va bene. Dieci interruzioni impreviste della connessione in 5 minuti indicano probabilmente un problema.

Le connessioni TCP durano generalmente circa due ore senza traffico. Entrambe le estremità possono inviare pacchetti keep-alive, che sono, credo, solo un ACK sull'ultimo pacchetto ricevuto. Normalmente può essere impostato per socket o per impostazione predefinita su ogni connessione TCP.

È anche possibile mantenere vivo un livello di applicazione. Per un protocollo in stile telnet come FTP, SMTP, POP o IMAP qualcosa come inviare return, newline e ottenere un prompt dei comandi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top