O saúdo SOCKS completouse. Agora o relé le do cliente, escribe no destino, espera unha resposta completa e só entón volve ler do cliente. Esa secuencia pode bloquear unha aplicación perfectamente válida.

Unha vez establecido o túnel TCP, SOCKS non define as mensaxes que hai dentro. O destino pode enviar primeiro. Ambos os lados poden enviar de forma independente. Un lado pode enviar un rexistro curto e despois esperar a resposta do outro.

Retransmita bytes, non transaccións supostas

Unha chamada de recepción devolve os bytes dispoñibles segundo os seus indicadores e o estado do socket. Non lle di a un relé xenérico que a resposta da aplicación está completa. Esperar a que se encha un buffer grande arbitrario pode impedir reenviar a mensaxe pequena que o par necesita para continuar.

Use o modelo de concorrencia existente da aplicación para atender ambas as direccións: un bucle de eventos, E/S asíncrona ou outro deseño escollido deliberadamente. O comportamento importante é que o progreso nunha dirección non requira unha fronteira de mensaxe inventada na outra.

Manteña dous buffers pendentes limitados

Os datos lidos do cliente poden seguir esperando chegar ao destino, mentres que os datos do destino esperan chegar ao cliente. Seguia eses bytes pendentes por separado.

Un envío pode escribir menos bytes dos solicitados. Conserve a parte non escrita; non a descarte nin reproduza todo o buffer. Un socket temporalmente non escribible é motivo para esperar o evento de dispoñibilidade correcto, non para xirar continuamente.

Limite os buffers. Se o destino é lento, seguir lendo datos de cliente ilimitados só traslada a cola á memoria do relé. A contrapresión significa pausar as lecturas cando o buffer pendente correspondente está cheo e retomar cando as escrituras liberan espazo.

Un final nunha dirección necesita unha política

TCP pode pechar unha dirección de envío mentres a outra dirección aínda ten datos útiles. Decida como propagar esa condición despois de drenar os bytes almacenados, e distinga o peche ordenado dun erro ou dun prazo.

Nada disto esixe que o relé descifre ou analice a carga útil da aplicación. Necesita un manexo correcto do fluxo. Aumentar só o tamaño do buffer non pode reparar un relé que espera o lado equivocado ou supón que cada lectura corresponde a unha solicitude enteira.

Artigos relacionados