NetBIOS je softwarový interface (API) pro přístup k síťové komunikaci na úrovni relační (session) vrstvy. Jelikož se pohybujeme v relační vrstvě, hovoříme o "dialogu" mezi "logickými jmény". Konkrétní transportní protokol, jakož i fyzické adresy stanic, jsou před programátorem skryty.
NetBIOS vznikl v roce 1984 u firmy IBM a používá se dodnes mj. v produktech PC-Net, PCLP, IBM LAN Server; později jej převzal Microsoft do svých sítí MS-Net (LAN Manager, Windows95 a NT peer-to-peer). Rozhraní NetBIOS poskytují i mnozí jiní výrobci síťových OS (Novell, DEC Pathworks, ...).
Podpora v DOS, Windows (všechny současné verze), OS/2, některé UNIXy.
NetBIOS je především soubor standardních funkcí, ty jsou nezávislé na nižších vrstvách (a tedy formátu paketů). Např. v sítích Microsoft, je pro transport využito protokolu NetBEUI (v rámcích LLC ?), případně TCP/IP a někdy též IPX/SPX.
NetBIOS počítá jak se spojovaným, tak s nespojovaným provozem a umožňuje vysílání datagramů typu unicast, multicast i broadcast. U spojově orientovaného přenosu je garantovaná bezchybnost doručených dat.
Přístup ke službám NetBIOS se děje pomocí jediného vstupního bodu. V MS-DOS je to INT 5Ch, ve Windows funkce NetBiosCall(), v OS/2 NetBIOSSubmit(). Jediným parametrem je ukazatel (v DOS ES:BX) na strukturu NCB (Network Control Block). V NCB je specifikována požadovaná služba a její parametry. Po ukončení služby uloží ovladač NetBIOS do struktury také návratové hodnoty. Návratová hodnota funkce vstupního bodu (resp. registr AX v případě DOS) informuje o případných chybách ve volání NetBIOSu (0=bez chyby). Chyby volání je nutné rozlišovat od chybových kódů generovaných jednotlivými službami - ty jsou ukládány do NCB (položka ncb_retcode).
Formát struktury NCB je následující:
typedef struct NCB{ BYTE ncb_command; /* NetBIOS command (see netbios.h) */ BYTE ncb_retcode; /* NetBIOS return code; 0xFF until asynchronous call finishes */ BYTE ncb_lsn; /* local session number */ BYTE ncb_num; /* NetBIOS name number */ DWORD ncb_buffer; /* transmit/receive buffer */ WORD ncb_length; /* buffer length */ BYTE ncb_callName[16]; /* name of remote node to send datagram or to be connected; */ /* when listening for connections: name trying to connect */ BYTE ncb_name[16]; /* local name */ BYTE ncb_rto; /* receive timeout in 500 ms units; 0=forever */ BYTE ncb_sto; /* send timeout in 500 ms units; 0=default */ DWORD ncb_post; /* ptr to post-processing routine */ /* (DOS: ES:BX points to NCB when entered. Ends with RETF) */ BYTE ncb_lana_num; /* LAN adapter number; 0-based */ BYTE ncb_cmd_cplt; /* completion status */ BYTE ncb_reserved[14]; } NCB;
Poznámka: číslo adaptéru může být využito i pro logické adaptéry - tedy v případě, kdy na jeden fyzický adaptér je navázáno více transportních protokolů.
Příkaz je uirčen hodnotou pole ncb_command. Konkrétní hodnoty můžeme vyčíst z hlavičkového souboru netbios.h.
Sada služeb je poskytovaná ve dvou režimech - synchronním a asynchronním. V synchronní variantě se řízení vrátní programu až po dokončení služby, v asynchronní okamžitě s tím, že program sám musí ukončení testovat sledováním položky ncb_cplt (popř. je o něm informován pomocí ISR či semaforu v systému OS/2). Asynchronní varianta příkazů se volí přičtením čísla 128 (tj. nastavením nejvyššího bitu) k číslu požadovaného příkazu.
Jelikož komunikace pomocí NetBIOS probíhá na relační vrstvě, nepracuje se zde vůbec s adresami uzlů ze síťové vrstvy, které by byly (alespoň v rámci jednoho protokolu) jednoznačné. Namísto toho se využívá logických jmen v podobě řetězců (až 16 znaků), které si mohou stanice libovolně volit a registrovat. Princip spočívá v tom, že stanice, která si hodlá přiřadit určité jméno, informuje o tomto záměru (prostřednictvím rozhraní NetBIOS a s využitím všesměrového vysílání) ostatní stanice sítě. Jestliže tyto nic nenamítají (tj. nepošlou v určeném časovém limitu negativní odpověď), např. proto, že požadované jméno již vlastní, může stanice prohlásit logické jméno za své. Takto si může jedna stanice registrovat několik jmen (počet dán kapacitou vnitřní tabulky jmen). NetBIOS definuje, že na jednom adaptéru smí být zaregistrováno nejvýše logických 254 jmen.
Pokud chce stanice vyslat datagram (nebo navázat relaci) na zadané jméno, postará se ovladač NetBIOS o zjištění konkrétní adresy stanice, jež má toto jméno registrováno, tak, že rozešle broadcast datagram s dotazem. Na tento dotaz odpoví pouze stanice, jež toto jméno vlastní a to datagramem obsahujícím její skutečnou adresu (jejíž formát je pochopitelně závislý na použitém transportním protokolu). Jestliže bylo dotazováno jméno skupinové, příjde odpovědí více.
Mimo jmen jednoznačných, které může být v daném okamžiku přiřazeno jediné stanici, pracuje NetBIOS také se jmény skupinovými (group names). Skupinové jméno může být přiřazeno více stanicím (tj. být současně obsaženo ve více lokálních tabulkách registrovaných jmen) a používá se pro vysílání typu multicast.
Z hlediska implementačního je při registraci každému jménu přiděleno číslo (index do (lokální) tabulky jmen), kterým se na toto jméno odkazujeme při volání ostatních služeb, jež vyžadují jméno jako parametr. Jméno s indexem 1 vždy odpovídá fyzické adrese adaptéru.
Z principu registrace jmen, který zahrnuje všesměrové vysílání, je zřejmé, že NetBIOS nebude možné (alespoň bez zvláštních řešení) použít v sítích WAN.
Dobře napsaná aplikace by před ukončením měla odstranit všechna jména, která zaregistrovala.
Mezi dvěmi jednoznačnými jmény může být zřízena relace (spojení), která umožní bezchybné duplexní předávání dat (korekci chyb provádí vnitřní protokol). Stanice, jež hodlá čekat na spojení volá LISTEN, zatímco druhá strana aktivně spojení navazuje službou CALL. Po návratu z CALL a LISTEN je do struktury NCB dosazen identifikátor spojení LSN - Local Session Number, kterým se na toto spojení odkazujeme při volání dalších funkcí. LSN má platnost jen v rámci lokální stanice.
CALL - požadavek o zřízení relace s uzlem zadaného jména
LISTEN - příjem žádostí o zřízení spojení (od uzlu zadaného jména nebo od kohokoli (jméno "*")
HANGUP - ukončení relace (v timeout čeká na vyřízení nedokončených požadavků na vysílání)
SEND - vyslání bufferu (až 64kB) na protistanici
RECEIVE - příjem dat od protistanice
RECEIVE_ANY - příjem dat z libovolné relace
SESSION_STATUS - zjištění informací o zadané relaci
SEND_DATAGRAM - vyslání datagramu na jednoznačné nebo skupinové jméno
SEND_BROADCAST_DATAGRAM - vyslání datagramu na všechna jména
RECEIVE_DATAGRAM - čekání na příjem datagramu pro zadané číslo jména. Je-li číslo 0xFF, akceptují se datagramy na všechna jména
RECEIVE_BROADCAST_DATAGRAM - čekání na příjem broadcast datagramu. Poznamenejme, že NetBIOS negarantuje, že budou přijaty všechny broadcast datagramy na síti
length Length of NetBIOS frame, includes header and user data EFFFH Delimiter command NetBIOS protocol command (such as NAME_QUERY) Command values 00H to 13H implies UI frame Command values 14H to 1FH implies I frame data1, data2 Optional data depending on the command xmit/resp One or two numbers used to associate received responses with transmitted requests dest 1-byte destination session number in I-frames 16-byte destination name in UI-frames src 1-byte source session number in I-frames 16-byte source name in UI-framesPole command může nést hodnotu identifikující jeden z následujících příkazů (resp. odpovědí):
Name registration & finding ADD_NAME_QUERY 01H UI ADD_GROUP_NAME_QUERY 00H UI ADD_NAME_RESPONSE 0DH UI NAME_IN_CONFLICT 02H UI NAME_QUERY 0AH UI NAME_RECOGNIZED 0EH UI Sending datagrams DATAGRAM 08H UI DATAGRAM_BROADCAST 09H UI Session management and data exchange SESSION_INITIALIZE 19H I SESSION_CONFIRM 17H I SESSION_END 18H I DATA_FIRST_MIDDLE 15H I DATA_ONLY_LAST 16H I DATA_ACK 14H I Flow control, keepalives NO_RECEIVE 1AH I RECEIVE_CONTINUE 1CH I RECEIVE_OUTSTANDING 1BH I SESSION_ALIVE 1FH I STATUS_QUERY 03H UI STATUS_RESPONSE 0FH UI TERMINATE_TRACE 13H UI TERMINATE_TRACE (remote) 07H UI
Problémy se zahlcování sítě broadcasty a filtrování broadcastů routery.
Poznámka: Windows NT používá především h- a b-node