SO kol3 przygotowani..
Transkrypt
SO kol3 przygotowani..
Co identyfikuje adres IP a co port? IP identyfikuje hosta w sieci port identyfikuje typ procesu (np. 21 – FTP, 25 – SMTP, 49 – LOGIN) gniazdo identyfikuje unikalny nr połączenia Czym różni się deskryptor gniazda od deskryptora pliku? Deskryptor pliku identyfikuje plik, a deskryptor gniazda gniazdo. Który argument funkcji służy do określenia typu gniazda? drugi socket(int domain, int type, int protocol) Jakie wartości przyjmuje ten argument dla gniazd połączeniowych a jakie dla bezpołączeniowych? połączeniowych - SOCK_STREAM bezpołączeniowych – DGRAM_STREAM Jaki jest zakres liczbowy portów dostępnych do wykorzystania dla użytkownika niebędącego administratorem? 1024 Co oznaczają pojęcia: [0xABCD] Big-Endian? pierwszy najbardziej znaczący bajt [ABCD] Little-Endian? pierwszy najmniej znaczący bajt [CDAB] Network Byte Order? sieciowa kolejność bajtów [ABCD] Do czego służą funkcje: htonl, htons, ntohl, ntohs? Co oznaczają ich nazwy (od czego są to skróty)? htonl – przekształca 32-bitową wartość z lokalnej na sieciową ntohl – na odwrót htons – przekształca 16-bitową wartość z lokalnej na sieciową ntohs – na odwrót Liczbę w postaci szesnastkowej: cafe zapisano na dwóch bajtach w postaci: feca. Jaka to reprezentacja? little-endian Czym są i do czego służą gniazda? - podstawowy mechanizm służący do wymiany danych między maszynami (przy użyciu sieci) [Rochkind] - są używane w czwartej warstwie sieciowego modelu OSI/ISO - służą do komunikacji między procesami, w tym przez sieć - kombinacja IP i nr portu Czym się różni komunikacja połączeniowa od bezpołączeniowej? - w kom. poł. wywoływane są dla serwera: socket, bind, listen, accept; dla klienta: socket, connect - w kom. bezpoł. wywoływane są dla serwera/klienta: socket, bind - w kom. poł. można używać write, read, send, recv, writeall - w kom. bezpoł. jest to niemożliwe, ponieważ mamy tylko 1 deskryptor pliku wyznaczony dla naszego gniazda; za to można użyć funkcje sendto, recvfrom - w kom. bezpoł. używa się datagramów - gniazda typu SOCK_STREAM gwarantują zachowanie właściwej kolejności i nadejście komunikatów - gniazda typu DGRAM_STREAM nie gwarantują utrzymywania kolejności, ani nadejścia - w kom. bezpoł. nie utrzymuje się otwartego połączenia Co to są adresy IPv4 i IPv6, jaką mają postać? IPv4: 192.168.1.1 IPv6: 2001:0db8:0000:0000:0000:0000:1428:57ab (postać 16-stkowa) (8 grup po 2 bajty) Do czego służą porty? Identyfikują typ procesu. Do portów przypisane jest wiele rozmaitych usług. Wiele numerów portów jest zwyczajowo przypisanych do dobrze znanych usług, np 80 – serwery protokołu HTTP, 21 – serwery protokołu FTP, 23 – serwery protokołu Telnet. Muszą mieć sieciową kolejność bajtów. Jakie są typowe numery portów dla http, ftp, ssh itp.? HTTP – 80, ftp – 21, ssh – 22, Telnet – 23, SMTP - 25 Jak wygląda komunikacja z użyciem protokołu HTTP? 1) po otwarciu połączenia klient wysyła zapytanie w postaci GET ścieżka HTTP/wersja\r\n\r\n ścieżka określa żądany dokument (np. /index.html) wersja dotyczy protokołu HTTP 2) serwer sprawdza czy dany zasób istnieje i jest dostępny dla klienta, po czym odsyła odpowiedni kod stanu i dalszy ciąg, np.: HTTP/1.1 404 Not Found\r\n i komunikat objaśniający dany błąd lub HTTP/1.1 200 OK\r\n, plik nagłówkowy oraz żądany dokument ?? W jakich przypadkach stosuje się komunikację bezpołączeniową z użyciem UDP? Kiedy nie jest istotny fakt, czy komunikat dotrze do celu i/lub zależy nam na szybkości, np. zamawiamy książkę w bibliotece i mamy dostać maila zwrotnego potwierdzającego zamówienie; w przypadku, gdy go nie dostaniemy, będziemy wiedzieć, że coś poszło nie tak i zamówimy jeszcze raz. UDP dobrze nadaje się do zastosowań w: • małych, względnie niezawodnych sieciach, • do zastosowań krytycznych czasowo, • do zastosowania w serwerach obrabiających duże ilości prostych zapytań Czy programy korzystające z protokołu UDP mają możliwość kontroli pakietów? Podaj przykład, jak mogą to kontrolować (np. jak to jest rozwiązane w przypadku programu tftp) Kontola transmisji jest zapewniona przez protokoły wyższych warstw (warstwy aplikacji), np. TFTP, SNMP, DHCP, DNS. Przesył TFTP rozpoczyna się od żądania odczytu lub zapisu pliku, które żąda również połączenia. Plik wysyłany jest w blokach o długości od 0 do 512 bajtów. Pakiet danych mniejszy niż 512 bajtów wskazuje zakończenie przesyłu. Każdy z pakietów musi być potwierdzony przez pakiet potwierdzający, zanim będzie mógł zostać wysłany następny pakiet. Pakiet danych traktowany jest jako potwierdzenie, że komputer wysyłający otrzymał potwierdzenie poprzedniego pakietu danych. Jedynie pakiet końca transmisji nie wymaga potwierdzenia. Jeżeli jakiś pakiet ulegnie zagubieniu, to u planowanego odbiorcy następuje przeterminowanie, a ten następnie żąda transmisji zagubionego pakietu. Pakiet retransmitowany w tym przypadku, to ostatni pakiet poprzedniej transmisji, więc nadawca musi zachować do retransmisji tylko jeden pakiet. Poprzednie potwierdzenia gwarantują, że pakiety uprzednio wysłane zostały otrzymane. Ftp-prosty protokół przesyłania plików między stacjami wykorzystujący UDP Po wysłaniu każdego pakietu do stacji docelowej jego kopia jest przechowywana w buforze, aż do czasu otrzymania potwierdzenia odebrania danych. Jeżeli stacja wysyłająca nie otrzyma potwierdzenia przed upływem czasu retransmisji, pakiet wysyłany jest ponownie. Jaki adres należy ustawić, aby rozesłać pakiet do wszystkich hostów w danej sieci? Trzeba znać adres IP hosta i maskę podsieci 11010100.00110011.11011011.00100000 adresIP 11111111.11111111.11111111.11000000 maska 11010100.00110011.11011011.00111111 broadcast (te same bity co IP jeśli w masce podsieci 1, reszta uzupełniona 1) Jaki adres należy ustawić, aby rozesłać pakiet do wszystkich hostów w sieci lokalnej? 255.255.255 getaddrinfo int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); Jakie parametry przyjmuje funkcja i jakie wartości zwraca? const char* nodename; //nazwa węzła (zazwyczaj podajemy nazwę stacji) const char* service; //nazwa usługi (zazwyczaj podajemy nr portu) const struct addrinfo *hints; //sugestia (zazwyczaj podajemy rodzinę adresów i typ gniazda) struct addrinfo **res; //przekazywana informacja jako lista powiązana //0 lub nr błędu Który parametr funkcji może jako wartość przyjąć http lub ftp lub telnet lub smtp? const char *service (drugi) getaddrinfo("www.kame.net", "http", &hints, &res0); W jakiej formie może być podana wartość parametru node? nazwa stacji: - jako nazwa, którą trzeba wyszukać, używając serwera DNS, np. „www.yahoo.com” - jako nazwa zdefiniowana w pliku /etc/host lokalnej maszyny, np. - jako adres IP w notacji z kropkami/dwukropkami Jakiej funkcji używa się do obsługi błędów funkcji getaddrinfo? const char *gai_strerror(int code); Do czego służy flaga AI_PASSIVE? Oznacza, że przekazywane adresy gniazda są przeznaczone do użytku w funkcji accept (co oznacza, że funkcję getaddrinfo wywołał serwer). W przeciwnym razie, gdy sygnalizator ten jest wyzerowany, wówczas wywołanie funkcji wystąpiło w procesie klienta i adres gniazda będzie użyty w wywołaniu funkcji connect. Dla protokołów bezpoł. może on być użyty w wywołaniu funkcji sendt/sendmsg. Gdy node jest równe NULL, inicjalizacja adresu sieciowego w każdej ze struktur gniazda zależy od znacznika AI_PASSIVE, który jest ustawiany w polu ai_flags parametru hints. Gdy znacznik AI_PASSIVE jest ustawiony, to adres sieciowy w każdej ze struktur gniazda pozostanie nieokreślony. Jest to wykorzystywane przez programy serwerów, które zamierzają przyjmować połączenia od klientów na dowolny adres sieciowy. Gdy znacznik AI_PASSIVE nie jest ustawiony, to adres sieciowy zostanie ustawiony na adres interfejsu loopback. Jest to wykorzystywane przez programy klienckie, które zamierzają połączyć się z serwerem działającym na tym samym hoście. / W jakim pliku można sprawdzić usługi i ich porty na danej maszynie? etc/services struct addrinfo struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; Co oznaczają poszczególne pola struktury i jakie wartości przyjmować? int ai_flags; //sygnalizatory wejściowe int ai_family; //rodzina adresów int ai_socktype; //typ gniazda int ai_protocol; //protokół size_t ai_len; //dł. adresu gniazda struct sockaddr *ai_addr; //adres gniazda char *ai_canonname; // nazwa kanoniczna wykonywanej usługi; //gdy ai_flags w hints zawiera znacznik AI_CANONNAME, to ai_canonname jest ustawiane tak, aby wskazywało na oficjalną nazwę hosta. 192.168.1.1 struct addrinfo *ai_next; //wsk. do nast. struktury w liście Jaki jest sens wprowadzenia pola ai_next w strukturze? mogą Umożliwia wygodne przechodzenie po wszystkich zwróconych strukturach. Przeglądając taką listę możemy wyświetlić np. wszystkie adresy IP powiązane z danym adresem. Czym się różnią rodziny adresów AF_UNIX, AF_INET, AF_INET6? AF_UNIX – gniazdo Unixowe umożliwia dwóm procesom działającym na tej samej maszynie porozumiewać się. AF_INET – gniazdo IPv4 to gniazdo pomiędzy dwoma procesami, potencjalnie działającymi na dwóch maszynach używające obecnej wersji adresów IP. Ten typ jest obecnie najczęściej używany. Służy do komunikacji za pomocą gniazd poprzez Internet. AF_INET6 – podobne do AF_INET, lecz używa IPv6. Jaki plik przeszukują funkcje set/get/endhostent /etc/host void sethostent( int stayopen ); //czy pozostawić otwarte połączenie set - rozpocznij przeszukiwanie bazy danych stacji struct hostent *gethostent(void); // nast. pozycja lub NULL, gdy koniec; no errno get – weź kolejną pozycję bazy danych stacji void endhostent(void); end – zakończ przeszukiwanie bazy danych stacji struct hostent { char *h_name; //oficjalna nazwa stacji char **h_aliases; //tab. alternatywnych nazw stacji int h_addrtype; //adres rodziny (nie typu) int h_lenght; //dł. każdego adresu char **h_addr_list //tab. wskaźników do adresów sieciowych } Jaki plik przeszukują funkcje set/get/endnetent /etc/networks set – zacznij badanie sieciowej bazy danych get – weź pozycję z sieciowej bazy danych struct netent getnetent(void); //wskaźnik lub NULL, gdy koniec; no errno end – zakończ przeszukiwanie sieciowej bazy danych struct netent { char *n_name; //oficjalna nazwa sieci char **n_aliases; //tab. alternatywnych nazw sieci int n_addrtype; //adres rodziny (nie typu) uint32_t n_net //numer sieci } Jaki plik przeszukują funkcje set/get/endservent? /etc/services set – zacznij badanie bazy danych usług get – weź pozycję z bazy danych usług struct servent *getservent(void); // wskaźnik lub NULL, gdy koniec; no errno end – zakończ przeszukiwanie bazy danych usług struct servent { char *s_name; //oficjalna nazwa usługi char **s_aliases; //tab. alternatywnych nazw usługi int s_port; //nr portu char *s_proto; //nazwa protokołu dla tej usługi } Jaki plik przeszukują funkcje set/get/endprotoent? /etc/protocols set – zacznij badanie bazy danych protokołów get – weź pozycję z bazy danych protokołów struct protent *getprotoent(void); // wskaźnik lub NULL, gdy koniec; no errno end – zakończ przeszukiwanie bazy danych protokołów struct protoent { char *p_name; //oficjalna nazwa protokołu char **p_aliases; //tab. alternatywnych nazw protokołu int p_proto //nr protokołu } socket – tworzy punkt końcowy i przydziela deskryptor bind – wiąże gniazdo z nazwą zew., abyinne procesy mogły się do niego odwoływać listen – zaznacza, że gniazdo jest zdolne do zaakceptowania połączenia z drugim gniazdem accept – blokuje czekając na połączenie connect – łączy z gniazdem, które jest zablokowane w funkcji accept Komunikaty pozapasmowe – wysyłane poza kolejką. Dla sendto/sendmsg/send należy ustawić sygnalizator MSG_OOB. Odbiorca używając select, dowiaduje się o komunikacie pozapasmowym. DNS działa w 7 warstwie OSI. inet_ntoa – przekształca adres IPv4 z liczby całkowitej w napis, w notacji z kropami inet_ntop – jw; obsługuje także IPv6 inet_addr – przekształca adres IPv4 z napisu w notacji z kropkami na postać liczby całkowitej gethostbyname gethostbyaddr getnameinfo gethostid uname getnetbyname getnetbyaddr getprodobyname getprotobynumber getservbyname getservbyport