# High-Level Data Link Control

HDLC (High-Level Data Link Control, control de enlace de datos de alto nivel) es un protocolo de comunicaciones de propósito general punto a punto, que opera a nivel de enlace de datos. Se basa en ISO 3309 e ISO 4335. Surge como una evolución del anterior SDLC. Proporciona recuperación de errores en caso de pérdida de paquetes de datos, fallos de secuencia y otros, por lo que ofrece una comunicación confiable entre el transmisor y el receptor.
De este protocolo derivan otros como LAPB, LAPF, LLC y PPP.

## Características básicas del HDLC

HDLC define tres tipos de estaciones, dos configuraciones del enlace y tres modos de operación para la transferencia de los datos.
Los tres tipos de estaciones son:
   * Estación primaria: se caracteriza porque tiene la responsabilidad de controlar el funcionamiento del enlace. Las tramas generadas por la primaria se denominan órdenes.
   * Estación secundaria: funciona bajo el control de la estación primaria. Las tramas generadas por la estación secundaria se denominan respuestas. La primaria establece un enlace lógico independiente para cada una de las secundarias presentes en la línea.
   * Estación combinada: es una mezcla entre las características de las primarias y las secundarias. Una estación de este tipo puede generar tanto órdenes como respuestas.
Las dos posibles configuraciones del enlace son:
   * Configuración no balanceada: está formada por una estación primaria y una o más secundarias. Permite transmisión full-duplex y semi-duplex
   * Configuración balanceada: consiste en dos estaciones combinadas. Permite igualmente transmisión full-duplex y semi-duplex.
Los tres modos de transferencia de datos son:
   * Modo de respuesta normal (NRM, Normal Response Mode): se utiliza en la configuración no balanceada. La estación primaria puede iniciar la transferencia de datos a la secundaria, pero la secundaria solo puede transmitir datos usando respuestas a las órdenes emitidas por la primaria. En este modo no se inician las transmisiones en la estación secundaria a menos que se solicite. En este modo se utiliza en líneas multipunto, una cantidad de terminales están conectados a la computadora principal (host). La computadora encuentra a cada terminal y les solicita que envíen sus datos.
   * Modo balanceado asíncrono (ABM, Asynchronous Balanced Mode): se utiliza en la configuración balanceada. En este modo cualquier estación combinada podrá iniciar la transmisión sin necesidad de recibir permiso por parte de la otra estación combinada. Cualquiera de las estaciones puede iniciar las transmisiones sin esperar el permiso de la otra. Es más eficiente para los enlaces full dúplex; este modo trabaja en el nivel 2 (nivel enlace).
   * Modo de respuesta asíncrono (ARM, Asynchronous Response Mode): se utiliza en la configuración no balanceada. La estación secundaria puede iniciar la transmisión sin tener permiso explícito por parte de la primaria. La estación primaria sigue teniendo la responsabilidad del funcionamiento de la línea, incluyendo la iniciación, la recuperación de errores, y la desconexión lógica. Una estación secundaria en este modo puede iniciar las transmisiones sin permiso de la secundaria, pero la primaria aún retiene la responsabilidad de la línea, incluyendo la inicialización, recuperación de errores y la desconexión lógica.
El NRM suele usarse en líneas con múltiples conexiones y en enlaces punto a punto, mientras que el ABM es el más utilizado de los tres modos; debido a que en ABM no se necesitan hacer sondeos, la utilización de los enlaces punto a punto con full-duplex es más eficiente con este modo. ARM solo se usa en casos muy particulares.

## Estructura

HDLC usa transmisión síncrona. Todos los intercambios se realizan a través de tramas, HDLC utiliza un formato único de tramas que es válido para todos los posibles intercambios: datos e información de control.
En la Figura se muestra la estructura de una trama HDLC. Al campo de delimitación, de dirección y de control, que preceden al campo de información se denominan cabecera. La FCS junto con el otro campo de delimitación final que está a continuación del campo de datos se denomina cola.
Los campos de delimitación están localizados en los dos extremos de la trama, y ambos corresponden a la siguiente combinación de bits 01111110. Se puede usar un único delimitador como final y comienzo de la siguiente trama simultáneamente. A ambos lados de la interfaz entre el usuario y la red, los receptores estarán continuamente intentando detectar esta secuencia para sincronizarse con el comienzo de la trama. Cuando se recibe una trama, la estación seguirá intentando detectar esa misma secuencia para determinar así el final de la trama. Como se usa la secuencia 01111110 en la delimitación de las tramas, es necesario el uso del procedimiento denominado inserción de bits. Por el cual, el emisor cuando deba enviar una cadena que contenga una secuencia de cinco bits en 1 insertará inmediatamente después del quinto 1 un 0. El receptor, tras la detección del delimitador de comienzo, monitorizará la cadena de bits recibida, de tal manera que cuando aparezca una combinación de cinco 1 seguidos, el sexto bit se examinará. Si dicho bit es 0, se eliminará sin más. Si el sexto bit es un 1 y el séptimo es un 0, la combinación se considera como un delimitador. Si los bits sexto y séptimo son ambos igual a 1 se interpreta como una indicación de cierre generada por el emisor.
Por ejemplo, si se quiere transmitir la siguiente secuencia
   * 01101111011111011111100
HDLC lo modificara de esta manera
   * 0110111101111100111110100
| Flag | Dirección | Control | Información | FCS | Flag (comienzo de la trama siguiente) |
| 8 bits | 8 bits | 8 o 16 bits | Longitud variable, 0 o más bits, múltiplos de 8 | 16 bits | 8 bits |
A su vez en campo control puede tomar las siguientes codificaciones dependiendo del tipo de trama (información, supervisión y no numeradas que se verán más adelante):
   * I:Información:
| 1 | 2-4 | 5 | 6-8 |
| 0 | N(S) | P/F | N(R) |
N(S): Número de secuencia enviada.
N(R): Número de secuencia recibida.
P/F: Bit de Sondeo/Final ("Poll/Final")
   * S:Supervisión:
| 1-2 | 3-4 | 5 | 6-8 |
| 10 | S | P/F | N(R) |
S: bits para las tramas de supervisión (se explicará más adelante).
   * No numeradas:
| 1-2 | 3-4 | 5 | 6-8 |
| 11 | M | P/F | M |
M: Bits para las tramas no numeradas.
Cada dato que se envía, es encapsulado en una trama HDLC, esto añadiéndole un header y una cola. El header contiene una dirección HDLC y un campo de control HDLC. La cola contiene un campo de CRC (ciclic redundancy check).
Cada trama es separada por un delimitador o bandera con valor hexadecimal 7E. Este flag o bandera se puede utilizar para identificar el inicio de la siguiente trama.
Existen tres tipos de trama (DL_PDU): trama de información que transportan los datos del usuario, de supervisión y de gestión (o no numeradas). El orden de inyección de las tramas en el medio de transmisión es LSB (primero el bit menos significativo).
Las tramas de supervisión se utilizan para el reconocimiento de tramas, control de flujo y control de errores (siempre que no sea posible hacerlo mediante las tramas de información). Existen cuatro subtramas identificadas por el campo S de campo de control (del tipo de supervisión):
| 00 | RR (Receive Ready) |
| 01 | REJ (Reject) |
| 10 | RNR (Receive Not Ready) |
| 11 | SREJ (Selective Reject) |
Ready to Receive: Reconocimiento Positivo: RR N reconoce las tramas hasta la N-1 e indica que la próxima trama que espera recibir es la N.
Si tiene el bit P (poll/sondeo) activado indica que la estación primaria está sondeando a la estación secundaria.
Si tiene el bit F activado y es después de una selección, indica que el secundario está listo para recibir datos del primario. Si no es después de una selección, la estación secundaria indica a la primaria que no tiene más tramas que transmitir. Normalmente la estación secundaria envía tramas de información hasta que se le acaban los datos y entonces envía una trama RR con F activado para indicar finalización.
Ready Not to Receive: Reconocimiento Positivo No Listo Para Recibir: RNR N Reconoce las tramas hasta la N-1 e indica que ahora mismo no puede recibir más tramas.
Si tiene el bit P activado sirve para seleccionar la estación secundaria que recibirá los datos, indicando que la estación primaria no va a recibir datos.
Si tiene el bit F activado sirve para que la estación secundaria indique a la estación primaria que no está listo para recibir datos.
Reject: Rechazo: REJ N Reconoce las tramas hasta la N-1 e indica que a partir de la trama N hay que retransmitir.
Selective Reject: Rechazo Selectivo: SREJ N Indica que la trama N no llegó correctamente y debe ser retransmitida.
Las órdenes que se pueden encontrar en las tramas de gestión son:
| CÓDIGO | ORDEN | RESPUESTA |
| 00001 | SNRM | |
| 11011 | SNRME | |
| 11000 | SARM | DM |
| 11010 | SARME | |
| 11100 | SABM | |
| 11110 | SABME | |
| 00000 | UI | UI |
| 00110 | | UA |
| 00010 | DISC | RD |
| 10000 | SIM | RIM |
| 00100 | UP | |
| 11001 | RSET | |
| 11101 | XID | XID |
| 10001 | | FRMR |
Las órdenes SNRM, SNRME, SARM, SARME, SABM y SABME sirven para activar el modo en que se comunicarán las estaciones: NRM o modo de respuesta normal, ARM o modo de respuesta asíncrona y ABM o modo asíncrono equilibrado, con sus respectivas extensiones (NRME, SARME y SABME).
La orden RSET sirve para reiniciar la conexión y poner a cero los contadores y ventanas deslizantes de las tramas. La orden DISC sirve para desconectar la conexión.

### Campo de Dirección

El campo de dirección identifica a la estación secundaria que ha transmitido o que va a recibir la trama. Este campo no se usa en enlaces punto a punto. El mismo tiene normalmente 8 bits, puede usarse también un formato ampliado en el que la dirección tendrá un múltiplo de 7 bits. El bit menos significativo de cada octeto será respectivamente 1 o 0, si es o no el último octeto del campo de dirección. Los 7 bits restantes de cada octeto formarán la dirección propiamente dicha.

### Campo de control

En HDLC se definen tres tipos de tramas, cada una con formato diferente para el campo de control. Las tramas de información (tramas-I) transportan los datos generados por el usuario. En estas tramas también se incluye información para el control ARQ de errores y de flujo. Las tramas de supervisión (tramas-S) proporcionan el mecanismo ARQ cuando la incorporación de las confirmaciones en las tramas-I no es factible. Las tramas no numeradas (Tramas-N) proporcionan funciones complementarias para controlar el enlace.
El primer o los dos primeros bits del campo de control se utilizan para identificar el tipo de trama. El resto de los bits se ubican en subcampos como se indica en la figura. 6. (c) y (d)
Todos los formatos posibles del HDLC contienen el bit sondeo/fin (P/F "poll/final"). Su utilización es dependiente del contexto. Normalmente en las tramas de órdenes se denomina bit P, y se fija a 1 para solicitar (sondear) una respuesta a la entidad HDLC par.
En las tramas de respuesta, el bit se denomina F, y se fija a un valor 1 para identificar a la trama tipo respuesta devuelta tras la recepción de una orden.
El campo control utiliza tres formatos diferentes, según el tipo de trama HDLC que se use:
a) XXXXXXXO - Trama de Información (I)
Las tramas I transportan información de capa superior y determinada información de control. Esta trama envía y recibe números de secuencia, y el bit de sondeo final (P/F) realiza el control del flujo y de errores.
Contiene el campo de control, las cuentas de las tramas transmitidas (N[s]) y las tramas recibidas. Estas cuentas son:
* Ns: Cuenta la secuencia de tramas transmitidas (send).
* Nr: Da el número (Ns) de la trama que la estación que transmite espera recibir.
b) XXXXXX01 - Trama de Supervisión (S)
Las tramas S proporcionan información de control. Las tramas S pueden solicitar y suspender la transmisión, informar sobre el estado y confirmar la recepción de las tramas I. Las tramas S no tienen un campo de información.
c) XXXXXX11 - Trama No Numerada (U)
Las tramas U admiten funciones de control y no son secuenciales. Según la función de la trama U, el campo de control es de 1 byte o 2 bytes. Algunas tramas U tienen un campo de información

### Campo de información

El campo de información solo está presente en las tramas-I y en algunas tramas N. Este campo puede contener cualquier secuencia de bits, con la única restricción que el número de bits sea igual a un múltiplo entero de 8. La longitud de este campo es variable y siempre será menor que un valor máximo predefinido.

### Campo para la secuencia de comprobación de la trama

La secuencia de comprobación de la trama (FCS, Frame Check Sequence) es un código para la detección de errores calculado a partir de los bits de la trama excluyendo los delimitadores.

## Funcionamiento del HDLC

El funcionamiento del HDLC implica tres fases. Primero, uno de los dos extremos inicia el enlace de datos, de tal manera que las tramas se puedan intercambiar de una forma ordenada. Durante esta fase, se pactan las opciones que se usarán en el intercambio posterior. Después de la iniciación, los dos extremos intercambian los datos generados por los usuarios así como información de control para llevar a cabo los procedimientos de control del flujo y de errores. Finalmente, uno de los dos extremos comunicará la finalización de la transmisión.

### Iniciación

La iniciación la puede solicitar cualquiera de los dos extremos transmitiendo una de entre las seis órdenes previstas para fijar el modo. Esta orden sirve para tres objetivos: 1. Se avisa al otro extremo sobre la solicitud de la iniciación. 2. Se especifica cual de los tres modos (NRM, ABM, ARM) se está solicitando. 3. Se especifica si se van a utilizar números de secuencia de 3 o 7 bits.
Si el otro extremo acepta la solicitud, se informará al extremo sobre esta contingencia mediante la transmisión de una trama de confirmación no numerada (UA, unnumbered acknowledged). Si la solicitud se rechaza, se envía una trama de modo desconectado (DM, disconnected mode,). 32

### Transferencia de datos

Cuando la iniciación se haya solicitado y haya sido aceptada, entonces se habrá establecido la conexión lógica. A partir de entonces, ambos lados pueden comenzar a enviar datos mediante tramas-I, comenzando con el número de secuencia igual a 0. Los campos N(S) y N(R) de una trama-I contendrán los números de secuencia con los que se lleva a cabo el control del flujo y de errores. La secuencia de tramas-I se numerará secuencialmente módulo 8 o módulo 128, dependiendo de si se utilizan respectivamente 3 o 7 bits, utilizando el campo N(S). El campo N(R) se utiliza para la confirmación de las tramas-I recibidas; de esta forma se facilita que el módulo HDLC indique al otro extremo el número de trama-I que se espera recibir.
Las tramas-S también se usan para controlar el flujo y los errores. La trama receptor preparado (RR, receive ready) confirma una trama-I recibida, indicando a la vez la siguiente trama-I que se espera recibir. La RR se usa cuando no hay tráfico en el sentido contrario (tramas-I) en el que se puedan incluir las confirmaciones. La trama receptor no preparado (RNR, receive not ready) confirma una trama-I, como la hace la RR, pero a la vez solicita a la entidad situada al otro extremo del enlace que suspenda la transmisión de tramas-I. Cuando la entidad que envió la RNR este de nuevo preparada, enviará una RR. La trama REJ sirve para iniciar el procedimiento ARQ con vuelta-atrás-N. Con ella se indica que la última trama-I recibida se ha rechazado y solicita la retransmisión de todas las tramas-I a partir de la N(R) indicada en la trama REJ. La trama de rechazo selectivo (SREJ, selective reject) se usa para solicitar la retransmisión de una única trama.

### Desconexión

Cualquiera de las dos entidades situadas a ambos lados del enlace pueden iniciar la desconexión; tanto por iniciativa propia (si es que ha habido algún tipo de fallo) como tras la petición cursada por capas superiores. HDLC lleva a cabo la desconexión transmitiendo una trama de desconexión (DISC, disconnect). El otro extremo podrá aceptar dicha desconexión devolviendo una trama UA e informando al usuario de la capa 3 sobre el cierre de la conexión. Se puede perder cualquier trama-I pendiente de confirmarse, en ese caso su recuperación es responsabilidad de las capas superiores.