Klienten er ferdig med å sende, proxyen ser EOF, og svaret forsvinner. Å lukke begge proxy-socketene med en gang kan gi nøyaktig den sekvensen. I et TCP-relé betyr en ordentlig slutt i én retning ikke at den andre retningen er ferdig.

Tenk deg en klient som sender en forespørsel, lukker sendesiden sin og venter på svaret:

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

Proxyen har to TCP-tilkoblinger og to bytestrømmer som beveger seg uavhengig. Den må føre signalet om inndataens slutt videre, etter å ha ført bytene som kommer før det videre.

Tøm køen før EOF videresendes

Ved en mottakelse med ikke-null størrelse på en TCP-strøm betyr en retur av null at den innkommende strømmen er ordentlig avsluttet. Merk den leseretningen som ferdig. Slutt å vente på mer inndata fra den, men behold bytene som allerede står i kø for den motsatte socketen.

Når køen fra klient til tjeneste er tømt, kall shutdown(service_socket, SHUT_WR) på en POSIX-socket. Det avslutter videre overføring mot tjenesten mens retningen fra tjeneste til klient forblir tilgjengelig. Når tjenesten er ferdig med svaret sitt, bruk den speilede operasjonen etter at svarkøen er tømt.

Lukking av deskriptorene hører til punktet der begge retninger og deres ventende buffere er ferdige, eller der en feil eller avbrudd krever avslutning. Hold en avgrenset tidsavbrudd for en part som aldri fullfører sin resterende halvdel.

Klarhet er en invitasjon til å lese

En lesbar socket kan ha data eller en EOF-tilstand. Kall recv og tolk resultatet. Positive tall er byte som skal videresendes; null er retningens slutt. På en ikke-blokkerende socket betyr EAGAIN eller EWOULDBLOCK at det ikke er mer inndata akkurat nå, mens EINTR kan kreve et nytt forsøk. Ingen av dem er samme hendelse som EOF.

Ikke let etter et FIN-flagg i bytebufferen som returneres. TCP leverer en ordnet bytestrøm til dette API-et; pakkegrenser og FIN-segmentet er ikke vanlig applikasjonsnyttelast.

Dette er livssyklusen til en rå bytetunnel. En HTTP-proxy som parser meldinger må fortsatt respektere HTTP-rammeverket, og en TLS-avsluttende proxy har også en TLS-nedstengningsprotokoll. Hold de protokollbeslutningene over det retningsbestemte TCP-reléet.

Relaterte artikler