HDLC

Radioamatööriwikistä
Versio hetkellä 10. tammikuuta 2008 kello 10.22 – tehnyt >Oh2mqk (tarkistussumman laskennasta)
Siirry navigaatioon Siirry hakuun

HDLC (Highlevel Data Link Control) on bittisynkroninen datasiirtomenettely, jolla lähetetään dataa kehyksinä - "paketteina".

Toisin kuin tavallisimpien asynkronisten sarjaporttien tapauksessa, tässä tarvitaan dataa saattamaan myös siirtokello joka saadaan modeemilta joko suoraan, tai se voidaan joissain tapauksissa regeneroida epäsuoralla tekniikalla.

HDLC on kansainvälisen standardistatuksen (ISO 3309) saanut versio IBM:n SDLC:stä (Synchronous Data Link Control), jossa yhden bitin merkitys käännettiin päinvastaiseksi.

HDLC:n bittivirralla on kyky kehystää hyötydataa siten, että datan sisältö voi olla mielivaltaista, eikä itse datan tarvitse alkaa tietyllä merkkisarjalla (joita käytetään ns. byte-synkronisten siirtoprotokollien tapauksessa.) HDLC saavuttaa tämän kyvyn siten, että se ei koskaan lähetä enempää kuin 5 perättäistä ykkösbittiä datassaan. Ainoana poikkeuksena on kehyksien reunamerkit (FLAG), jotka ovat bittikuvioita: 01111110 eli niissä on 6 perättäistä ykkösbittiä.

Jos lähetettävässä datassa on enemmän kuin 5 perättäistä ykkösbittiä, lähetetään ensin 5 bittiä ja sitten lisätään väliin yksi nollabitti. Vastaanotossa nämä lisätyt (bit stuffed) nollabitit otetaan pois.

Jos linkillä ei kulje dataa, siellä lähetetään perättäisiä kehysten reunamerkkejä.

HDLC kehyksen alussa on aina Address ja Control tavuja, joille on esim. AX.25 protokollassa annettu omat merkityksensä. Kehyksen lopussa on 2 tavuinen CRC-16 tarkistussumma ennen seuraavaa reunamerkkiä.

HDLC:ssä lähetetään kaikki kehyksen sisäiset tavut alkaen alimmasta bitistään (0).

16-bit CCITT-CRC

Asiasta kerrotaan mm. AX.25 protokollamäärityksessä:

http://www.tapr.org/pub_ax25.html

N1VG kirjoittaa omista kokemuksistaan:

Frame Check Sequence
One detail of the AX.25 format that deserves attention is the Frame Check Sequence (FCS) checksum. This is a two-byte checksum added to the end of every frame. It's generated using the CRC-CCITT polynomial, and is sent low-byte first.
The CRC-CCITT algorithm has plenty of published code examples, but the one I needed, and had trouble finding, was the algorithm for calculating the FCS one bit at a time, rather than a byte at a time. That algorithm is as follows:
Start with the 16-bit FCS set to 0xffff. For each data bit sent, shift the FCS value right one bit. If the bit that was shifted off (formerly bit 1) was not equal to the bit being sent, exclusive-OR the FCS value with 0x8408. After the last data bit, take the ones complement (inverse) of the FCS value and send it low-byte first.

Lisää asiasta löytyy:

http://www.joegeluso.com/software/articles/ccitt.htm