Sieci Komputerowe – Laboratorium (2013)
Maksymalne dopuszczalne rozmiary pakietów danych w NetBIOS:
- Komunikacja za pomocą sesji umożliwia przesłanie w pakiecie do 64kb danych
- Komunikacja za pomocą datagramów umożliwia przesłanie w pakiecie do 512 bajtów danych
Budowa struktury NCB:
Pole struktury
Typ danych
Opis
ncb_command (COMMAND)
byte
Określa rodzaj używanej funkcji (reset, addname, deletename, itd.) w
postaci stałej (język C) lub liczby (Pascal)
ncb_retcode (RETCODE
)
byte
Zwraca wynik działania określonej funkcji. Zwraca 0 w przypadku
poprawnego wywołania, w razie błędu zwraca pewną wartość, która
określa konkretny typ błędu
ncb_lsn (LSN)
byte
Określa numer lokalnej sesji przydzielonej przez NetBIOS przy
ustanowieniu sesji. Wartość ta zwracana jest przez CALL i LISTEN i musi
być podana w funkcjach SEND i RECEIVE. Wartością tego pola mogą być
liczby z przedziału 1-254
ncb_num (NUM)
byte
Pole określające numer węzła NetBIOS. Zwracane jest przez funkcję
ADDNAME i wykorzystywane jest we wszystkich funkcjach odbierających
datagramy (RECEIVE). Wartością tego pola mogą być liczby z przedziału
1-254
ncb_buffer (BUFADR)
pointer
Wskaźnik (adres) na wiadomość, która ma zostać wysłana lub odebrana
ncb_length (BUFLEN)
word
Określa długość bufora wiadomości (w bajtach). W funkcjach odbioru
(RECEIVE) ustawia się to pole na maksymalną wartość (z reguły nie
wiemy jak długą wiadomość nadawca chce nam dostarczyć), a po
wykonaniu funkcji pole to określa dokładny rozmiar odebranej
wiadomości w bajtach
ncb_callname (CALLNAME)
array [1..16] of byte Pole określające nazwę węzła komputera z którym chcemy się połączyć
(zwykle jest to nazwa nadawcy) wykorzystywane w funkcjach CALL,
LISTEN oraz w datagramach (RECEIVE). W przypadku użycia funkcji CHAIN
SEND pierwsza połowa pola określa rozmiar bufora odbioru, a druga
połowa jego adres. Wszystkie bajty muszą być wykorzystane.
ncb_name (NAME)
array [1..16] of byte Określa nazwę węzła NetBIOS wykorzystywanego np. w funkcji ADD
NAME, DELETE NAME lub innych funkcjach.
ncb_rto (RTO)
byte
Określa czas na odbiór wiadomości (Receive Time-Out). Jednostką jest
pół sekundy czyli np. ustawienie tego pola na 1 bajt powoduje określenie
czasu odbioru na 0.5 sekundy. Po upłynięciu czasu funkcja odbioru
zwraca odpowiedni błąd. W ramach trwania sesji wartość ta pozostaje
stała. Pola te muszą być użyte w funkcjach CALL i LISTEN (jeśli nie chcemy
ustawiać czasu na odbiór, ustawiamy te pola na wartość 0)
ncb_sto (STO)
byte
Określa czas na wysłanie wiadomości (Send Time-Out). Jednostką jest pół
sekundy czyli np. ustawienie tego pola na 1 bajt powoduje określenie
czasu wysłania na 0.5 sekundy. Po upłynięciu czasu funkcja wysyłająca
zwraca odpowiedni błąd i sesja zostaje zerwana. W ramach trwania sesji
wartość ta pozostaje stała. Pola te muszą być użyte w funkcjach CALL i
LISTEN (jeśli nie chcemy ustawiać czasu na wysłanie, ustawiamy te pola
na wartość 0)
ncb_post (POST)
pointer
Pole wykorzystywane jedynie w trybie asynchronicznym (no-wait mode).
Przechowuje adres przerwania funkcji po jej poprawnym wykonaniu.
ncb_lana_num (LANA_NUM)
byte
Pole określające numer karty sieciowej komputera. W zależności od ilości
kart sieciowych danego komputera pole to przyjmuje różne wartości.
Zwykle pole to ma wartość 0 (jedna lokalna karta sieciowa). Pole
wykorzystywane w niemal każdej funkcji (RESET, ADDNAME,
DELETENAME itd.)
ncb_cmd_cplt (CMD_DONE)
byte
Pole to jest ustawiane w momencie wywołania funkcji. Wartość FF
określa, że dana funkcja się nie wykonała. W przypadku wykonania
funkcji pole to przyjmuje identyczną wartość jak RET_CODE czyli 0 jeśli
pomyślnie lub nr błędu w pozostałych przypadkach.
ncb_reserved (RES)
array [1..14] of byte Pole zarezerwowane. Nie powinno być używane.
Wait mode – tryb synchroniczny (z odczekiwaniem) – tryb używany na laboratorium
No-wait mode – tryb asynchroniczny (bez odczekiwania)
Sieci Komputerowe – Laboratorium (2013)
DODAWANIE WĘZŁA – schemat ogólny (Lab2)
1. Reset węzła Netbios (RESET).
2. Pobranie łańcucha tekstowego od użytkownika (nazwa dla węzła).
3. Dodanie nazwy jako unikatowej (ADDNAME).
4. Wstrzymanie działania programu do momentu naciśnięcia dowolnego klawisza przez użytkownika (w tym momencie
polecenie „nbtstat -n” wydane w wierszu poleceń powinno wyświetlić dodaną nazwę)
5. Usunięcie dodanej nazwy (DELETENAME)
BROADCAST (DATAGRAM) – schemat ogólny (Lab 2)
1. Reset węzła Netbios (RESET) – nadawca i odbiorca.
2. Pobranie łańcucha tekstowego od użytkownika (nazwa dla węzła) – nadawca i odbiorca.
3. Dodanie nazwy jako unikatowej (ADDNAME) – nadawca i odbiorca.
4. Pobranie łańcucha tekstowego od użytkownika (komunikat do wysłania) – nadawca.
5. Wysłanie datagramu (SENDBROADCASTDATAGRAM) – nadawca, odbiór datagramu (RECEIVEBROADCASTDATAGRAM) –
odbiorca.
6. Wyświetlenie odebranego komunikatu – odbiorca.
7. Usunięcie dodanej nazwy (DELETENAME) – nadawca i odbiorca.
MULTICAST i UNICAST (DATAGRAM) – schemat ogólny (Lab 4)
1. Reset węzła Netbios (RESET) – nadawca i odbiorca.
2. Pobranie łańcucha tekstowego od użytkownika (nazwa dla węzła) – nadawca i odbiorca.
3. Dodanie nazwy:
a) jako unikatowej (ADDNAME) – nadawca i odbiorca - transmisja unicast.
b) jako unikatowej (ADDNAME – nadawca) i jako grupowej (ADDGROUPNAME – odbiorca) – transmisja multicast.
4. Pobranie łańcucha tekstowego od użytkownika (komunikat do wysłania) oraz nazwy odbiorcy (adresata wysyłki, patrz pkt.3) –
nadawca.
5. Wysłanie datagramu (SENDDATAGRAM) – nadawca, odbiór datagramu (RECEIVEDATAGRAM) – odbiorca.
6. Wyświetlenie odebranego komunikatu – odbiorca.
7. Usunięcie dodanej nazwy (DELETENAME) – nadawca i odbiorca.
SESJA – schemat ogólny (Lab 5)
1.Dodanie unikalnych nazw nadawcy i odbiorcy do lokalnej tabeli nazw NetBIOSu - ADD NAME.
2.Nawiązanie logicznego połączenia (sesji) - CALL (nadawca) i LISTEN (odbiorca).
3.Transfer komunikatów/danych - SEND (nadawca) i RECEIVE (odbiorca).
4.Zakończenie/rozwiązanie sesji - HANG UP (nadawca lub odbiorca).
5.Usunięcie nazw nadawcy i odbiorcy z lokalnej tabeli nazw NetBIOSu - DELETE NAME.
Opis poszczególnych funkcji NetBIOS:
RESET COMMAND
Przyjmuje
Zwraca
ncb_command := $32;
ResetAdapter := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_lsn := 1; (dot. tylko sesji, max. 32)
ncb_num := NCBNUM; (liczba poleceń do obsługi w danym
czasie – zwykle 1, max. 32)
Implementacja:
Uwagi:
Po wywołaniu tej funkcji wszystkie dotychczas
istniejące nazwy węzłów oraz sesje NetBIOS
zostaną zlikwidowane.
Funkcja ta powinna być wywoływana przed
rozpoczęciem nawiązywania komunikacji za
pomocą pseudoprotokołu NetBIOS.
Za pomocą tej funkcji możemy ponadto
skonfigurować parametry naszego połączenia
(liczba wspieranych sesji 1-32, ilość funkcji
obsługiwanych w jednym czasie 1-32).
Sieci Komputerowe – Laboratorium (2013)
ADD NAME COMMAND
Przyjmuje
Zwraca
ncb_command := $30;
NCBNUM := ncb_num; {numer węzła pomiędzy 1-254}
ncb_lana_num := NCBLANANUM;
AddName := ncb_retcode;
move(nazwa, ncb_name, 16); {nazwa węzła max. 16 znaków}
CMD_Done := ncb_cmd_cplt;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do nadawania
nazwy
węzła
w
protokole
NetBIOS. Nazwa węzła musi być
unikalna dla całej sieci.
ADD GROUP NAME COMMAND
Przyjmuje
Zwraca
ncb_command := $36;
NCBNUM := ncb_num; {numer węzła pomiędzy 1-254}
ncb_lana_num := NCBLANANUM;
AddGroupName := ncb_retcode;
move(nazwa, ncb_name, 16); {nazwa węzła max. 16 znaków}
CMD_Done := ncb_cmd_cplt;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do nadawania
grupowej
nazwy
węzła
NetBIOS – w tym przypadku
nie jest to nazwa unikalna.
Jeśli w sieci istnieje unikalna
nazwa węzła używana przez
inny proces o takiej samej
nazwie jaką chcemy nadać, to
funkcja zwraca błąd w polu
RETCODE.
Funkcji tej używa się w
transmisji typu BROADCAST.
Wszystkie komputery w sieci
nasłuchujące
spod
nazwy
grupowej
otrzymają
komunikat wysłany poprzez
SEND DATAGRAM.
Sieci Komputerowe – Laboratorium (2013)
DELETE NAME COMMAND
Przyjmuje
Zwraca
ncb_command := $31;
NCBNUM := ncb_num; {numer węzła pomiędzy 1-254}
ncb_lana_num := NCBLANANUM;
DeleteName := ncb_retcode;
move(nazwa, ncb_name, 16); {nazwa węzła max. 16 znaków}
CMD_Done := ncb_cmd_cplt;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Za pomocą tej funkcji usuwane są
nazwy węzłów z lokalnej tabeli
NetBIOS. Jeśli pod daną nazwą
istnieją jakieś aktywne sesje, to
taka nazwa nie zostanie usunięta
do momentu rozwiązania sesji.
Każda
z
poniższych
funkcji
związanych z funkcją usuwania
spowoduje zwrócenie błędu nr 17
(Name was deleted) w polu
RETCODE funkcji DELETE NAME:
- LISTEN
- RECEIVE
- RECEIVE ANY
- RECEIVE DATAGRAM
CALL COMMAND
Przyjmuje
Zwraca
ncb_command := $10;
NCBLSN := ncb_lsn; (Numer sesji pomiędzy 1, a 254)
ncb_lana_num := NCBLANANUM;
Call := ncb_retcode;
move(odbiorca, ncb_callname, 16);
(nazwa węzła odbiorcy)
CMD_Done := ncb_cmd_cplt;
move(nazwa, ncb_name, 16);
(nazwa węzła nadawcy)
ncb_rto := 0; {Receive Timeout}
ncb_sto := 0; {Send Timeout}
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do nawiązania sesji z innym
komputerem w sieci lub z innym procesem.
Pokrewna funkcja LISTEN musi przyjąć tą samą
nazwę w polu NCB_NAME, aby udało się
nawiązać połączenie sesyjne.
Zwracany
numer
sesji
(NCB_LSN)
wykorzystywany jest podczas wysyłania i
odbierania danych oraz dla funkcji HANG UP
(rozwiązywanie sesji po numerze).
Czasy oczekiwania programów: nadawcy na
wysyłkę i odbiorcy na nadejście
komunikatu można ustawić na bezlimitowe za
pomocą przypisania do pól NCB_RTO i NCB_STO
wartości 0.
Sieci Komputerowe – Laboratorium (2013)
LISTEN COMMAND
Przyjmuje
Zwraca
ncb_command := $11;
NCBLSN := ncb_lsn; (Numer sesji pomiędzy 1, a 254)
ncb_lana_num := NCBLANANUM;
Listen := ncb_retcode;
move(odbiorca, ncb_callname, 16);
(nazwa węzła odbiorcy)
CMD_Done := ncb_cmd_cplt;
move(nazwa, ncb_name, 16);
(nazwa węzła nadawcy)
move(ncb_callname, nadawca, 16);
ncb_rto := 0; {Receive Timeout}
ncb_sto := 0; {Send Timeout}
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja używana do nawiązywania sesji (po
stronie odbiorcy). Sesja zostanie nawiązana jeśli
nadawca w funkcji CALL podał tą samą nazwę
węzła co odbiorca w funkcji LISTEN.
Pod jedną nazwą lub jedną parą nazw można
zainicjować więcej niż jedną sesję.
Jeśli na pierwszej pozycji pola NCB_CALLNAME
znajduje się symbol „*” (gwiazdka) to funkcja
LISTEN będzie nasłuchiwać ze wszystkimi
nadawcami w sieci, którzy wywołali funkcje CALL.
Pierwszeństwo w nawiązywaniu sesji przez
funkcje
LISTEN
ma
ta,
która
w
polu
NCB_CALLNAME
zawiera
konkretną
nazwę
nadawcy, a nie symbol gwiazdki „*”.
Jeżeli użyto symbolu „*” w NCB_CALLNAME, to po
wywołaniu funkcji LISTEN w tym polu będzie
znajdować się nazwa węzła nadawcy.
HANG UP COMMAND
Przyjmuje
Zwraca
ncb_command := $12;
HangUp := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_lsn := 1;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta przerywa lub zamyka sesję. Może być użyta
zarówno po funkcji CALL (u nadawcy) jak i LISTEN (u
odbiorcy).
Jeśli funkcja ta zostanie wywołana podczas gdy w sesji
„wisi” jeszcze:
a) któraś z funkcji odbioru RECEIVE, to funkcje te zwrócą
błąd 0A (Session closed).
b) funkcja SEND, to HANG UP odczeka na jej wykonanie i
dopiero zadziała.
W przypadku wywołania funkcji HANG UP dla sesji, która
nie istnieje, zostanie zwrócony błąd 08 (Invalid session)
lub 0A (Session closed).
Sieci Komputerowe – Laboratorium (2013)
SEND COMMAND
Przyjmuje
Zwraca
ncb_command := $14;
Send := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_lsn := 1;
ncb_buffer:=@komunikat[1];
ncb_length:=length(komunikat);
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do wysyłania danych do urządzeń lub
procesów w sieci w ramach nawiązanej sesji.
W sesji musi zostać wywołana funkcja RECEIVE lub
RECEIVE ANY, aby dane zostały przesłane.
Dane wysyłane są z opóźnieniem zgodnym z polem
NCB_STO w funkcji CALL.
Jeśli funkcja SEND zakończy się błędem, sesja zostaje
przerwana.
RECEIVE COMMAND
Przyjmuje
Zwraca
ncb_command := $15;
Receive := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_lsn := 1;
move(ncb_length, dlugosc, NCBNAMSZ);
ncb_buffer:=@komunikat[1];
ncb_length:=250;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do odbierania danych od urządzeń lub
procesów w sieci w ramach nawiązanej sesji.
Jeśli upłynął czas ustawiony w polu NCB_RTO w funkcji
LISTEN i nie wywołano w tym czasie funkcji SEND, to
funkcja RECEIVE zwróci błąd o numerze 05 (Timeout
error).
Jeśli maksymalny rozmiar bufora odbioru jest mniejszy
od rozmiaru przesyłanej wiadomości, to odbiorca
otrzyma wiadomość skróconą do ilości miejsca w
buforze. Pozostała (ucięta) część wiadomości nie
przepada, a zostaje dosłana w kolejnym wywołaniu
funkcji RECEIVE. Ponadto w polu RETCODE znajdzie się
błąd o numerze 06 (Przepełniony bufor).
Po wywołaniu funkcji w polu NCB_LENGTH znajdzie się
długość otrzymanej wiadomości, natomiast przypisanie
do pomocniczej zmiennej zawartości bufora pozwoli
nam na odczytanie odebranego komunikatu.
Sieci Komputerowe – Laboratorium (2013)
SEND DATAGRAM COMMAND
Przyjmuje
Zwraca
ncb_command := $20;
SendDatagram := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_num := NCBNUM;
move(odbiorca, ncb_callname, NCBNAMSZ);
ncb_buffer := @wiadomosc[1];
ncb_length := length(wiadomosc);
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do wysyłania datagramów.
Datagram pozwala na transfer komunikatów
pomiędzy stacjami lub procesami w sieci, bez
konieczności nawiązywania sesji. Transfer odbywa
się na podstawie nazw węzłów NetBIOS
unikalnych, bądź grupowych lub też do wszystkich
stacji w sieci (w przypadku BROADCAST).
Protokół NetBIOS nie sprawdza, czy datagram
został wysłany czy nie, przez co nadawca
komunikatu nie dowie się, czy wiadomość dotarła
do odbiorcy/odbiorców, czy też nie, a co za tym
idzie sposób ten nie jest doskonały na tyle co sesja.
Komunikacja za pomocą datagramów umożliwia
przesłanie w pakiecie do 512 bajtów danych
(ncb_length).
RECEIVE DATAGRAM COMMAND
Przyjmuje
Zwraca
ncb_command := $21;
ReceiveDatagram := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_buffer:=@s[1];
move(ncb_length, dlugosc, NCBNAMSZ);
ncb_length:=250;
move(ncb_callname, odb, NCBNAMSZ);
ncb_num:=NCBNUM;
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Uwagi:
Funkcja ta służy do odbierania datagramów. Jej
wywołanie powinno nastąpić przed wywołaniem
funkcji SENDDATAGRAM. Funkcja ta nie posiada
żadnego timeout’u jak w przypadku sesji.
Jeśli maksymalny rozmiar bufora odbioru jest
mniejszy od rozmiaru przesyłanej wiadomości, to
odbiorca otrzyma wiadomość skróconą do ilości
miejsca w buforze. Pozostała (ucięta) część
wiadomości przepada (kolejna wada datagramów w
stosunku do sesji). Ponadto w polu RETCODE
znajdzie się błąd o numerze 06 (Przepełniony bufor).
Jeśli pole NCB_NUM zostanie wypełnione wartością
FF to funkcja będzie odbierać wszystkie datagramy
wysłane w sieci.
Funkcja ta zwraca długość komunikatu, nazwę
nadawcy, status wykonania i kod błędu.
Sieci Komputerowe – Laboratorium (2013)
SEND BROADCAST COMMAND
Przyjmuje
Zwraca
ncb_command := $22;
SendBroadcastDatagram := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_num := NCBNUM;
move(odbiorca, ncb_callname, NCBNAMSZ);
ncb_buffer := @wiadomosc[1];
ncb_length := length(wiadomosc);
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja ta służy do wysyłania wiadomości
typu
BROADCAST
(do
wszystkich
nasłuchujących).
Aby wiadomość dotarła do odbiorców muszą
oni wywołać funkcję RECEIVE BROADCAST.
RECEIVE BROADCAST COMMAND
Przyjmuje
Zwraca
ncb_command := $23;
ReceiveBroadcastDatagram := ncb_retcode;
ncb_lana_num := NCBLANANUM;
CMD_Done := ncb_cmd_cplt;
ncb_num := NCBNUM;
move(ncb_length, dlugosc, NCBNAMSZ);
ncb_buffer := @wiadomosc[1];
move(ncb_callname, odb, NCBNAMSZ);
ncb_length := length(wiadomosc);
ncb_post := $seg:$ofs (dot. tylko no-wait mode)
Implementacja:
Uwagi:
Funkcja
ta
służy
do
odbierania
wiadomości
typu
BROADCAST.
Jej
wywołanie powinno nastąpić przed
wywołaniem funkcji SENDBROADCAST.
Funkcja
ta
nie
posiada
żadnego
timeout’u jak w przypadku sesji.
Jeśli maksymalny rozmiar bufora odbioru
jest mniejszy od rozmiaru przesyłanej
wiadomości,
to
odbiorca
otrzyma
wiadomość skróconą do ilości miejsca w
buforze.
Pozostała
(ucięta)
część
wiadomości przepada (kolejna wada
datagramów w stosunku do sesji).
Ponadto w polu RETCODE znajdzie się
błąd o numerze 06 (Przepełniony bufor).
Funkcja ta zwraca długość komunikatu,
nazwę nadawcy, status wykonania i kod
błędu.