c_network
Toto je starší verze dokumentu!
Broadcast
- pokrývá dvě vrstvy modelu ISO/OSI (spojová a síťová)
- MAC broadcast (FF:FF:FF:FF:FF:FF)
- rozlišujeme 2 druhy IP broadcastu
- broadcastová adresa siťě (10.10.11.255)
- globální broadcastová adresa (255.255.255.255)
- zasílání broadcastu vyžaduje speciální oprávnění (flag)
- globální nelze odeslat bez brány!
- nelze odeslat lokální na jinou síť.. neví se, že je to bcast :)
- příjem je podivný:
- bcast neprojde pres router, jestliže nemá nastavený flag na přesměrovávání
- oba typy IP bcastu dojdou na všechny zařízení, protože se to posílá MAC bcastem!!
- ale!! aplikace která naslouchá na portu, například nc -u -l 9999, tak
- přijímá globální bcast i síťový, ale jen pokud přijde z dostupné IP? (ze stejné sítě, existující IP adresy?)
- TODO
- zkusit hack.. odesílat vzdy na MAC FF:FF… a ruzne kombinace src, dst
- z jine site poslat lokalni bcast pomoci specifikace ff:ff .. to by nemelo projit, kvuli nedostupnosti zdroje
- kdyztak zkusit uplny fake… treba gw ip, gw mac, dst mac ff, dst ip global bcast
- poslat jinou, ale funkční IP, FAKE SRC MAC brány a nebo kouknout, zde si to druha strana overuje existenci hosta arpeckem
test příjmu broadcastu aplikací listen
- OTESTOVAT ZNOVU.. NC MA TEHDENCY UZAMCIT SE JEN NA JEDNU RCVIP.. MUSIM HO PO KAZDEM POKUSU ZABIT
- A TEN MZ VERZE 0.40 NEUMI ZMENIT MAC, MALFORMUJE PKT
- server je 10.10.11.20/25, ntb, wifi
nc -l -p -u 9999
- z klienta pharaon (10.10.11.2, 192.168.100.1) v LAN došlo:
mz eth0 -A 10.10.11.2 -B 255.255.255.255 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" mz eth0 -A 10.10.11.2 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39"
- nedošlo (protože se posílalo na MAC brány?):
mz eth0 -A 10.10.11.2 -B 10.10.11.128 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" mz eth0 -A 10.10.11.2 -B 10.10.11.255 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39"
- došlo na stroj, ale nedošlo do soketu (použila se BCAST MAC)
mz eth0 -A 192.168.10.10 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // z jiné sítě a neexistující mz eth0 -A 10.10.11.8 -B 255.255.255.255 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // neexistujici ip mz eth0 -A 10.10.11.3 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // neexistujici ip mz eth0 -A 10.10.11.1 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // ip brany, ale moje mac mz eth0 -A 192.168.100.1 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // existující, ale jíná síť mz eth0 -A 192.168.100.1 -B 255.255.255.255 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // existující, ale jíná síť
- zkusil jsem si nastavit jinou sit (192.168.20.20)… vůbec neodešlo z IF
- ta 127 .. neví se, že je to bcast .. bere se to jako host a brána není
- globální chce asi gw = že by taky nevěděl, že je to bcast? nebo prostě obecně to chce bránu?
mz eth0 -A 192.168.20.20 -B 255.255.255.255 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // nebyla nastavená gw mz eth0 -A 192.168.20.20 -B 10.10.11.127 -t udp "dp=9999,p=36:30:34:36:36:30:30:31:39" // nevedel, ze je to bcast
- staré informace.. zmatené :)
- globální broadcast
- nelze provést (v unixu), pokud není specifikovaná brána - neví se který adaptér použít?
- přijímají jej všechny uzly v LAN (v promiscuitinim i normálním režimu)
- přijímají jej UDP sockety, které jsou
'bindované na INADDR_ANY' a zdrojová IP bcastu odpovídá síti některé z lokálních IP? - nc -l -u -p 9999 skončí s hláškou network unreacheable
- broadcast z neplatné adresy
- nelze provést, pokud není specifikovaná brána - neví se který adaptér použít?
- přijímají jej všechny uzly v LAN (v promiscuitinim i normálním režimu)
- přijímají jej uzly, které jsou
'bindovány na IP z dané sítě' - nc -l -u -p 9999 skončí s hláškou network unrecheable
- bind() na INADDR_ANY
- příjmá broadcasty na všech Intf pokud jejich zdrojová adresa odpovídá nějaké z lokální podsítě
- příjmá data adresované libovolné lokální IP adrese
- při odesílání globálního broadcastu nebo bcastu pro nelokální subnet se použíje IP adresa zařízení s default gw
- při odesílání unicast dat nebo bcastu pro lokální subnet se použíje odpovídající IP a Intf
- odesílací intf lze specifikovat pomocí socketopt SO_BINDTODEVICE, ale vyžaduje práva roota a je obsolute
- bind() na inet_addr(„aaa.bbb.ccc.ddd“)
- nepřijímá žádné broadcasty
- přijímá data pouze na intf odpovídající uvedené IP adrese
- pro odesílání dat nebo broadcastu se použije uvedená IP
Sokety
- zakladni navod prace se sokety:
- navod na libovolny raw paket:
- super navod na broadcast:
- blokovane cteni - timeout:
- co jsou blokovane a neblokovane sockety .. neblokovany muze byt i bez select
- co je vlastne select()?
datové typy a struktury pro HW nebo protokoly
- int může být někde 32 bit, někde třeba 16 bit, pokud potřebujeme určitou přesnou velikost, jsou užitečné typy
- int8_t, uint8_t, int16_t, uint16_t … int64_t, uint64_t
- pokud používáme datové struktury
- vkládají se někdy mezi jednotlivé atributy prazdné místa do paměti,
- popřípadě se provádí nějaké optimalizace, které mohou zabrat více paměti, než ve skutečnosti chceme.
- někdy potřebujeme, aby struktura zabírala stejné místo v paměti na všech architekturách
- použijeme
struct my_struct {
uint8_t field1;
uint16_t field2;
} __attribute__((packed));
- některé architektury používají jiný formát ukládání čísel (big-endian, little-endian)
- pro zachování stejného způsobu ukládání se používá funkce htons, htonl ..
#include <netinet/in.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);
c_network.1329593084.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
