Klienten er ferdig med å sende, proxyen ser EOF, og svaret forsvinner. Å lukke begge proxy-socketene umiddelbart kan forårsake nettopp denne sekvensen. I et TCP-relé betyr en ryddig avslutning i én retning ikke at den andre retningen er ferdig.

Se for deg en klient som sender en forespørsel, stenger sendesiden 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 av hverandre. Den må føre signalet om at inndata er slutt videre, etter å ha ført bytene som kommer foran det videre.

Tøm køen før EOF sendes videre

Ved mottak av ikke-null størrelse på en TCP-strøm indikerer en returverdi på null at den innkommende strømmen er ryddig avsluttet. Merk den leseretningen som ferdig. Slutt å vente på mer inndata fra den, men behold byte som allerede ligger 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, bruk den speilvendte operasjonen etter at svarkøen er tømt.

Lukking av deskriptorene hører hjemme på det punktet der begge retninger og deres ventende buffere er ferdige, eller der en feil eller kansellering krever avslutning. Hold en begrenset tidsgrense for en motpart som aldri fullfører sin gjenværende halvdel.

Klarhet er en invitasjon til å lese

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

Ikke se 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 tolker meldinger må fortsatt respektere HTTP-innramming, og en TLS-avsluttende proxy har også en TLS-avslutningsprotokoll. Hold disse protokollvalgene over det retningsbestemte TCP-reléet.

Relaterte artikler