Klienten er færdig med at sende, proxyen ser EOF, og svaret forsvinder. Hvis man lukker begge proxy-sockets med det samme, kan det give præcis den sekvens. I et TCP-relay betyder en ordentlig afslutning i én retning ikke, at den anden retning er færdig.

Overvej en klient, der sender en anmodning, lukker sin sendeside og venter på svaret:

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

Proxyen har to TCP-forbindelser og to bytestrømme, der bevæger sig uafhængigt. Den skal føre signalet om inputafslutning videre, efter at den har ført de bytes videre, der går forud for det.

Tøm køen, før EOF videresendes

Ved en modtagelse med ikke-nul størrelse på en TCP-strøm betyder et nul, at den indgående strøm er afsluttet ordentligt. Markér den læseretning som færdig. Hold op med at vente på mere input fra den, men behold bytes, der allerede står i kø til den modsatte socket.

Når køen fra klient til tjeneste er tømt, kald shutdown(service_socket, SHUT_WR) på en POSIX-socket. Det afslutter yderligere transmission mod tjenesten, mens retningen fra tjeneste til klient forbliver tilgængelig. Når tjenesten er færdig med sit svar, anvend den spejlede operation, efter at svarkøen er tømt.

Lukning af deskriptorerne hører til det punkt, hvor begge retninger og deres ventende buffere er færdige, eller hvor en fejl eller annullering kræver afslutning. Hold en afgrænset timeout for en peer, der aldrig fuldfører sin resterende halvdel.

Klarhed er en invitation til at læse

En læsbar socket kan have data eller en EOF-tilstand. Kald recv og fortolk resultatet. Positive tal er bytes, der skal videresendes; nul er retningens afslutning. På en ikke-blokerende socket betyder EAGAIN eller EWOULDBLOCK, at der i øjeblikket ikke er mere input, mens EINTR kan kræve et nyt forsøg. Ingen af dem er den samme hændelse som EOF.

Led ikke efter et FIN-flag i den returnerede bytebuffer. TCP leverer en ordnet bytestrøm til denne API; pakkegrænser og FIN-segmentet er ikke almindelig applikationsnyttelast.

Dette er livscyklussen for en rå bytetunnel. En HTTP-proxy, der parser meddelelser, skal stadig respektere HTTP-framing, og en TLS-terminerende proxy har også en TLS-nedlukningsprotokol. Hold de protokolbeslutninger over det retningsbestemte TCP-relay.

Relaterede artikler