Sprawozdanie z laboratorium z sieci komputerowych
„Kodowanie CRC”
Grupa II, Sekcja
Wioletta Bujak
Szymon Cichoń
Dariusz Garbowski
Seweryn Garus
Marek Kudera
Arkadiusz Mazur
Przemysław Mikler
Mariusz Rasiński
Mirosław Sitek
Andrzej Zwierzchowski
Treść zadania:
Celem ćwiczenia było zapoznanie się z kodowaniem CRC. Podczas laboratorium do analizy otrzymaliśmy dwa programy generujące wartości CRC. Pierwszym z nich był program Ccitt.c, który wykorzystywał metodę standardową (CCITT), drugim programem był Ccittf.c, który wykorzystywał metodę szybką (FAST). Naszym zadaniem było porównanie szybkości działania obu metod. Do realizacji tego zadania mieliśmy wykorzystać funkcje języka C.
Algorytm CCITT:
Algorytm wykorzystany do obliczania wielomianu CRC w programie Ccitt.c, dokładnie odpowiada idei sprzętowej generacji sumy CRC (wielomianem generacyjny jest wielomian postaci: x^16+x^12+x^5+1):
Można go również zapisać w postaci wzoru teoretycznego przedstawionego poniżej:
Gdzie:
CRCi+1 następna wartość sumy CRC;
s0 s1 młodsza i starsza część aktualnej sumy CRC ;
x wartość przychodząca;
b ilość bitów danej przychodzącej;
g wielomian generatora;
W programie funkcją obliczającą wartości CRC jest funkcja updcrc(crctt,ch,MTT).
Algorytm FAST:
Wyniki:
Do sprawdzenia czasu wykonywania się generacji wartości CRC wykorzystaliśmy funkcję clock() z biblioteki TIME.H. Za jej pomocą wyznaczyliśmy moment czasu tuz przed przystąpieniem programu do obliczeń, oraz zaraz po ich zakończeniu. Następnie odjęliśmy od wartości końcowej wartość początkową i podzieliliśmy otrzymany wynik przez ?????????. W ten sposób otrzymaliśmy już wynik końcowy, który zapisaliśmy do pliku tekstowego. Dodane przez nas do programu funkcje i rozkazy przedstawiliśmy poniżej zaznaczając je wytłuszczonym drukiem. Z uwagi na to, że fragmenty kodu zawierające dodane przez nas elementy, w obu programach są niemalże identyczne (różnica występuje tylko przy parametrach funkcji updcrc(crc,c,mask) gdzie jeden z parametrów nie pojawia się w jednym z programów) w sprawozdaniu zawarliśmy fragment listing'u tylko jednego programu.
Listing:
main(argc,argv)
int argc; char **argv;
{
clock_t start, end;
start = clock();
if(argc>2) perr("Usage: ccitt [filename]");
if(argc==2) strcpy(filename,argv[1]);
else
{
printf("\nEnter filename: "); gets(filename);
}
if((fp=fopen(filename,"rb"))==NULL) perr("Can't open file");
num=0L; crctt=0;
while((ch=fgetc(fp))!=EOF)
{
num++;
crctt=updcrc(crctt,ch,MTT);
}
fclose(fp);
end = clock();
printf("\nCCITT Number of bytes = %lu\nCRCTT = %04X", num,crctt);
printf("The time was: %f\n", (end - start) / CLK_TCK);
}
Otrzymane wyniki z obu programów przedstawiliśmy na jednym wykresie dla lepszego porównania wydajności obu metod.
Wnioski:
S151444
S141444
S2
S1
S0