Red de conocimiento informático - Problemas con los teléfonos móviles - TCP cierra la conexión, no es fácil

TCP cierra la conexión, no es fácil

(1) Después de recibir primero, el kernel liberará inmediatamente los recursos de memoria (estado, datos) y el número de puerto ocupado por la conexión TCP.

(2) Después de que la capa de aplicación recibe lo primero, lo lee por primera vez. La lectura devuelve -1 y errno se establece en ECONNRESET. POLLIN se disparará nuevamente inmediatamente y luego la lectura devolverá 0.

(3) Después de que la capa de aplicación recibe por primera vez, escribe por primera vez. (En este punto, la operación de escritura devuelve un error e-EPIPE). El núcleo envía una señal SIGPIPE al proceso. El comportamiento predeterminado de esta señal es finalizar el proceso, por lo que el proceso debe detectarla para evitar que se finalice involuntariamente.

Por este motivo, solo hay dos situaciones en las que se cerrará la conexión TCP:

(1) RST, que equivale a un reinicio.

(2) Cerrar la escritura local (es decir, enviar el segmento FIN), pero no puede cerrar activamente la escritura entre pares, es decir, solo la mitad de las conexiones se pueden cerrar activamente y las conexiones en la otra dirección se pueden cerrar activamente. por el par.

(3) Si el extremo local recibe el segmento FIN del extremo opuesto (es decir, la lectura devuelve 0), no puede determinar si el extremo opuesto está cerrado (el extremo opuesto ha dejado de leer) o cerrado. (el extremo opuesto todavía puede leer) y está medio cerrado).

P: Entonces, ¿qué pasará si volvemos a escribir en este momento?

1. El cliente puede llamar a cerrar (CFD, close_wr), lo que significa cerrar su terminal de escritura en una dirección, así que lo leo como 0. En este caso, no quiero cerrar la conexión inmediatamente, pero la cerraré después de escribir todas las respuestas a este cliente.

2. Los clientes pueden solicitar una transacción (cfd). En este punto, si escribo (sfd, buf2, size2), me devuelve un error EPIPE.

P: ¿Qué debo hacer si la lectura devuelve 0?

Si se cierra en este momento depende de su solicitud. En términos generales, si la otra parte llama para cerrar, usted también puede cerrar. De lo contrario, no podrás cerrar. Por ejemplo, la otra parte le envía un paquete, apaga la computadora para escribir y luego llama a recv. En este momento, también puedes devolver uno o más paquetes. La conexión es semicerrada y puede durar para siempre. Extraído de Zhihu Hu Yuguang.

P: ¿El estado de fin_wait 2 y CLOSE_WAIT continuará para siempre?

Involucrando

/infuq/others/yyvoa7#cDrZq

/huangyimo/article/details/81297805

/QQ _ 35733751/ Artículo/Detalles/80146161

Preguntas complementarias de la entrevista

1 Cómo evitar el estado TIME_WAIT de TCP (alta concurrencia)