Existen varias implementaciones del protocolo TCP, cada una con sus ventajas e inconvenientes. Para evitar la repetición de trabajo es común que unas se basen en otras, lo que lleva a que también compartan los mismos fallos.
Historia Las primeras implementaciones surgieron en los años 1980 por parte de los sistemas BSD, que derivaban de los UNIX. En esta época aún se estaba desarrollando la historia de Internet.
thumb|300px|right|Algunas versiones de BSD, y características TCP ofrecidas.
4.1aBSD, publicada en junio de 1981, ya tenía una versión preliminar de TCP/IP, basada en el trabajo de Bolt, Beranek y Newman (BBN) pero algo modificada. La versión 4.1cBSD (1982) tuvo una implementación mejor, y se incluyó en 4.2BSD (1983), que fue la primera que se distribuyó a gran escala. DARPA decidió que sería esta versión la que se quedaría en 4.3BSD (junio de 1986); además, en esta versión se mejoró su rendimiento.
De 4.3BSD deriva 4.3BSD-Tahoe (junio de 1988), y de ésta 4.3BSD-Reno (1990), en el camino para la creación de 4.4BSD (1993). Los nombres Tahoe y Reno son los que identificarán a las implementaciones TCP de estos sistemas. Corresponden a ciudades del estado de Nevada (Estados Unidos) famosas por sus casinos: Tahoe, Reno (Nevada); también Las Vegas sirve como nombre a otra versión de 1994.
Un listado del nivel de implementación de TCP en cada una de estas versiones es:
1983: 4.2BSD: primera versión ampliamente disponible de TCP/IP 1986: 4.3BSD: mejor rendimiento de TCP 1988: 4.3BSD-Tahoe: inicio lento ("slow-start"), control de congestión ("congestion avoidance"), retransmisión rápida ("fast retransmit") 1990: 4.3BSD-Reno: recuperación rápida ("fast recovery"), predicción de cabeceras TCP, cabecera SLIP, compresión 1993: 4.4BSD: multidifusión, modificaciones para canales de alto rendimiento (RFC 1323) 1994: 4.4BSD-Lite
Existe poca documentación técnica que recoja los cambios entre versiones. En los libros de Karels y McKusick de 1986
se describen los cambios de 4.2BSD a 4.3BSD, y Jacobson describe en 1990 los cambios de 4.3BSD-Tahoe a 4.3BSD-Reno. (, pág. 5)
Implementaciones base Durante el inicio de TCP hubo tres implementaciones base:
Tahoe, la de 4.3BSD-Tahoe, derivado de 4.3BSD Reno, la de 4.3BSD-Reno, derivada de Tahoe, y usada después en 4.4BSD-Lite Vegas, que mejora a Reno en velocidad entre un 40 y 70% (según página de Vegas, de 1994)
Es especialmente importante la implementación de TCP de 4.4BSD-Lite, que salió en junio de 1994, y es la que se toma como referencia por haber sido la base de muchos sistemas actuales. Hoy en día, se sigue usando para enseñar cómo funciona un sistema TCP.
Muchas implementaciones actuales se han basado en alguna de estas tres en algún momento. Sin embargo, si hoy se creara una nueva, probablemente se basaría en una de las modernas (como la de FreeBSD, OpenBSD, NetBSD o BSD/OS) antes que en la original de 4.4BSD-Lite.
La reutilización del código de BSD fue posible debido a su licencia (licencia BSD), que permite que sea usado en otros sistemas, tanto software libre como propietario. Por ejemplo, Microsoft Windows usa código derivado de BSD en su implementación de TCP, e incluye herramientas de red para consola originales de BSD (detalles). También Darwin BSD, el sistema base de Mac OS X, parcialmente deriva de FreeBSD 5. Otros UNIX comerciales, como Solaris, también incluyen código BSD.
Derivadas Se han hecho varias versiones que mejoran a Tahoe, Reno y Vegas. Por ejemplo, según, las más populares son:
Tahoe sin "Fast Retransmit": incluye inicio lento y control de congestión Tahoe: incluye también retransmisión rápida Reno: añade recuperación rápida a Tahoe New-Reno: versión de Reno con un sistema mejorado de recuperación rápida Reno Plus: en algunos sistemas Solaris SACK: usa confirmaciones (ACK) selectivas
Además de Vegas, Peach, ATCP, y otras (Westwood, Hybla, etc.). En el mismo artículo se describen sus características, y, de entre las 6 de esta lista, se concluye que New-Reno es la implementación más fiable.
Otro estudio sí que tiene en cuenta a Vegas, y concluye que Vegas es mejor que el resto de implementaciones probadas (Tahoe, Reno, New-Reno y SACK).
Implementaciones según sistema operativo Cada sistema operativo muestra un comportamiento distinto en cuanto a TCP, pero algunos se parecen entre ellos porque han compartido código (principalmente, el de BSD). A veces se clasifican los sistemas según a qué implementación base se parecen (Tahoe, Reno, New-Reno, Vegas, etc.). Los que usan un código escrito desde cero son los que más se diferencian del resto.
BSD El 4.4BSD original (implementación base) permite cuatro familias de protocolos: TCP/IP, Xerox Network Services (XNS), OSI, sockets IPC ("UNIX domain sockets"). En, pág. 9, se explica cómo está organizado el código dentro del kernel, y en el resto del libro se explican las funciones de red.
Otro estudio, modelización, y análisis de rendimiento del BSD original es, que además cita estudios anteriores hechos sobre este código. Se explica también el funcionamiento de implementaciones derivadas, como la de FreeBSD, a la hora de montar un enrutador por software.
FreeBSD, NetBSD y OpenBSD son todos derivados de BSD, y por eso han heredado algunos de sus protocolos de red.
Linux
El código de TCP en Linux se escribió de forma independiente al resto de implementaciones. Hay que tener en cuenta que, al estar bajo la licencia GPL, no podría haber usado el código de los sistemas BSD, ya que éstos usaban la licencia BSD original (con la cláusula de publicidad), incompatible con la GPL (véase ). Esta cláusula se quitó mucho más tarde, en 1999.
Todos los detalles de implementación de TCP en Linux están visibles y explicados en su código fuente, disponible en . La parte relacionada con TCP en IPv4 está en el directorio net/ipv4/. Aquí se encuentran archivos importantes, como: tcp_ipv4.c tcp_input.c tcp_output.c
En net/ipv6/ está el código para implementar TCP sobre IPv6. Es una adaptación del código para IPv4.
En un sistema en ejecución, varios parámetros de TCP se pueden ver y modificar mediante los archivos del directorio /proc, por ejemplo /proc/sys/net/ipv4/
Existen varios libros que explican los detalles de implementación de TCP/IP en el núcleo Linux y analizan su código. Uno de ellos, que describe hasta la versión 2.4, es:
thumb|300px|right|Varios algoritmos de control de congestión seleccionables al compilar Linux (versión 2.6.17.4)
Linux implementa muchos algoritmos de control de congestión. Por ejemplo, está SACK, Westwood+ (ver artículo explicativo: ), Reno, NewReno, FACK (forward acknowledgement), ECK, H-TCP, y varios más. Desde la versión 2.6.19 se usa por defecto CUBIC con NewReno como salvaguarda.
Se puede cambiar el algoritmo usado por defecto ajustando las opciones de compilación, tal como se ve en la imagen adjunta. Aunque al ser modular, también puede ser cambiado en caliente modificando /proc/sys/net/ipv4/tcp_congestion_control.
Linux 2.4 usando el algoritmo SACK (acuse de recibo selectivo) consigue un rendimiento mayor que otros sistemas que también usan SACK (como OpenBSD y FreeBSD), según
Comparando las implementaciones modernas (2004/2005), se ve que han evolucionado por caminos distintos, pero que todas aguantan bien la congestión de red (a diferencia de la implementación original de BSD). Según las pruebas, Linux 2.6 el que mejor rendimiento da (de entre FreeBSD 5.3, OpenBSD 3.5, y Windows XP Service Pack 2).
Como el desarrollo de Linux es un proceso abierto al público, en Internet se encuentran páginas que explican los problemas que daba su implementación de TCP, y cómo se han solucionado. Por ejemplo: mejora de rendimiento en la versión 2.0.36 (marzo de 1999), problemas de TCP detectados al hacer una comparativa (1999), ajustes para 2.4 y 2.6 (febrero de 2006), problemas en los algoritmos de TCP en Linux 2.6.16.3 (junio de 2006), entre otros. Es habitual que estos fallos se detecten cuando alguien está escribiendo un documento técnico o comparativa. En caso de comportamiento extraño, un estudio del código fuente sirve para confirmar las sospechas y poder corregir el error en Linux. Como ejemplo, véanse los siguientes artículos sobre redes inalámbricas:
o sobre BIC-TCP:
.
Windows
Según uno de los programadores del código de red de Windows NT/2000:
Microsoft estaba programando en 1990 el sistema de red para Windows NT. El protocolo usado entonces era uno llamado NetBEUI, pero se vio que TCP/IP se volvía cada vez más importante, y por eso se decidió incluirlo en NT. De esta forma, Microsoft se hacía compatible con los UNIX (que usaban TCP/IP desde 1982) a la vez que se posicionaba en contra de Novell Netware, que dominaba el mercado de redes en los años 90 con su protocolo IPX/SPX (incompatible con TCP/IP hasta 1999).
El hecho de incluir TCP/IP en Windows obligó a cambiar la interfaz de acceso a red de NetBEUI (que era NetBIOS) por un sistema de sockets llamado Winsock, basado en el de BSD (los sockets Berkeley).
El propio código de TCP/IP (la pila) se compró a una compañía llamada Spider Systems. Su versión estaba basada (total o parcialmente) en el código de BSD y otros UNIX, ya que la licencia BSD lo permite (sólo requiere dar crédito al autor original). Sin embargo, usaba la interfaz STREAMS, una alternativa a los sockets Berkeley, que servía como capa de abstracción para los componentes de red como TCP e IP.
Esto hacía que la implementación fuera más lenta que si usara TCP/IP directamente, así que Microsoft escribió una pila TCP/IP nueva (quizás basándose en el código anterior), que incluyó en Windows NT y Windows 95. Por eso ambos sistemas muestran el mismo comportamiento en las pruebas (ejemplo:), que además es distinto al de otras implementaciones.
Junto con el código comprado a Spider Systems, se incluían utilidades de red para consola, como los programas para Telnet, FTP, rcp o rsh, sacados directamente de BSD. Éstos no se reescribieron, ya que funcionaban bien y no hay problemas con la licencia. Aún se muestra el copyright original, que es The Regents of the University of California (universidad de la que forma parte Berkeley, que es la B del BSD).
En cuanto a la parte técnica: en
se describen algunos detalles de implementación de TCP/IP en Windows 2000, incluyendo los RFC que cumple, la arquitectura de red, y los parámetros usados en TCP.
Macintosh
Los primeros ordenadores de Apple Computer usaban la familia de protocolos AppleTalk (ya incluidos en el Apple Macintosh original, en 1984). Con el tiempo, estos protocolos se sustituyeron por la familia TCP/IP.
A partir de la versión 7.5.1 de su sistema (System 7) se usó la implementación MacTCP, hoy considerada obsoleta y con problemas de compatibilidad con los protocolos actuales.
En mayo de 1995, Apple presentó, junto con su Power Mac 9500, la arquitectura Open Transport, que es la que reemplazaría a MacTCP (véase anuncio de 1995). m Se incluyó en la versión 7.5.2 del sistema, pero también se hizo disponible para versiones anteriores. Este entorno estaba basado en una implementación de STREAMS llamada Mentat Portable Streams y comprada a la empresa Mentat (más datos: ).
Open Transport funcionaba más rápido que MacTCP, por lo que tuvo buena acogida entre usuarios y programadores. Al ser un sistema STREAMS, permitía gran flexilidad al aplicar filtros a protocolos. Se incluía código para manejar TCP/IP, AppleTalk y dispositivos serie. Hay una descripción extensa en: .
Sin embargo, más adelante (al llegar Mac OS X) se abandonó el sistema Open Transport -basado en STREAMS- para adoptar los sockets Berkeley, mucho más comunes.
Mac OS X (de 2001) se desarrolló basándose en Darwin BSD, que está basado en FreeBSD 5 y por tanto tiene una implementación derivada de la de 4.4BSD. Existen diferencias entre FreeBSD y la versión Mac OS X (véase lista), pero no en cuanto a la implementación de TCP.