Klienten är klar med att skicka, proxyn ser EOF och svaret försvinner. Att stänga båda proxy-socketarna direkt kan ge exakt den sekvensen. I ett TCP-relä betyder ett ordnat slut i en riktning inte att den andra riktningen är klar.

Tänk dig en klient som skickar en förfrågan, stänger sin sändsida och väntar på svaret:

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

Proxyn har två TCP-anslutningar och två byteströmmar som rör sig oberoende av varandra. Den måste föra signalen om indatans slut vidare, efter att ha fört vidare byten som kommer före den.

Töm kön innan EOF vidarebefordras

Vid en mottagning av icke-noll storlek på en TCP-ström innebär en retur av noll att den inkommande strömmen är ordentligt avslutad. Markera den läsriktningen som klar. Sluta vänta på mer indata från den, men behåll byten som redan står i kön för den motsatta socketen.

När kön från klient till tjänst är tömd, anropa shutdown(service_socket, SHUT_WR) på en POSIX-socket. Det avslutar vidare överföring mot tjänsten medan riktningen från tjänst till klient förblir tillgänglig. När tjänsten är klar med sitt svar, tillämpa den speglade operationen efter att svarskön tömts.

Stängningen av deskriptorerna hör till punkten där båda riktningarna och deras väntande buffertar är klara, eller där ett fel eller ett avbrott kräver avslut. Håll en begränsad tidsgräns för en part som aldrig fullbordar sin återstående hälft.

Beredskap är en inbjudan att läsa

En läsbar socket kan ha data eller ett EOF-tillstånd. Anropa recv och tolka resultatet. Positiva tal är byte att vidarebefordra; noll är riktningens slut. På en icke-blockerande socket betyder EAGAIN eller EWOULDBLOCK att det just nu inte finns mer indata, medan EINTR kan kräva ett nytt försök. Ingen av dem är samma händelse som EOF.

Leta inte efter en FIN-flagga i bytebufferten som returneras. TCP levererar en ordnad byteström till detta API; paketgränser och FIN-segmentet är inte vanlig applikationsnyttolast.

Detta är livscykeln för en rå bytestunnel. En HTTP-proxy som parsar meddelanden måste fortfarande respektera HTTP-ramning, och en TLS-avslutande proxy har också ett TLS-nedstängningsprotokoll. Håll de protokollbesluten ovanför det riktningsstyrda TCP-reläet.

Relaterade artiklar