Como está escrito en Wikipedia, cerrar la conexión TCP debería usar paquetes FIN->(FIN,ACK)->ACK. Sin embargo, cuando uso la función close () para cerrar el socket, no veo el paquete FIN, se envía instantáneamente un paquete (FIN, ACK) del servidor al cliente, luego el cliente también cierra la conexión enviando (FIN, ACK) y el servidor responde con paquete ACK. Entonces, ¿dónde está el paquete FIN que falta (tal vez se fusionó con FIN, ACK)?
La secuencia de cierre también puede ser diferente y no necesita tener FIN+ACK dentro del mismo paquete:
Los protocolos como HTTP admiten un apagado unilateral, por ejemplo, el cliente envía los datos de la solicitud seguidos de un FIN para notificar al servidor que no enviará más datos. Pero seguirá recibiendo los datos enviados por el servidor. El servidor reconocerá el FIN como lo hizo con todos los datos antes. Una vez que el servidor haya terminado, enviará su propio FIN que el cliente ACK. En este caso tienes
1. client: FIN (will not send more) 2. server: ACK (received the FIN) .. server: sends more data..., client ACKs these data 3. server: FIN (will not send more) 4. client: ACK (received the FIN)Tenga en cuenta que el paquete que ve en el paso n.º 1 también puede tener un ACK. Pero este ACK solo reconoce los datos enviados antes por el servidor. Si el servidor no tiene más datos para enviar, también podría cerrar la conexión. En este caso, los pasos 2+3 se pueden fusionar, por ejemplo, el servidor envía un FIN+ACK, donde el ACK reconoce el FIN recibido por el cliente.
Si un lado envía su FIN, la conexión se llama semicerrada. Se cierra por completo una vez que ambos lados envían su FIN y reciben el ACK para el FIN, sin importar si lo hacen en 3 o 4 paquetes.
Ya debe haber recibido el FIN para poder enviar un FIN/ACK. ¿Estás cerrando en respuesta a la lectura de EOS?