TCP no “envía datos en una secuencia de bytes”. El concepto de una secuencia de bytes es simplemente una abstracción que proporciona TCP en ambos extremos de una conexión (lector y escritor). ¿Por qué bytes? TCP envía datos en paquetes, y esos paquetes tienen cierto número de bytes de contenido en cada paquete.
Lo que TCP hace es proporcionar una abstracción que permite al remitente escribir bytes a ciegas en una abstracción de flujo de bytes proporcionada por TCP, y el remitente puede solicitar en cualquier punto arbitrario que se envíen por la fuerza los bytes escritos previamente, que aún no se han enviado.
Esta abstracción permite que una implementación de TCP administre dos porciones diferentes de datos para enviar:
- ¿Cómo puede una aplicación de usuario leer directamente desde una tarjeta de interfaz de red cuando usa la tarjeta Solarflare?
- ¿Qué dispositivos se utilizan en cada capa del modelo OSI?
- Cómo averiguar ISP desde una dirección IP
- ¿Cuáles son los medios utilizados para identificar a un usuario de una manera única, aparte de las cookies y la dirección IP?
- ¿Qué startup puede identificar clientes potenciales a través de la dirección IP?
1) La porción de datos que aún no se ha enviado, que se está almacenando en el búfer por una de varias razones (generalmente porque es más eficiente esperar a que se recopile una cierta cantidad de datos en el búfer en lugar de enviar cada byte en su propio ¡paquete!); y
2) La porción de datos ha sido enviada, pero para la cual no se ha recibido un acuse de recibo correspondiente. Estos datos (bytes) deben mantenerse (¡aunque ya se hayan enviado!) Porque el remitente debe poder enviar repetidamente esos bytes hasta que se reciba un reconocimiento de esos bytes, que es lo que hace que TCP sea un protocolo “confiable”.
La razón por la que un remitente puede escribir ciegamente en la abstracción de flujo de bytes TCP es que la implementación de esa abstracción puede bloquear al escritor (es decir, puede optar por no regresar) cuando se llenan las memorias intermedias de envío, es decir, esperar a que se envíen los datos. la red y ser reconocido por el destinatario , lo que permite reclamar la (s) parte (s) reconocida (s) de las memorias intermedias. Una vez que haya más espacio para almacenar bytes en el búfer, el control puede devolverse al código (proceso, subproceso, etc.) que está escribiendo bytes en la abstracción de flujo de bytes TCP.
Si aún suena complejo, vuelva a leerlo nuevamente hasta que no suene complejo. Este es un concepto muy simple; desafortunadamente está hecho para ser mucho más complejo de lo que es (y me disculpo si agregué esa complejidad con mi respuesta). Ver también: ¿Por qué NIO es mucho más eficiente que BIO, a pesar de que NIO no guarda ningún círculo de CPU?