16TCP 628KB May 16 2016 05:03:54 PM

Anuncio
UDPUDP-TCP
Protocolo UDP – User Datagram Protocol
• UDP es un protocolo de transporte estándar que se define en la RFC 768 - "User
Datagram Protocol“. Campo IP Protocol: 17.
• Toda implementación TCP/IP que no se use exclusivamente para ruteo incluye
UDP.
• Para IP, UDP es básicamente una interfaz de aplicación. No añade fiabilidad,
control de flujo o recuperación de errores a IP. Simplemente sirve como
"multiplexor/ demultiplexor" para enviar y recibir datagramas, usando los puertos
para dirigir los datagramas.
• UDP suministra un mecanismo para que una aplicación envíe un datagrama a
otra. Se considera que la capa de UDP es muy sencilla y en consecuencia tiene
poco "overhead", pero requiere que la aplicación se responsabilice de la
recuperación de errores y demás cuestiones que hagan a la confiabilidad en la Tx.
• Las aplicaciones que envían datagramas a un host necesitan identificar un
objetivo más específico que la dirección IP, ya que los datagramas suelen dirigirse
a procesos concretos y no a todo el sistema. UDP permite hacer esto al hacer uso
de los puertos. Concepto de socket.
Ports TCP/UDP
• Un puerto es un número de 16 bits que identifica en un host el proceso que está
asociado a un datagrama. Existen dos tipos de puertos:
• Puertos Bien-conocidos("well-known"): Identifican a los servidores estándar, por
ejemplo Telnet usa el puerto 23. Los puertos bien-conocidos se hallan en el rango de 1
a 1023. La mayoría de los servidores requieren sólo un único puerto. Una excepción
es el servidor BOOTP que usa dos: el 67 y el 68 para Cliente y Servidor. La razón de
ser de los puertos bien-conocidos es permitir a los clientes encontrar a los servidores
sin necesidad de información de configuración. Los números de los puertos bienconocidos se definen en STD 2 - Números asignados de Internet("Assigned Internet
Numbers").
• Puertos Efímeros: Los clientes no necesitan puertos bien-conocidos porque inician la
comunicación con los servidores y los datagramas UDP enviados al servidor contienen
su número de puerto. El host en funcionamiento proporciona un puerto a cada proceso
cliente mientras este lo necesite. Los números de puertos efímeros tienen valores
mayores de 1023, por lo general en el rango de 1024 a 5000. Un cliente puede usar
cualquier número en ese rango, siempre que la combinación <protocolo de transporte,
dirección IP, número de puerto> sea unívoca .
• El esquema se sostiene para TCP, aunque sus puertos son totalmente
independientes de los de UDP. Normalmente, un servidor usará TCP o UDP, aunque
hay excepciones. Por ejemplo, el DNS usa tanto el puerto 53 de UDP como el 53 de
TCP.
Ports TCP/UDP
• En este sitio se puede encontrar un listado de ports bien conocidos:
http://www.iss.net/security_center/advice/Exploits/Ports/default.htm
• Clickeando sobre cada número se obtendrá una breve explicación de la
aplicación referenciada.
• Algunas aplicaciones pueden funcionar sobre UDP o TCP con el mismo número
de puerto.
• Existen puertos bien conocidos por encima de 1023, por ejemplo el puerto 8080
queda reservado como puerto alternativo para un servidor web Apache.
• Existen programas que permiten determinar cuáles puertos se encuentran
¨abiertos¨ (en estado LISTEN, preparados para recibir requerimientos) en una
máquina y lo hacen a través de una red. El sentido puede deberse al montaje de
un ataque: una vez descubiertos los puertos abiertos, se pueden buscar
vulnerabilidades para atacar la máquina objetivo.
Protocolo UDP
• Cada datagrama UDP se envía encapsulado en un sólo datagrama de IP. Aunque el
datagrama IP se fragmente durante la transmisión, la implementación de IP que lo
reciba lo reensamblará antes de pasárselo a la capa de UDP.
• Todas las implementaciones de IP deben aceptar datagramas de 576 bytes, lo que
significa que si se supone un tamaño máximo de 60 bytes para la cabecera IP, queda
un tamaño de 516 bytes para el datagrama UDP, aceptado por todas las
implementaciones. Muchas implementaciones aceptan datagramas más grandes, pero
no es algo que esté garantizado.
• El datagrama UDP tiene una cabecera de 8 bytes:
Puerto origen: puerto del proceso que envía el datagrama.
Puerto destino: puerto destino en el host de destino.
Longitud: en bytes del mismo datagrama de usuario, incluyendo la cabecera.
Checksum: campo opcional consistente en el complemento a uno de 16 bits de la
suma en complemento a uno de una pseudocabecera IP, la cabecera UDP y los datos
del datagrama UDP. La pseudocabecera IP contiene las direcciones IP de origen y
destino, el protocolo y la longitud del datagrama UDP.
Protocolo UDP. Pseudoheader para Checksum
Protocolo UDP - Aplicaciones
• La API (Application Interface) ofrecida por UDP se describe en el en RFC 768.
• Proporciona:
Creación de nuevos puertos para la recepción.
Operación de recepción que devuelve los bytes de datos recibidos y una indicación del
puerto y la dirección IP de origen.
Operación de envío que tiene como parámetros los datos, los puertos de origen y
destino y las direcciones IP.
• La forma en que se implementa esto queda a elección del cada distribuidor.
• Recordar que IP y UDP no proporcionan una entrega garantizada, control de flujo ni
recuperación de errores, así que estos deberán ser implementados por la aplicación.
Aplicaciones estándar que usan UDP son:
TFTP("Trivial File Transfer Protocol")
DNS("Domain Name System")
RPC("Remote Procedure Call"), usado por el NFS("Network File System")
NCS("Network Computing System")
SNMP("Simple Network Management Protocol")
Protocolo UDP - Aplicaciones
• Algunas aplicaciones, tales como TFTP agregan mecanismos rudimentarios para dar
confiabilidad a la Tx.
Streaming media: Requiere poseer velocidad de CPU y BW suficiente para soportar
las velocidades requeridas. También exige crear caminos de baja latencia en el SO
para evitar el buffer underrun (buffer llenándose de datos a menor velocidad que
cuando se vacía al ser leído). Por ejemplo radios en Internet. UDP + protocolos QoS
Real-time multiplayer games Adaptable UDP / TCP
VoIP: Emplean protocolos de sesión para controlar la conexión y desconexión de
una llamada, junto con codecs de audio para codificar voz y poder Tx sobre una red IP
(algunas implementaciones se basan en voz comprimida de ancho de banda angosto
y otras soportan estéreo de alta fidelidad). RTP + UDP
• Las aplicaciones que necesariamente requieran confiabilidad deben usar TCP.
• TRACERT, TRACEROUTE
Protocolo TCP – Transmission Control Protocol
Existen distintos tipos de redes con distintos modos de funcionamiento: de
conmutación de circuitos, de conmutación de paquetes, orientado a la conexión,
sin conexión. Cada tipo de red lleva asociado una serie de protocolos, pero por
encima de la capa de red existen los llamados protocolos de aplicación y otros
que le dan soporte.
Los protocolos de capa de transporte ocultan a las aplicaciones los servicios
proporcionados por las capas de red, proporcionando servicios independientes de
los servicios de red.
En la arquitectura TCP/IP existen TCP (Transmission Control Protocol) y UDP
(User Datagram Protocol). TCP proporciona un servicio orientado a la conexión.
UDP proporciona un servicio sin conexión. Utilizar uno u otro depende de los
requisitos de la aplicación en cuestión.
Protocolo TCP
TCP y UDP corren como procesos / aplicaciones dentro del núcleo del SO o a
veces como paquetes de librerías enlazados a la aplicación.
La mayoría de las aplicaciones en red se basan en el paradigma Cliente Servidor.
TCP proporciona confiabilidad al servicio de best effort ofrecido por IP:
UDP proporciona un servicio sin conexión no confiable, válido para aquellas
aplicaciones para los cuales resulta aceptable.
Utilizar uno u otro depende de los requisitos de la aplicación en cuestión. De
todas maneras la comunicación es end-to-end.
Debe haber una forma en que ambos protocolos, TCP y UDP, distingan las
diversas aplicaciones que sobre ellos se apoyan. Esta funcionalidad se expresa
en un campo de la cabecera de ambos que consiste en los números de puerto,
tanto fuente como destino.
En general, del lado de la aplicación Cliente, el número de puerto tiene un
significado local, asignándose un nuevo número cada vez que un Cliente solicita
una transferencia. A estos números de puerto clientes se los denomina, por ello,
puertos efímeros. Normalmente van del 1024 al 5000.
Los números de puerto de los Servidores, por el contrario, son fijos y se
denominan puertos bien conocidos. Normalmente van del 1 al 1023 (por ejemplo
FTP 21)
Protocolo TCP
TCP ofrece un servicio bidireccional para transferencia de datos confiable.
Los datos en TCP se transmiten en segmentos cuyo tamaño depende de la MTU
(Maximum Transmission Unit) (MSS, Maximum Segment Size). Cada vez que
TCP transmite un segmento inicia un timer y se espera un ACK del otro extremo.
Si no lo recibe, inicia una retransmisión. Se denomina a esta estrategia de
timeout y retransmisión. Cada segmento debe ser reconocido mediante un ACK,
pero esto puede realizarse de manera acumulativa.
Existe un checksum a nivel de (header+datos) TCP que es del tipo end-to-end. Si
en recepción se perciben errores, se descarta el segmento y no se transmite ACK.
Para contrarrestar la posible llegada de segmentos fuera de orden, TCP debe
contar con alguna información extra para reordenamiento.
TCP además debe ser capaz de descartar duplicados (por pérdida de ACK y
retransmisión).
Un mecanismo de control de flujo permite acomodar diferencias entre tamaños de
buffer y velocidad entre los extremos en comunicación.
A pesar que las aplicaciones poseen estructuras definidas, la misma es
transparente al protocolo TCP, cuyos extremos de comunicación tratan el flujo de
datos como un flujo de bytes. Se referencia a esta propiedad como orientado al
stream de bytes.
Se incluye un mecanismo de control de congestión.
Protocolo TCP - SOCKETS
Sockets permite la comunicación entre dos procesos diferentes en la misma o en
diferentes máquinas.
S trata de una forma de comunicación entre computadoras que utiliza el concepto
de file descriptors de Unix. En Unix toda acción del tipo I/O se realiza leyendo o
escribiendo un file descriptor. El file descriptor es un entero asociado con un
archivo abierto que puede ser una conexión de red, un archivo de texto o un
terminal.
Para un programador se trata de un concepto de bajo nivel ya que los comandos
del tipo read() y write() funcionan con sockets de la misma manera que lo hacen
con archivos o pipes. La diferencia entre sockets y los file descriptors normales se
establece en la creación del socket y en la incorporación de operaciones
especiales para control del socket.
Un Socket de Unix se usa en aplicaciones C-S. La mayoría de las aplicaciones
tipo FTP, SMTP, POP3, etc. usan Sockets para establecer conexión entre C y S.
Existen 4 tipos de Sockets pero sólo 2 son los más usados. Se supone que los
procesos se comunican sólo entre sockets del mismo tipo.
Stream Sockets: Entrega en red garantizada y en orden. Se usa TCP para Tx
datos. Si la entrega no es posibe, el Tx recibe un indicador de error. Los registros
de datos no tienen límites.
Datagram Sockets: Entrega en red no garantizada. Son sin conexión, se
construye un paquete y sencillamente se Tx. Usan UDP.
Protocolo TCP. Tipos de S y C
Iterative Server: Es el más sencillo. Se atiende un C por vez. Luego de completar
un requerimiento se atiende otro C. El segundo C debe esperar que el S se
desocupe.
Concurrent Servers: Este tipo permite correr múltiples procesos y servir varios
requerimientos a la vez. La forma más sencilla de hacerlo en Unix es por medio
de fork que abre un proceso child para manejar cada C por separado.
Las llamadas al sistema para establecer una conexión son diferentes para C y
para S, pero ambas incluyen la construcción básica de un socket. Ambos
procesos establecen sus propios sockets.
Del lado Cliente, se crea un socket con la llamada al sistema socket(). Se conecta
el socket a la dirección del S con la llamada al sistema connect(). Se Tx y Rx
datos con las llamadas al sistema read() y write().
Del lado Server se crea un socket con la llamada al sistema socket(). Se asocia el
socket a una dirección con la llamada al sistema bind(). En Internet un socket de
S tiene una dirección que consiste en un número de puerto en la máquina host.
Se escuchan conexiones con la llamada al sistema listen(). Se aceptan
conexiones con accept(). Esta llamada típicamente se bloquea hasta que un C se
conecta con el S. Se Tx y Rx datos con las llamadas al sistema read() y write().
Protocolo TCP. Tipos de S y C
Primitivas socket de Unix Berkeley. Se
trata de un conjunto de llamadas al
SO
que
constituyen
un
API
(Application Program Interface) para la
pila TCP/IP que subyace.
Los procesos de aplicación de usuario
(AP`s) que se comunicarán, primero
crean un canal de comunicación entre
el AP propiamente dicho y la entidad
local TCP. Este canal se denomina
socket o punto terminal.
Si se trata de una AP tipo Servidor,
esta enviará una secuencia de
llamadas a primitivas : socket(), bind(),
listen(), accept(). Cada llamada lleva
asociado un conjunto de parámetros,
un valor o más de salida y un código
de error.
Por su parte el AP Cliente envía una
primitiva socket() para crear un nuevo
socket para establecer una conexión.
A continuación editará un connect()
Protocolo TCP. Primitivas S
La primitiva socket() crea el socket y lleva asociados parámetros para determinar
el tipo de servicio (flujo de datos confiable), el protocolo (TCP), el formato de
direcciones (Internet).
Una vez creado el socket y asignados buffers de memoria para Tx y Rx, la
primitiva devuelve al AP un descriptor de socket para que se utilice luego en las
siguientes llamadas a primitivas.
A continuación la AP debe ligar el socket a una dirección, para eso se llama a la
primitiva bind() que lleva como parámetros el descriptor de socket y la dirección
del socket (dirección IP + Nº de port). Esta última es la dirección que la AP desea
asignar al socket que se acaba de crear. La llamada bind() devuelve un código de
error o éxito.
Para instruir al socket que atienda las llamadas entrantes se utiliza la llamada
listen() con parámetros descriptor de socket y longitud máxima de cola, permite
crear una cola para atender las solicitudes realizadas a la AP Servidora. Como la
anterior, devuelve un código de éxito o de error
Para aceptar llamadas entrantes, la primitiva accept() coloca a la AP Servidora en
modo bloqueado en espera de solicitudes provenientes de clientes TCP. Tiene
como parámetros el descriptor y la dirección del socket. Como la anterior,
devuelve un código de éxito o de error.
La secuencia socket(), bind(), listen() y acept() se conoce como apertura pasiva.
Protocolo TCP. Primitivas C
Por su parte el AP Cliente envía una primitiva socket() para crear un nuevo socket
para establecer una conexión. A continuación editará un connect() con
parámetros descriptor del socket, nº de puerto local, nº de puerto destino,
dirección IP destino, precedencia (TOS, se transfiere al protocolo IP), datos
opcionales (ejemplo nombre de usuario y contraseña). Luego de esta llamada la
AP pasa a estado bloqueado mientras que el protocolo TCP local inicia el
establecimiento de una conexión con el Servidor.
Las primitivas socket() y connect() constituyen una apertura activa.
Protocolo TCP. Primitivas C-S
Tanto el TCP Cliente como el Servidor pueden soportar múltiples conexiones al
mismo tiempo para distintos clientes.
Existe un registro de conexión que permite distinguir entre ellas.
El registro de conexión incluye un identificador (par de sockets), MSS, Nº de
Secuencia Inicial usado en cada sentido, Valor de precedencia, Tamaño de la
Ventana para Control de Flujo y variables de estado asociadas al funcionamiento
del propio protocolo.
Cuando la AP Servidora recibe la solicitud de una nueva conexión, se desbloquea
y crea una nueva instancia de sí misma por si tuviera que atender otras
conexiones. Esto se realiza con la primitiva fork() que crea un nuevo socket entre
la nueva instancia de AP y el protocolo TCP local. El proceso padre regresa al
estado bloqueado a la espera de nuevas solicitudes.
Recién en este punto las AP`s Cliente y Servidor pueden comenzar a intercambiar
datos en ambos sentidos con las primitivas send() y receive().
Protocolo TCP. Primitivas C-S
Cada socket se haya asociado a un buffer de Tx y otro de Rx. Generalmente
el buffer de Rx se utiliza para reordenar los datos antes de entregarlo a la AP
correspondiente. Send() coloca datos en el buffer de Tx del socket para que
la entidad local TCP los lea. Los parámetros incluyen descriptor del socket,
puntero al buffer que contiene el bloque de datos y su longitud en bytes (que
luego no tiene por qué volcarse en un único segmento).
Existe un parámetro asociado a la primitiva send(), denominado bit de push,
mediante el cual el AP local puede solicitar la entrega inmediata del bloque.
Existe también un bit de urgente que se utiliza en aplicaciones interactivas
(por ejemplo AP usuario abortando cálculo remoto) donde se envía el
comando urgente con el bit activado. El TCP local lo Tx junto con los datos
pendientes y detiene el envío de nuevos datos. El TCP remoto lo recibe e
interrumpe al AP que lee los datos marcados para actuar en consecuencia.
La primitiva close() o shutdown() se utilizan para liberar cada extremo de la
conexión: los registros de conexión se borran y la instancia creada por fork()
también.
Protocolo TCP. Header
Protocolo TCP. Header
Source Port /Destination Port: Nº puerto de 16 bits del proceso que origina/es
destinatario del segmento en el dispositivo fuente/destino. Si es Cliente será
efímero, si es Servidor será bien conocido.
El conjunto (Nº de puerto, Dirección IP) en cada extremo se denomina socket.
Un par de sockets identifican unívocamente una conexión TCP.
Sequence Number: Corresponde al número del primer byte de datos en el
segmento. Se refiere a la posición que ocupa en el stream de bytes original. Se
trata de un campo de 32 bits. En el mensaje original, de establecimiento de la
conexión (segmento SYN), el Nº de Secuencia lleva el ISN (Initial Sequence
Number) que corresponde al lado de la fuente de la conexión TCP. El primer byte
de datos llevará el Nº de Secuencia (ISN +1).
Acknowledgment Number: Cuando el bit de ACK está en 1, el segmento se
toma como un acknowledgment (aunque además puede transportar datos) y este
campo contiene el Nº de Secuencia que el generador del segmento está
esperando que le llegue desde el otro extremo. Es decir este número se
corresponde al número del último byte recibido bien más uno. Luego de
establecerse una conexión, el bit de ACK de cualquier segmento será 1 y el
número de ACK representará un campo importante para el seguimiento del flujo
de datos.
Protocolo TCP. Header
Como TCP provee un servicio full duplex a las aplicaciones, pueden existir
datos viajando en ambas direcciones de manera independiente. Esto significa que
cada extremo llevará su propio Nº de Secuencia de los segmentos que se han Tx
y de aquellos que se hayan Rx.
En el protocolo TCP original no había forma de reconocer segmentos de datos
específicos. De esta forma es posible que existan ACK`s duplicados, que se
asocian a situaciones donde los segmentos llegan fuera de orden.
Data Offset: Especifica la cantidad de palabras de 32 bits que conforman el
header TCP, es decir multiplicado por 4 dará la cantidad de bytes del header. Es
necesario pues TCP cuenta con un campo de opciones. La longitud mínima del
header es de 4 (20 bytes) y la máxima es de 15 (60 bytes). Existen 20 bytes de
header fijo, lo cual implica un máximo de 40 bytes para opciones.
Protocolo TCP. Header
El campo de flags o bits de control consta de las siguientes banderas:
URG: Cuando está en alto significa que se ha invocado una transferencia
prioritaria para los datos encapsulados. En este caso el valor del puntero urgente
tiene validez.
ACK: En alto implica que debe tomarse el segmento como un ACK e interpretar el
campo Ack Number como el Nº de Secuencia próximo que se espera recibir.
PSH: Cuando está en alto se solicita al protocolo TCP en Rx que se suba lo más
rápido posible estos datos a la Aplicación receptora.
RST: Se coloca en alto cuando el Tx encuentra un problema y desea resetear la
conexión.
SYN: Bit encendido indicando que se está en la fase inicial de la conexión, en la
que deben sincronizarse los Nº de Secuencia (ISN) para establecer la conexión.
FIN: Cuando está en alto indica el cierre de la conexión solicitado por cualquiera
de los extremos.
Protocolo TCP. Header
Existe una extensión de los protocolos IP y TCP, del año 2001, definida en la RFC
3168, conocida como Explicit Congestion Notification (ECN).
ECN permite la notificación end-to-end de una situación de congestión en la red,
para evitar la pérdida de paquetes. Se trata de un mecanismo opcional que sólo
se puede usar si ambos extremos de la conexión lo soportan y la red también.
Básicamente, un router que entienda ECN, en vez de descartar un paquete,
marcará su header para anunciar la situación de congestión. El que Rx el
paquete, avisará al que Tx, para que reduzca su velocidad de transmisión.
El soporte de ECN sobre TCP es mediante flags.
El flag Nonce Sum (NS), se usa a modo de protección contra el ocultamiento
accidental o malicioso de paquetes marcados por el TCP Tx.
Los flags ECN-Echo (ECE) y Congestion Window Reduced (CWR) se usan para
avisar al Tx una indicación de congestión y para reocnocer (ACK) que el aviso fue
recibido.
Protocolo TCP. Header
Window: Indica el número de bytes de datos que el que envía el segmento está
dispuesto a aceptar de una sola vez desde el otro extremo. Generalmente se
asocia al tamaño del buffer de Rx. Este valor es ventana de Rx en el que lo envía,
que se corresponde a la ventana de Tx del que lo Rx. Se interpreta como la
cantidad de bytes, especificando como el primero el que se escribe en el campo
Ack Number, que el Rx puede aceptar en este momento.
Checksum: Un campo de 16 bits para protección de integridad calculado sobre el
datagrama completo + una pseudo header especial.
Urgent Pointer: Usado en conjunto con el flag URG, contiene un offset positivo
que debe sumarse al Nº de Secuencia para indicar la posición del último byte de
datos urgentes.
Opciones: campo variable.
Datos: no hay en SYN. Puede no haber en FIN. Si no hay datos para Tx se puede
Tx ACK solamente.
TCP Pseudo Header
TCP Pseudo Header
El Checksum protege de errores, aunque viola la tradicional arquitectura
OSI:
Entrega incorrecta de segmentos por errores en la dirección destino.
Protocolo incorrecto.
Longitud de Segmento incorrecta.
Lo interesante es que se provee esta protección extra sin necesidad de
enviar los campos del pseudoheader.
La desventaja es que el cálculo lleva más tiempo y recursos, aunque hoy
día eso no resulta en un problema. Al momento de idear el protocolo las
líneas eran mucho más ruidosas y valía la pena el esfuerzo.
TCP Opciones
Las opciones contempladas en el RFC 793 son:
• No operation: Para que el header se pueda rellenar a múltiplos de 4
bytes en el campo de opciones.
• Maximum Segment Size
TCP Opciones
Protocolo TCP. Inicio de Conexión
Hemos dicho que TCP es un protocolo orientado a la conexión.
Antes de poder intercambiar datos es necesario levantar una conexión entre los
dispositivos que se desean comunicar.
El procedimiento se conoce como establecimiento de la conexión e implica el
intercambio de mensajes que hacen que el ambos dispositivos pasen de un
estado (CLOSED) a un estado de operación normal (ESTABLISHED).
Cliente y Servidor se contactan a través de estos mensajes. Este último no sabe
a cuál Cliente atenderá antes que se cumpla esta fase.
Se necesita sincronizar los Nºs de Secuencia entre extremos, esto es cada uno
debe hacer saber al otro su ISN.
Se podrían intercambiar otros parámetros interesantes en el inicio de la
conexión.
Protocolo TCP. Inicio de Conexión
En caso de que sí se
encuentre abierto el puerto, el
lado servidor respondería a la
petición SYN válida con un
paquete SYN/ACK.
Normalmente una de las aplicaciones abre un
socket sobre un puerto TCP y se queda en
estado de LISTEN (apertura pasiva-S).
El lado cliente de una conexión realiza una
apertura activa de un puerto enviando un
segmento SYN inicial al servidor como parte de
la negociación en tres pasos.
En el lado del servidor se comprueba si el puerto
está abierto, es decir, si existe algún proceso
escuchando en ese puerto. En caso de no
estarlo, se envía al cliente un paquete de
respuesta con el bit RST activado, lo que
significa el rechazo del intento de conexión.
Finalmente, el cliente debería responderle al servidor con un ACK, completando así
la negociación en tres pasos (SYN, SYN/ACK y ACK) y la fase de establecimiento de
conexión. Es interesante notar que existe un número de secuencia generado por
cada lado, ayudando de este modo a que no se puedan establecer conexiones
falseadas (spoof)
Protocolo TCP. Timeout en Inicio
• Muchas veces la conexión no puede ser establecida. Por ejemplo si el
Servidor está caído no habrá contestación. Esto se puede simular en una
LAN desconectando el cable de la máquina Servidora antes de editar el
comando telnet.
• Lo interesante de notar es cada cuánto tiempo el cliente TCP intenta
enviar un SYN para establecer la conexión y por cuánto tiempo insiste hasta
declarar la conexión como no posible. Estos tiempos los maneja el SO.
• MSS: La máxima cantidad de datos que TCP puede enviar al otro extremo.
El tamaño del datagrama IP es 40 bytes mayor que el MSS (20 del header IP
+ 20 del header TCP). ¿Qué valores de MSS observaremos comúnmente en
una LAN?
Protocolo TCP. Inicio de Conexión
• Existe un Timer de
timeout asociado con la
Tx del primer segmento
SYN,
es
decir
al
establecer la sesión TCP.
• Empieza el timeout
cuando se Tx el SYN. Su
valor es de 75 seg.
• Si no se Rx respuesta
dentro de ese tiempo, se
aborta la conexión.
Protocolo TCP. Fin de Conexión
Protocolo TCP. Fin de Conexión
Protocolo TCP. Inicio y Fin
TCP Half Close
TCP permite terminar a un extremo mientras aún se Rx datos. En este
caso la aplicación debe cerrar con shutdown, no con close
TCP. Diagrama de Transición de Estados
LISTEN
SYN_SENT
SYN_RCVD
ESTABLISHED
ESTABLISHED
TCP. Diagrama de Transición de Estados
Servidor
Cliente
TCP. Diagrama de Transición de Estados
active close FIN_WAIT_1
pasive close CLOSE_WAIT
FIN_WAIT_2
App close LAST_ACK
TIME_WAIT
Timer 2MSL
CLOSED
FIN N
ack N+1
TCP. Diagrama de Transición de Estados
FIN_WAIT_2: El estado tiene asociado un Timer (10 min 75 seg) cuyo propósito
es evitar que la conexión quede en este estado para siempre si el otro extremo
llegara a caer, ya que todavía no ha enviado el FIN de cierre.
TIME_WAIT: Se ha recibido el FIN pero se asocia al mismo un Timer puesto que
el extremo que entra en este estado ha enviado un ACK en respuesta al segmento
FIN recibido del otro extremo y no sabe si este ACK fue entregado de manera
exitosa. El otro extremo podría ReTx el segmento FIN y este segundo segmento
FIN podría retrasarse en la red.
Si se permitiera que la conexión pasara al estado de CLOSED directamente,
entonces otro par de procesos de aplicaciones podrían aparecer, abrir la misma
conexión y el segmento FIN retrasado de la encarnación previa de la conexión
terminaría la encarnación nueva.
El timeout en este caso se ajusta a 2MSL (Maximum Segment Lifetime). Los
valores de implementación comunes de MSL son 30 seg,1 min ó 2 min.
TCP. Diagrama de Transición de Estados
TCP. Encarnaciones
En el estado TIME_WAIT se dispara un clock 2MSL. MSL significa
Maximum Segment Life.
La vida máxima de un segmento encapsulado en IP queda limitada por el
TTL. La RFC 793 fija el MSL en 2´.
El clock asegura la ReTx si se pierde el último ACK, pues el otro extremo
hará timeout y Retransmitirá el FIN.
Tampoco puede re-usarse el par de sockets durante este tiempo. De esta
forma se asegura que una nueva conexión usará otro par de sockets. Se
denominan encarnaciones a nuevas instancias de una conexión (usa el
mismo par de sockets).
El timer 2MSL asegura que segmentos retrasados de una encarnación
anterior de esta conexión no puedan ser malinterpretados como
pertenecientes a la actual por que si aparecen estos segmentos, los mismos
se descartan.
Problema de FIN_WAIT_2: El C ha Tx FIN y Rx Ack ¿Qué pasa si la
Aplicación Servidor no cierra? Podemos quedarnos esperando toda la
vida… Por este motivo muchas implementaciones setean un timer y pasan a
CLOSED cuando el mismo se agota (10 min 75 seg).
TCP. Flag de Push
Mientras que las aplicaciones manejan la velocidad y el momento con que
envían datos a TCP, no pueden controlar ni la velocidad ni el tiempo con
que TCP los envía a la red.
En el caso de Tx grandes archivos esto no sería un problema mientras TCP
acumule los datos en buffer y los vaya Tx a medida que la red ¨lo permita¨.
En el caso de una aplicación interactiva, no se desea que TCP acumule
los datos, sino que los Tx de inmediato pues de este modo la interactividad
sí tiene sentido.
En otras aplicaciones tipo Cliente Servidor se precisa lo mismo.
Para manejar esas situaciones se incluyó el flag de PUSH.
Cuando se invoca esta funcionalidad, TCP creará un segmento o varios que
contenga los datos en espera y los transmitirá con el flag de PUSH en alto.
Los límites de los mensajes quedan aún en manos de las aplicaciones.
En la práctica se suele encender el flag de PUSH cuando se vacía el buffer
de Tx.
Flag URG.
Para usarlo al Tx, el proceso que necesita enviar datos urgente habilita la
función y Tx los datos al módulo TCP. Este crea un segmento especial con
el flag de URG en 1.
También coloca en el Urgent Pointer un offset que apunta al último byte de
datos urgentes. Por ejemplo, si el segmento contiene 400 bytes de datos
urgentes seguidos de 200 bytes de datos comunes, el puntero se ajustará
en 400, que se empiezan a contar a partir del Nº de Secuencia.
Al Rx un segmento con el flag URG en 1, se analiza el Urgent Pointer y así
se determina la ubicación de los datos urgentes para entregárselos al
proceso con la indicación de que los datos fueron marcados como URG por
el Tx. El resto de los datos del segmento se procesa normalmente.
De este modo se sobrepasa sobre cualquier otro dato de menor prioridad
que ya haya sido puesto en cola para su Tx.
TCP. Segmento con Flag Reset
Lo edita un host cuando llega un pedido de conexión a un port que no tiene
un Servidor en LISTEN.
¿Qué pasaría si la comunicación se hace sobre UDP?
Una liberación abortiva se termina con RST. Una liberación ordenada con
FIN.
TCP. Segmento con Flag Reset
Lo edita un host cuando llega un pedido de conexión a un port que no tiene
un Servidor en LISTEN.
¿Qué pasaría si la comunicación se hace sobre UDP?
Una liberación abortiva se termina con RST. Una liberación ordenada con
FIN.
TCP. Conexiones Half Open
Si un extremo cae, el otro puede no enterarse.
Puede ser un problema distraer recursos en mantener conexiones que en
realidad no existen. Opción keepalive.
Ejemplo:
a) Conectar un C telnet a un S al port discard.
b) Desconectar el cable del S y reboot (simulando su caída).
c) Conectar el cable y tratar de Tx datos desde el C.
d) Observar protocolos involucrados.
TCP. Diseño de Servidores
Servidores Concurrentes: Cuando se acepta una conexión, se invoca un
nuevo proceso para el manejo del C. (fork o threads).
Se puede observar con netstat lo que sucede con el port del lado S.
Si no hay conexión: LISTEN. Cuando hay conexión: LISTEN (una línea),
ESTABLISHED (por cada cliente).
Observar los pares de sockets desde el mismo C.
¿Qué pasa si llegan nuevos requerimientos mientras el S está creando un
nuevo proceso o el SO está atendiendo otras prioridades?. Existe una cola de
longitud fija de conexiones que han sido aceptadas por TCP (3-way completo)
pero todavía la App no las ha aceptado. La App especifica un límite a dicha
cola, se conoce con el nombre de backlog. Antes de aceptar una nueva
conexión, TCP debe consultar este valor de backlog. Si hay lugar, la acepta.
Sino, ignora el SYN y, si la cola se vacía por que el S la atiende, TCP podría
aceptar la conexión más tarde.
Esto no afecta el número total de conexiones establecidas permitidas.
Puede suceder que TCP acepte conexiones que la App no desee. En este
caso la App puede rechazar por FIN o RST.
Bibliografía
TCP/IP Illustrated, Volumen 1 The protocols
W. Richard Stevens
Chapter 17, Chapter 18
Descargar