PROTOKOAY Rodziny
TCP/IP
Protokół ARPRFC826 i
RARPRFC894
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)
" 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
Protokół ARP i RARP
" Działanie - określa protokół (ARP/RARP) oraz kierunek
(żądanie/odpowiedz)
1 żądanie ARP
2 odpowiedz ARP
3 żądanie RARP
4 odpowiedz RARP
Protokół IPRFC791
VER IHL Typ usługi Długość całkowita
Identyfikacja Flagi Przesunięcie fragm.
TTL Protokół Suma kontr. nagłówka
Adres zródłowy
Adres przeznaczenia
Opcje Wypełnienie
" 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)
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ół ICMPRFC792
Typ Kod Suma kontrolna
" 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
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 odpowiedz 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ół UDPRFC768
Port zródłowy Port docelowy
Długość komunikatu UDP Suma kontrolna UDP
Dane ....
" 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...)
Protokół TCPRFC793
Port zródłowy Port docelowy
Numer sekwencji
Numer potwierdzenia
Długość nagłówka NW Flagi Rozmiar okna odbioru
Suma kontrolna warstwy internetowej Wskaznik do pilnych danych
Opcje (0, 1, 2)
Wypełnienie do x32b
" 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
Protokół TCP
" Flagi 6b
Bity znacznikowe
" URG pilne dane
" ACK oznacza konieczność potwierdzenia
" 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
" Wskaznik 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)
S
Y
N
N
Y
S
+
K
C
A
A
C
K
Protokół TCP
stany połączenia
CLOSED
CLOSED
TIME_WAIT
LAST_ACK
SYN_SENT
LISTEN
ESTABLISHED
FIN_WAIT2 SYN_RCVD
CLOSE_WAIT
FINE_WAIT1
ESTABLISHED
" 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) {
zlokalizowaŹ
perror("Nie mog
}
Tworzenie adresu
/* Tworzenie struktury adresowej maszyny */
/* wyczyszczenie struktury */
memset(&sa, 0, sizeof(sa));
/* U¨
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
}
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 );
"
Prosty klient
#include
/* funkcje we/wy */
#include /* standardowe systemowe typy danych */
#include /* Stuktury adresowe IP */
#include /* funkcje obs ugi gniazdek */
#include /* rozwi zywanie adresów hostów */
#define HOSTNAMELEN 40 /* maks. d */
nazwy
hosta
#define BUFLEN 1024 /* maks. wielko
#define PORT 13 /* port serwera daytime */
int main(int argc, char *argv[])
{
int rc; /* zwracana warto */
int s; /* deskryptor gniazdka */
char buf[BUFLEN+1]; /* bufor odpowiedzi */
char* pc; /* wska
struct sockaddr_in sa; /* Internet adres strukt*/
struct hostent* hen;/* strukt. T
na adres IP */
/* Address resolution stage */
hen = gethostbyname("tempus");
if (!hen) {
perror("Nie mog rozwi
}
/* inicjacja struktury internetowej maszyny */
/* zerowanie pami ci */
memset(&sa, 0, sizeof(sa));
/* U¨
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
}
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; }
Wyszukiwarka
Podobne podstrony:
DNS Konfiguracja w sieci TCP IP
TCP IP a model OSI
,sieci komputerowe,Zestaw protokołów TCP IP (2)
TCP IP Księga eksperta
Protokół TCP IP R01 5
Bezpieczeństwo w sieciach TCP IP
IP ARP
Resetujemy protokół TCP IP
Using LabVIEW with TCP IP and UDP
Protokół TCP IP R11 5
TCP IP i mikrokontrolery, cz 1
więcej podobnych podstron