Observo o seguinte cenário no WireShark:
Oproblemaquevejoaquiéquedepoisdereceber[FIN,ACK]
doservidor(4090)ereconhecê-lo(4092),oclientehttptentaenviaroutrasolicitaçãoHTTPemvezdeimediatamentefechar(eprovavelmenterestabelecer)aconexãoTCP.Pareceque[FIN,ACK]
ésimplesmenteignoradopelosclientesHTTP.
DeacordocomaRFC7230(6.3),oprotocoloHTTPespecificaseumecanismodefornoparagerenciamentodeconexãopersistenteusandoConnection
headers.Funcionamuitobem,jáqueésuportadoporclienteseservidores.
Noentanto,oHTTPgeralmenteéexecutadoemcimadoTCP.OgerenciamentodeconexãoTCPnãotemidéiasobreoprotocolonapartesuperiorepodeserusadoindependentementedoHTTP.MasosclientesHTTPnãosuportamomanuseio(eprovavelmenteelesnãodeveriam,eledeveriasersuportadononíveldosoquete).Noentanto,osservidoresoutilizam,porquepermitefecharaconexãosemenviarsolicitaçãoHTTPadicional.Porexemplo,nginxenviaFIN
package,quandoaconexãoéexpiradaouem
NOTA Quando o cliente HTTP recebe RST
do servidor, ele fecha a conexão. E parece ser feito no nível do socket, já que não consigo encontrar nada relacionado a isso no código-fonte dos clientes HTTP.
FIN
pelos clientes, enquanto os servidores a usam, parece estar completamente errado. RST
é tratado no nível do soquete, mas FIN
não é? PS Eu sou capaz de reproduzi-lo usando clientes HTTP em Python 2/3, Java e httperf
utilitário escrito em C. Então eu acredito que é comum para clientes HTTP ignorar FIN
message. Eu quero entender o porquê.
Tags networking connection nginx http tcp