11 martie 2010

Protocolul SLIP

Protocolul SLIP (Serial Line Internet Protocol) actioneaza la nivelul legaturii de date, realizand incapsularea pachetelor IP pentru transmisia acestora pe linii seriale si pe conexiuni modem. SLIP a fost primul protocol de acest gen, si datorita numarului mic de functionalitati pe care le ofera a fost inlocuit de-a lungul timpului cu alte protocoale, cel mai cunoscut fiind PPP (Point-to-Point Protocol).

Principalul obiectiv realizat de SLIP este de a delimita pachetele de date (pentru ca acestea sa fie percepute ca separate). In acest scop, la sfarsitul fiecarui pachet de date se adauga un caracter special numit, in cadrul acestui protocol, END; END este caracterul cu codul ASCII 192. Astfel apare problema ca, daca in interiorul pachetului de date se afla un caracter cu codul 192, acesta sa fie interpretat gresit de catre receiver ca fiind "sfarsit de pachet". Problema se rezolva prin inlocuirea caracterelor 192 din interiorul pachetelor, astfel:

Se defineste un caracter special numit ESC, cu codul ASCII 219 (nu trebuie confundat cu caracterul ESC din codul ASCII; in cazul de fata ESC e doar o denumire ce tine de protocolul SLIP). Daca in interiorul unui pachet de date apare un caracter END, acesta e inlocuit cu o secventa de 2 caractere: caracterul ESC urmat de caracterul cu codul 220. Si caracterele ESC trebuie modificate - ele se inlocuiesc cu secventa formata din caracterul ESC urmat de caracterul 221.

O varianta imbunatatita a protocolului consta din adaugarea de caractere END si la inceputul pachetelor, care il ajuta pe receiver sa poata ignora niste eventuali octeti ce apar "in plus" intre pachete din cauza zgomotului de pe linie.

RFC 1055 (specificatia protocolului SLIP): http://tools.ietf.org/html/rfc1055

sender.c

#include "stdio.h"
#include "string.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"

char send220 = 220;
char send221 = 221;
char END = '%';
char ESC = '#';

int fd1;

void send (char *phrase)
{
int len=strlen(phrase), i=0;

while (len--)
{
if(phrase[i] == END)
{
write (fd1, &ESC, 1 );
write (fd1, &send220, 1 );
}
else if(phrase[i]==ESC)
{
write (fd1, &ESC, 1 );
write (fd1, &send221, 1 );
}
else
write (fd1, &phrase[i], 1 );
i++;
}
}

int main ()
{
fd1 = open ( "mypipe", O_WRONLY );
char * phrase = "Stuff this#in your pipe% and smoke it\n";
char * phrase1 = "SMOKE%IT!!!\n";
send(phrase);
send(phrase1);

write (fd1, &END, 1 );
close (fd1);
return 0;
}

receiver.c

#include "stdio.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"

char END = '%';
char ESC = '#';

int main ()
{
int fd1;
char buf, b;

fd1 = open ( "mypipe", O_RDONLY );
do{
read ( fd1, &buf, 1 );
if(buf==ESC)
{
read ( fd1, &b, 1 );
if(b==220)
printf("%c",END);
else if(b==221)
printf("%c",ESC);
}
else if(buf !=END)
printf("%c",buf);

}while(buf!=END);

close (fd1);
return 0;
}

Niciun comentariu: