PROTOKOŁY Rodziny
TCP/IP
Protokół ARP RFC826 i RARP RFC894
• Typ sprzętu (Ethernet=1)
• Typ protokołu wyższego rzędu, który wysłał żądanie (IP = 0x0800)
• HLEN – długość adresu sprzętowego
• PLEN - długość adresu protokołu, który wysłał żądanie
Typ sprzętu Typ protokołu
HLEN PLEN Działanie
Adres sprzętowy nadawcy (0-3)
Adres sprzętowy nadawcy (4-5) IP nadawcy (0-1)
IP nadawcy (2-4) Adres sprzętowy odbiorcy (0-1) Adres sprzętowy odbiorcy (2-5)
IP odbiorcy (0-3)
Protokół ARP i RARP
• Działanie - określa protokół (ARP/RARP) oraz kierunek (żądanie/
odpowiedź)
–
1 – żądanie ARP
–
2 – odpowiedź ARP
–
3 – żądanie RARP
–
4 – odpowiedź RARP
Protokół IP RFC791
• VER 4b
–
Wersja protokołu – 4
• IHL 4b
–
Długość nagłówka mierzona w 32b słowach
• Długość całkowita 4b
–
Długość nagłówka i danych w oktetach (576 - 65535)
VER IHL Typ usługi
Flagi Protokół
Długość całkowita
Przesunięcie fragm.
Identyfikacja
TTL Suma kontr. nagłówka
Adres źródłowy Adres przeznaczenia
Wypełnienie Opcje
Protokół IP
• Identyfikator 8b
–
Identyfikator unikalny pakietu
• Flagi 3b
–
Sterują fragmentacją
• Przesunięcia fragmentu
–
Mierzony w jednostkach 64b – określa położenie fragmentu
• TTL
–
Mierzony w hopach lub sekundach czas życia pakietu
• Protokół
–
Wskazuje rodzaj protokołu warstwy wyższej TCP/IP np:
• 1 – ICMP 6 – TCP 17 - UDP
• 2 – IGMP 8 – EGP
Protokół IP
• Suma kontrolna nagłówka
–
Przeliczana na każdym routerze
• Opcje
–
Pozwalają zawrzeć dodatkowe informacje np. o trasie routowania
• Wypełnienie
–
Uzupełnia nagłówek do długości równej wielokrotności słowa 32b
Protokół ICMP RFC792
• Typ 8b
–
Identyfikacja typu komunikatu
• 0 – Echo Reply 4 – Source Quench
• 3 – Destination Unreachable 5 – Redirect
• 8 – Echo Request 11 – Time Exceeded
• Kod
–
Pole zawiera dodatkowe informacje o typie komunikatu
• 0 – sieć nieosiągalna 3 – Nieosiągalny port
• 1 – host nieosiągalny 4 – konieczna fragm. ale brak zezw.
• 2 – protokół nieosiągalny 5 – informacje o trasie niepoprawne
Typ Kod Suma kontrolna
Wykorzystanie ICMP
• ping (Packet InterNet Group Utility)
–
Wysyła pakiet ICMP z kodem Echo Request – 8 „żądanie echa”
–
Odbiera pakiet z kodem 0 – Echo Replay „odpowiedź echa”
–
Wyświetla statystki czasów odpowiedzi i ew. Kody odpowiedzi np.
• Host nieosiągalny, sieć nieosiągalna ...
• traceroute (tracert w MS Windows)
–
Wykorzystuje pakiet z typ 11 do rozpoznania trasy
–
Następnie wysyła pakiety typ 8 (opcja -I) z TTL od 1 w górę lub pakiety UDP
–
Wyświetla statystki czasów odpowiedzi i ew. kody odpowiedzi np. od
poszczególnych routerów
Protokół UDP RFC768
• Protokół bezpołączeniowy
– Nie trzeba nawiązywać połączenia
• krótszy czas
– Nie obsługuje stanów połączenia
• prostsza implementacja
• mniej zasobów serwera
• Można obsłużyć więcej klientów
– Mniejsze rozmiary nagłówka
• Wydajniej wykorzystuje sieć
• Niektóre aplikacje używają domyślnie protokołu UDP (DNS, RIP...)
Port źródłowy Port docelowy
Długość komunikatu UDP Suma kontrolna UDP Dane ....
Protokół TCP RFC793
• Numer sekwencji
–
Pozwala kontrolować przesyłanie dużych porcji danych w segmentach
• Numer potwierdzenia
–
Oznacza następny oczekiwany bajt
• Długość nagłówka
–
Długość nagłówka mierzona w 32b słowach
Port źródłowy
NW
Port docelowy Numer sekwencji
Długość nagłówka Rozmiar okna odbioru
Numer potwierdzenia
Opcje (0, 1, 2)
Wskaźnik do pilnych danych Suma kontrolna warstwy internetowej
Flagi
Wypełnienie do x32b
Protokół TCP
• Flagi 6b
–
Bity znacznikowe
• URG – pilne dane
• ACK – oznacza potwierdzenie
• PSH – natychmiast przesłać dane do warstwy wyższej
• RST – zerowanie połączenia
• SYN – nawiązywanie połączenia
• FIN – zamykanie połączenia
• Rozmiar okna odbioru
–
Sterowanie przepływem umożliwia zwalnianie lub przyspieszanie transmisji w zależności od wielkości i zapełnienia okna bufora u obu stron
• Wskaźnik pilnych danych
– Położenie ostatniego bajta pilnych danych (jeżeli ustawiono flagę URG)
Protokół TCP
– nawiązywanie połączenia
• Three Way Handshaking (trójstronne potwierdzenie)
SYN
ACK+SYN
ACK
Protokół TCP
– stany połączenia
CLOSED
SYN_SENT
ESTABLISHED
FINE_WAIT1 TIME_WAIT
FIN_WAIT2
CLOSED
LISTEN
SYN_RCVD
ESTABLISHED
LAST_ACK
CLOSE_WAIT
• Klient Serwer
Rozwiązywanie nazw
struct hostent *gethostbyname(char *hostname);
struct hostent {
char* h_name; /* nazwa hosta */
char** h_aliases; /* alias */
int h_addrtype; /* type adresu hosta */
int h_length; /* długość adresu */
char** h_addr_list; /* lista adresów z DNS */
#define h_addr h_addr_list[0]
/* adres, kompatybilność wsteczna */
};
Indianie są wśród nas
• htons() - short integer host byte order -> network byte order.
• ntohs() - short integer network byte order -> host byte order.
• htonl() - long integer host byte order -> network byte order.
• ntohl() - long integer network byte order -> host byte order.
•
short host_port = 1234;
net_port = htons(host_port);
Tworzenie Adresu
/usr/include/netinet/in.h
struct sockaddr_in {
short int sin_family; /* Rodzina adresów */
unsigned short sin_port; /* Numer portu */
struct in_addr sin_addr; /* Adres internetowy */
/* Wypełnienie do rozmiaru `struct sockaddr'. */
/* Wypełnienie */
};
Tworzenie adresu
char* hostname; /* nazwa hosta */
short host_port; /* port */
struct hostent* hen; /* Serwer DNS*/
struct sockaddr_in sa; /* Struktura adresowa */
/* Zbieranie informacji od mechanizmu rozwi zywania nazw ą (hosts/DSN/NIS)*/
hen = gethostbyname(hostname_ser);
if (!hen) {
perror("Nie mog zlokalizowa hosta");ę ć }
Tworzenie adresu
/* Tworzenie struktury adresowej maszyny */
/* wyczyszczenie struktury */
memset(&sa, 0, sizeof(sa));
/* U ycie Internetowej rodziny adresów */ż sa.sin_family = AF_INET;
/* Uzgodnienie Indian dla portu*/
sa.sin_port = htons(host_port);
/* Skopiowanie adresu IP do struktury */
memcpy(&sa.sin_addr.s_addr, hen->h_addr_list[0], hen->h_length);
gniazdka
• Wywodzi się z systemów UNIX (BSD 4.3)
– Pozwala na komunikację między aplikacją i siecią (zapis i odczyt)
– Rodzaje
• Stream - SOCK_STREAM
• Datagram (krótkiego zasięgu -UDP) - SOCK_DGRAM
• Raw (niskopoziomowe dostęp do protokołu IP lub
warstwy 2 i 1 OSI)
gniazdka
int socket(int address_family, int socket_type, int proto_family);
// implementacja
int s; /* descriptor gniazdka */
/* Internetowy , Stream socket */
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) {
perror("socket: bł ąd alokacji");
}
połączenie
• Skojarzenie gniazdka z połączeniem
– Podłączenie do lokalnego lub zdalnego adresu
int bind(int socket, struct sockaddr *address, int addrlen);
int connect(int socket, struct sockaddr *address, int addrlen);
– 4 możliwe scenariusze
• Określony port i adres
• Określony adres IP, port wybierany przez system
• Określony port wszystkie lokalne adresy
sockaddr_in = INADDR_ANY
• Adres i port wybierany przez system
bind()
Wysyłanie i odbieranie danych
int read(int socket, char *buffer, int buflen);
• socket – deskryptor gniazdka
• buffer – bufor do zapisu danych
• buflen – wielkość bufora w bajtach
– Wyniki
• 0 – połączenie zamknięte przez zdalny host
• -1 – wywołanie zostało przerwane
• n – ilość bajtów odczytanych
Wysyłanie i odbieranie danych
int write(int socket, char *buffer, int buflen);
• socket – deskryptor gniazdka
• buffer – bufor do zapisu danych
• buflen – wielkość bufora w bajtach
– Wyniki
• 0 – połączenie zamknięte przez zdalny host
• -1 – wywołanie zostało przerwane
• n – ilość bajtów wysłanych
Zamykanie połączenia
int close( int socket );
• Zamyka połączenie określonego gniazdka
Prosty klient
#include <stdio.h> /* funkcje we/wy */
#include <sys/types.h> /* standardowe systemowe typy danych */
#include <netinet/in.h> /* Stuktury adresowe IP */
#include <sys/socket.h> /* funkcje obs ugi gniazdek ł */
#include <netdb.h> /* rozwi zywanie adresów hostów ą */
#define HOSTNAMELEN 40 /* maks. d ugoł ść nazwy hosta */
#define BUFLEN 1024 /* maks. wielkość odpowiedzi */
#define PORT 13 /* port serwera daytime */
int main(int argc, char *argv[]) {
int rc; /* zwracana wartość odpowiedzi */
int s; /* deskryptor gniazdka */
char buf[BUFLEN+1]; /* bufor odpowiedzi */
char* pc; /* wska nik danych w buf. */ź struct sockaddr_in sa; /* Internet adres strukt*/
struct hostent* hen;/* strukt. T umaczenia nazwy ł na adres IP */
/* Address resolution stage */
hen = gethostbyname("tempus");
if (!hen) {
perror("Nie mog rozwi za nazwy");ę ą ć }
/* inicjacja struktury internetowej maszyny */
/* zerowanie pami ci */ę memset(&sa, 0, sizeof(sa));
/* U ywamy rodziny adresów internetowych */ż sa.sin_family = AF_INET;
/* Indianie */
sa.sin_port = htons(PORT);
/* kopiujemy adres IP do struktury */
memcpy(&sa.sin_addr.s_addr, hen->h_addr_list[0], hen->h_length);
/* allokacja wolnego gniazdka */
/* Adres internetowy, gniazdo typu stream socket */
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0) {
perror("socket: bł ąd tworzenia gniazda");
}
rc = connect(s, (struct sockaddr *)&sa, sizeof(sa));
pc = buf;
while (rc = read(s, pc, BUFLEN - (pc-buf))) pc += rc;
close(s); *pc=''; print (”%s”, buf); return 0; }