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