El client acaba d'enviar, el proxy veu EOF i la resposta desapareix. Tancar tots dos sockets del proxy immediatament pot causar exactament aquesta seqüència. En un relé TCP, un final ordenat en un sentit no vol dir que l'altre sentit hagi acabat.

Pensa en un client que envia una petició, tanca el seu costat d'enviament i espera la resposta:

client -- request, then FIN --> proxy --> service
client <-------- reply ------- proxy <-- service

El proxy té dues connexions TCP i dos fluxos de bytes que es mouen de manera independent. Ha de portar la indicació de final d'entrada cap endavant, després de portar els bytes que la precedeixen.

Buida la cua abans de reenviar l'EOF

En una recepció de mida diferent de zero en un flux TCP, un retorn de zero indica un final ordenat d'aquest flux entrant. Marca aquesta direcció de lectura com a acabada. Deixa d'esperar més entrada d'ella, però conserva els bytes ja encuats per al socket oposat.

Quan la cua de client a servei s'hagi buidat, crida shutdown(service_socket, SHUT_WR) en un socket POSIX. Això acaba la transmissió posterior cap al servei mentre deixa disponible la direcció de servei a client. Quan el servei acabi la seva resposta, aplica l'operació mirall després de buidar la cua de resposta.

Tancar els descriptors pertoca al punt on tots dos sentits i els seus búfers pendents han acabat, o on un error o una cancel·lació requereixen terminació. Mantén un temps d'espera limitat per a un parell que mai completa la seva meitat restant.

La disponibilitat és una invitació a llegir

Un socket llegible pot tenir dades o una condició d'EOF. Crida recv i interpreta'n el resultat. Els comptes positius són bytes a reenviar; zero és el final direccional. En un socket no bloquejant, EAGAIN o EWOULDBLOCK significa que ara no hi ha més entrada, mentre que EINTR pot requerir reintentar. Cap dels dos no és el mateix esdeveniment que l'EOF.

No busquis un indicador FIN al búfer de bytes retornat. TCP lliura un flux de bytes ordenat a aquesta API; les fronteres de paquet i el segment FIN no són càrrega útil normal de l'aplicació.

Aquest és el cicle de vida d'un túnel de bytes cru. Un proxy HTTP que analitza missatges encara ha de respectar l'emmarcat HTTP, i un proxy que acaba TLS també té un protocol de tancament TLS. Mantén aquestes decisions de protocol per sobre del relé TCP direccional.

Articles relacionats