Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Exerciții

În cele ce urmează vom punele bazele unui mic protocol de nivel DataLink peste un mediu fizic ideal (fără pierderi/coruperi). Protocolul va pune la dispozitie utilizatorilor acestui protocol functionalitatea de a trimite un sir de octeti intre doua dispozitive. O sa avem un sender si un receiver. Avem la dispozitie peste un mediu de transmisie doua functii send_byte si recv_byte.

	sender(send.c)       receiver(recv.c)
	  |                      |
  Physical layer	   Physical layer		
    protocol 		      protocol
	  |______________________|
		Physical (wire)

Scheletul laboratorului se găsește aici, tot acolo se găsește și un README.md cu funcționalitatea disponibilă.

1. Vrem să implementăm un protocol de nivel DataLink care folosește tehnică byte stuffing pentru a trimite șiruri de caractere ca payload. La acest exercițiu o să presupunem o transmisie de tip Point-to-Point, așa că nu trebuie specificata destinația sau sursa în protocol. Pentru simplitate, payload-ul va avea mereu 30 de bytes și nu vom include un câmp size în header. Cadrul îl putem structura astfel:

/* Atributul este folosit pentru a anunță compilatorul să nu alinieze structura */    
/* DELIM | DATE | DELIM */    
struct __attribute__((packed)) Frame {    
    char frame_delim_start[2]; /* DEL STX */    
    char payload[30];  /* Datele pe care vrem să le transmitem */    
    char frame_delim_end[2]; /* DEL ETX */    
};

NOTE

Executați scriptul ./run_experiment.sh pentru a observă un demo al funcționalitaților disponibile. Acesta pornește un simulator de nivel fizic și rulează ./recv și ./send.

Un șir de caractere precum char buffer[1024] reprezintă un șir de bytes, astfel putem face operații precum ((struct Frame) buffer)->frame_delim_start[0], memcpy(buffer, &frame, sizeof(struct Frame)) sau send_byte(((char *) frame));


2. Acum că am reușit să trimitem primele noastre frame-uri care conțin șiruri de caractere, vrem să extindem protocolul pentru a funcționa într-un mediu de transmisie Point-to-Multipoint. Avem mai multe dispozitive legate la același cablu (de exemplu, dispozitivele care măsoară tensiunea de pe cablu) și fiecare este identificat printr-un întreg.

Extindem protocolul nostru prin adăugarea a două noi câmpuri, sursă și destinație. Structura de date de mai jos reprezintă conținutul frame-ului pe care vrem să-l transmitem. Adaptați atât implementarea protocolului din sender cât și din receiver pentru a funcționa peste noile constrângeri.

/* Atributul este folosit pentru a anunță compilatorul să nu alinieze structura */
/* DELIM | SOURCE | DEST | PAYLOAD | DELIM */
struct __attribute__((packed)) Frame {
    char frame_delim_start[2]; /* DEL STX */
    int source; /* Identificator SURSĂ */
    int dest; /* Identificator DESTINAȚIE */
    char payload[30]; /* Datele pe care vrem să le transmitem */
    char frame_delim_end[2]; /* DEL ETX */
};

În simulatorul nostru avem o conexiune PPP, la acest exercițiu doar vom verifica în receiver câmpul destinație. Protocolul Point-to-Point Protocol face ceva similar, are în header un câmp address ce nu este folosit :). Putem pune orice identificator in header.

Optional. Vom rula implementarea protoclului nostru cu o alta persoana din sala. Mai exact, cineva va juca rolul receiver-ul si va modifica macro-ul HOST in 0.0.0.0. De asemenea, va rula ip address show pentru a determina adresa IP pe care o are asignata. La popul opus, sender-ul va modifica HOST in adresa IP a receiver-ului.

Acest exercitiu functioneaza doar daca sender-ul si receiver-ul se afla in aceasi retea (e.g. pe acelasi IP) si au o adresa din acelasi spatiu de adrese ip address show arata o adresa de retea similara.

3. Vrem să măsurăm delay-ul si bandwidth-ul link-ului peste care rulam. Pentru a masura latenta, o posibila implementare ar presupun ca in sender vom trimite un frame ce conține un timestamp, în receiver vom măsura latența (diferența de timp între timestamp și timpul curent). (Puteți folosi orice metodă de măsurare a timpului, precum cele prezente în articolul următor.