#### #### #### #### ###########
# # # # # # ## # # # #
# # # # # # #### # # # ########
# # # # # ### ### # # #
# ###### # # # # ####
# HACKER # # WANABE # # FAQ # Version 1.0 BETA
# ###### # ## #### ## # #### 2002
# # # # ## ## ## ## # #
#### #### ### ### ####
Spis tematow:
1. Wstep
2. Protokoly Komunikacyjne:
2.1 IP
2.2 TCP
2.3 TCP/IP
2.4 UDP
2.5 ICMP
2.6 FTP
2.7 HTTP
2.8 POP, POP2, POP3
2.9 IGRP i EIGRP
2.10 UUCP
2.11 IPX
2.12 SPX
2.13 SAP
2.14 RIP
2.15 RTMP
2.16 OSPF
2.17 SMTP
2.18 ARP
2.19 RARP
2.20 Model OSI
3. Linux
3.1 Polecenia w Linuksie
3.2 Odinstalowywanie Linuksa
3.2.1 Sposob pierwszy
3.2.2 Sposob drugi
3.3 SDI dla Mandrake 8.2
3.4 Serwer DHCP
3.5 Iptables dla Mandrake 8.2
3.6 Konfiguracja serwera WWW pod Mandrake 8.2
4. Sieci
4.1 Anonimowowsc w sieci
4.1.1 Wstep
4.1.2 Proxy
a) anonimowe Proxy
b) jak sprawdzic anonimowosc Proxy?
c) skad wytrzasnac Proxy?
4.1.3 Konta shellowe
4.1.4 Java Script
4.1.5 Cookies
4.1.6 Fake mail i mailbombing
4.1.7 Bezpieczenstwo danych osobowych
4.2 Obliczanie adresu sieci na podstawie adresu IP
4.3 Sniffing
4.4 Warchalking i Wireless LAN
4.5 WAN ROUTING
5. Systemy Operacyjne
5.1 Systemy Operacyjne
5.1.1 Wstep
5.1.2 Nizszy poziom zarzadzania procesorem (procesami)
5.1.3 Zarzadzanie pamiecia
- jeden spojny obszar
- Strefy
- Strefy przemieszczalne
- Stronnicownie
- Stronnicownie na zadanie
- Segmentacja
- Segmentacja ze stronnicowniem na zadanie
5.1.4 Wyzszy poziom zarzadzania procesorem (procesami)
5.1.5 Poziom zarzadzania urzadzeniami I/O
5.1.6 Poziom zarzadzania informacja
6. Programowanie
6.1 BASH programowanie
6.2 Wstep do programowania w C
6.3 Pisanie programow Internetowych pod Linuxem - podstawy
6.4 Czym się różnią C/C++, Pascal, Assembler, Basic, Java itp..
6.5 Z czego składa się język programowania
7. Algorytmy
7.1 FIFO
7.2 LIFO
7.3 Stos
7.4 Algorytmy
7.5 Zrozumieć kod CRC
7.6 Kompresja metodą RLE
8. Linki
9. Zakonczenie
--------------------------------------------------------------------------------------------
-------------------
1. WSTEP by CZaR|Ny
-------------------
FAQ powstało w celach edukacyjnych i zostało napisane przez kilka osób po to by każdy początkujący
mógł poszerzyć swoją wiedzę. Nie opisujemy tutaj żadnych metod włamań tylko przekazujemy podstawy,
które powinien mieć każdy zaczynający swoją przygodę z poznawaniem Internetu od środka.
Jak widzicie jest trochę do czytania i na pewno każdy znajdzie tutaj coś dla siebie. Nie będe się
więcej rozpisywał bo to i tak nie ma sensu - zapraszam do lektury.
...:::DISCLAIMER:::...
Nie ponosimy żadnej odpowiedzialności za wykorzystywanie tego materiału. Wszystko co zrobisz z tym
FAQ robisz na własną odpowiedzialność. Jeśli Ci się to nie podoba to po prostu nie czytaj i skasuj
ten dokument ze swojego dysku, może to uchroni Ciebie i Twoje najbliższe otoczenie przed przykrymi
niespodziankami związanymi z materiałami zawartymi tutaj. Jeśli dalej chcesz się czegoś nauczyć i
zacząć wprowdzać zawartą tutaj wiedzę w życie to zapraszam...
---------------------------------------------------------------------------------------------
---------------------------
2. Protokoły komunikacyjne
---------------------------
==========
2.1 IP by Estor
==========
IP - Internet protocol - Protokół internetowy
1. Co to jest protokół ?
Protokół określa zasady komunikacji pomiędzy dwoma komputerami.
Ale tak łopatologicznie to może na przykładzie wyjaśnię:
W jednej knajpie siedzą Polacy i Chińczycy - Polacy rozmawiają
z Polakami, a Chińczycy z Chińczykami.
Polacy używają protokołu o nazwie POLSKI, a Chińczycy protokół
o nazwie CHIŃSKI. Ponieważ każdy z Polaków zna zasady protokołu
POLSKI dlatego mogą się ze sobą dogadać, ale żaden CHŃCZYK nie
wie co mówią Polacy, to samo się tyczy protokołu CHIŃSKI,
Polacy go nie znają dlatego nie rozumieją co mówią Chińczycy.
więc czym jest protokół?, są to zasady które normalizują sposób
wymiany danych pomiędzy komputerami, w jaki sposób nawiązywać
połączenie, jaki rozmiar muszą mieć dane itd.
Więc mój adres IP jest protokołem ?
NIE... mówi się że adres jest IP, ponieważ jest on określony w
specyfikacji protokołu internetowego, ale on sam nie jest
protokołem.
2. Do czego stworzono IP ?
W mym chorym umyśle wyobrażam sobie protokół IP jako taczki!,
nic nie robi tylko siedzi i transportuje te datagramy.
Protokół internetowy został stworzony na użytek sieci wzajemnie połączonych
systemów komputerowych, z komunikacją opartą na wymianie pakietów.
Protokół internetowy obsługuje transmisję bloków danych zwanych
datagramami (ang. datagram) z źródła do przeznaczenia, gdzie źródło
i przeznaczenie są hostami identyfikowanymi przez adres o ustalonej
długości.
Protokół internetowy pozwala na dzielenie (fragmentacje) i składanie
(defragmentacje) datagramów podczas ich wędrówki po sieci, jeśli jest to
tylko konieczne np. podczas transmisji przez sieci z "małymi pakietami"
Protokół internetowy jest swoiście ograniczony w obszarze działania, do
dostarczania funkcji niezbędnych, aby przetransportować datagram z źródła do
przeznaczenia, poprzez sieć. Jest on POZBAWIONY!!! mechanizmów gwarantujących
niezawodność transmisji danych, kontroli przepływu danych, sekwencjonowanie,
oraz inne usługi często używane w protokołach typu Host-To-Host.
3. Krótki przegląd IP
Datagram w protokole IP składa się z 2 elementów:
1. Nagłówka
2. Danych które mają zostać przetransportowane...
(a nie mówiłem że taczki 8) )
Protokół internetowy definiuje dwie podstawowe funkcje:
- adresowanie
- fragmentacje
Moduły internetowe używają adresu zawartego w nagłówku internetowym
do transportowania internetowych datagramów w kierunku ich miejsca
docelowego. Wybór drogi dla transmisji nazywa się routing.
Rotuting, czyli wyznaczanie trasy pakietów, niektórzy wielcy admini
spolszczyli słowo routing czyli wyznaczanie trasy = trasowanie 8(.
W tym FAQ ja preferuje angielską nazwę routing.
Moduły internetowe używają pól w nagłówku internetowym także do
fragmentacji i de fragmentacji datagramów, jeśli to
konieczne z powodu maksymalnego rozmiaru datagramu. Maksymalny
rozmiar datagramu jest definiowany przez typ sieci.
4. Jak to jest zbudowane ?
Protokół internetowy traktuje każdy datagram jako odrębną,
niezależną jednostkę nie związaną z żadnym innym datagramem. Nie ma
żadnych połączeń, ani logicznych zależności pomiędzy dwoma datagramami
(wirtualnych czy też innych). Protokół internetowy używa 4 pól do
udostępniania swoich usług:
- Type of Service - typ usługi,
- Time to Live - czas życia
- Options - opcje
- Header Checksum - suma kontrolna nagłówka
Typ usługi (Type of Service) jest używany do poinformowania protokołów
wyższych warstw jak mają traktować dany datagram.
Ten typ wskazania usługi, jest używany przez bramy (Ang. gateway) w celu
wybrania aktualnych parametrów transmisji, dla poszczególnych sieci,
sieć która ma zostać dla kolejnego hop'a (skoku), czy też kolejnej bramy w
czasie routing'u datagramu.
Czas życia (Time to Live) wartość wskazująca górną granice życia datagramu.
Jest ona ustawiana przez wysyłającego i wartość ta jest zmniejszana w czasie
drogi w każdy punkcie gdzie dany datagram będzie przetwarzany. Jeśli wartość
ta osiągnie zero zanim osiągnie cel ulegnie zniszczeniu.
Czas życia można uważać jako limit czasu do samozniszczenia.
Opcje udostępniają 4 funkcje kontrolne wymagane lub też użyteczne w pewnych
sytuacjach, choć zbędne przy typowej komunikacji.
Opcje zawierają ustawienia timestamps ,zabezpieczeń oraz specjalnego routingu.
Suma kontrolna nagłówka umożliwia zweryfikowanie czy datagram został
przetransportowany właściwie. Dane mogą zawierać błędy, suma je nie obejmuje.
Jeśli suma kontrolna nagłówka się nie zgadza, datagram jest bezwzględnie
niszczony przez jednostkę która stwierdzi błąd.
Protokół internetowy nie gwarantuje poprawnej komunikacji. Nie ma żadnych
potwierdzeń dla połączeń pomiędzy źródłem a przeznaczeniem, czy też od hopa
do hopa. Nie ma żadnej kontroli dla danych, tyko suma kontrolna nagłówka,
nie ma też retransmisji oraz kontroli przepływu danych.
Wykryte błędy mogą być raportowane przez Internet Control Message Protocol
(ICMP) który jest zaimplementowany w module protokołu internetowego.
5. Relacje z innymi protokołami
Poniższa ilustracja pokazuje pozycje protokołu internetowego
w hierarchii protokołów.
+------+ +-----+ +-----+ +-----+
|Telnet| | FTP | | TFTP| ... | ... |
+------+ +-----+ +-----+ +-----+
| | | |
+-----+ +-----+ +-----+
| TCP | | UDP | ... | ... |
+-----+ +-----+ +-----+
| | |
+--------------------------+----+
| Internet Protocol & ICMP |
+--------------------------+----+
|
+---------------------------+
| Local Network Protocol |
+---------------------------+
Relacje pomiędzy protokołami
Rysunek 1.
Protokół internetowy z jednej strony jest podpięty do warstwy wyższej,
protokoły typu host-do-host, a z drugiej strony do protokołu lokalnej
sieci. W takim kontekście "lokalna sieć" może być małą siecią w budynku,
albo dużą siecią jak ARPANET.
6. Ale jak to działa ?
Model działania podczas transmisji datagramów z jednej aplikacji do
drugiej można zilustrować na następującym przykładowym scenariuszu:
Zakładamy że transmisja będzie wymagać przejścia za pośrednictwem jednej
bramy (gateway).
Aplikacja wysyłająca przygotowuje swoje dane, po czym wywołuje lokalny moduł
internetowy w celu przesłania tych danych jako datagram, umieszcza również
adres docelowy oraz inne parametry wymagane podczas wywołania.
Moduł internetowy przygotowuje nagłówek datagramu i dodaje do niego dane.
Następnie wyszukuje lokalny adres sieciowy dla otrzymanego adresu, ale
tego adresu nie ma w sieci, więc wyśle datagram do bramy (gateway)
Wysyła ten datagram i lokalny adres do lokalnego interfejsu sieci.
Lokalny interfejs tworzy nagłówek lokalnej sieci i dodaje do niego
datagram, po czym przesyła tak przygotowany datagram przez siec lokalną.
Datagram dociera do bramy której adres został umieszczony w nagłówku
lokalnej sieci, lokalny interfejs usuwa nagłówek lokalnej sieci, zamieniając
w ten sposób datagram w datagram z modułu internetowego. Moduł internetowy
na podstawie adresu internetowego stwierdza że datagram musi zostać przesłany
dalej do innego hosta w kolejnej sieci.
Wywołuje on interfejs lokalnej sieci, w celu wysłania datagramu.
Ten lokalny interfejs sieciowy tworzy nagłówek lokalnej sieci i dołącza do
tego datagram i wysyła do hosta docelowego.
Host docelowy rozbiera datagram z nagłówka lokalnej sieci, przez
interfejs lokalnej sieci i dostarczone modułowi internetowemu.
Moduł internetowy stwierdza że datagram jest przeznaczony dla aplikacji na tym
hoscie. Przekazuje on dane do aplikacji w odpowiedzi na żądanie systemu,
przekazując adres źródłowy i parametry jako wynik żądania.
Application Application
Program Program
\ /
Internet Module Internet Module Internet Module
\ / \ /
LNI-1 LNI-1 LNI-2 LNI-2
\ / \ /
Local Network 1 Local Network 2
Ścieżka transmisji
Rysunek 2
7. Opis funkcji
Funkcją czy też celem protokołu internetowego jest przenoszenie
datagramów pomiędzy połączonymi sieciami. Jest to realizowane poprzez
przekazywanie datagramów od jednego modułu internetowego do drugiego,
aż zostanie osiągnięty cel datagramu.
W systemie internetowym moduł internetowy znajduje się na hostach i
bramach. Datagramy są routowane od jednego modułu internetowego do drugiego
poprzez indywidualne sieci oparte na interpretowaniu adresu internetowego.
Dlatego najważniejszym elementem protokołu internetowego jest adres
internetowy (Adres IP).
Podczas przemieszczania się datagramów od jednego modułu internetowego do
drugiego może się okazać że datagram musi zostać przetransportowany przez
sieć gdzie maksymalny rozmiar pakietu jest mniejszy niż rozmiar datagramu.
W celu obejścia tej niedogodności, protokół internetowy udostępnia
mechanizm fragmentacji.
Adresowanie
Adres docelowy jest wyznaczany na podstawie nazwy, adresu, i trasy
(Ang. routes). Nazwa określa czego szukamy. Adres - gdzie to jest,
trasa - jak się tam dostać.
Protokół internetowy w pierwszej kolejności obsługuje adres. Zadaniem
dla protokołów wyższego poziomu (np. host-to-host lub aplikacja) jest
odzwierciedlenie (zamapowanie) nazw w adresy.
Moduł internetowy odzwierciedla (mapuje) adres internetowy w adres
lokalnej sieci. Zadaniem protokołów niższych warstw (np. lokalnej sieci,
bramy) jest odzwierciedlenie lokalnego adresu sieciowego w trasy
(ang. routes)
Adres ma zawsze taki sam rozmiar, składa się z 4 oktetów bitów (32bity).
Adres rozpoczyna numer sieci, następnie adres lokalny (zwany "resztą").
Istnieją 3 formaty adresu zwane też klasami:
w klasie A, najstarszy bit ma wartość 0, następne 7 oznaczają siec,
pozostałe 24 są lokalnym adresem;
w klasie B, najstarsze bity to 1 i 0, kolejnych 14 bitów oznacza siec,
pozostałych 16 to adres lokalny;
w klasie C pierwsze 3 najstarsze bity mają wartość 110, kolejne 21 to siec,
ostatnie 8 to adres lokalny.
Fragmentacja
Fragmentacja datagramu internetowego jest konieczna jeśli rozpoczyna
on podróż w lokalnej sieci o dużym rozmiarze pakietów i musi przejść
przez lokalną siec o ograniczonym rozmiarze (mniejszym) aby dostać się
do celu.
Internetowy datagram może zostać oznaczony jako "nie fragmentuj".
Każdy datagram oznaczony w ten sposób nie zostanie nigdy sfragmentowany.
Jeśli tak oznaczony datagram nie może osiągnąć celu bez fragmentacji
w żaden inny sposób, zostanie on zniszczony.
Procedury fragmentacji i składania muszą być w stanie podzielić datagram,
na dowolną ilość kawałków, tak aby mogły być później złożone w całość.
Funkcja składająca używa pola identyfikacyjnego aby mieć pewność że
fragmenty innych datagramów nie zostaną wymieszane.
Pole pozycja fragmentacji (ang. fragment offset) informuje odbiorcę
o pozycji paczki w oryginalnym datagramie. Pozycja i długość określają
jaką część orginalnego datagramu pokrywa dany fragment.
Pola dostarczają wystarczającą ilość informacji aby poskładać pakiety
w datagramy.
==========
2.2 TCP by CZaR|Ny
==========
TCP - Transmission Control Protocol
Jest to protokół zorientowany połączeniowo, czyli umożliwia zestawienie połączenia w którym
efektywnie i niezawodnie przesyłane są dane. Połączenie to charakteryzuje się możliwością
sterowania przepływem, potwierdzania odbioru, zachowania kolejności danych, kontroli błędów
i przeprowadzania retransmisji.
TCP organizuje również dwukierunkową współpracę między warstwą IP, a warstwami wyższymi,
uwzględniając przy tym wszystkie aspekty priorytetów i bezpieczeństwa. Musi prawidłowo obsłużyć
niespodziewane zakończenie aplikacji, do której właśnie wędruje datagram, musi również bezpiecznie
izolować warstwy wyższe - w szczególności aplikacje użytkownika - od skutków awarii w warstwie
protokołu IP. Scentralizowanie wszystkich tych aspektów w jednej warstwie umożliwia znaczną
oszczędność nakładów na projektowanie oprogramowania.
Pomimo związku z protokołem IP - TCP jest protokołem w pełni niezależnym i może zostać zaadaptowany
do wykorzystania z innymi systemami dostarczania. Możliwe jest używanie go zarówno w pojedynczej
sieci takiej jak Ethernet, jak i w skomplikowanej intersieci.
TCP posiada wiele nowych możliwości w stosunku do protokołu IP. Oto niektóre z nich:
- STRUMIENIE - dane są formatowane i transportowane w postaci strumieni bitów zorganizowanych w bajty
lub 8-bitowe oktety. Gdy zostaną odebrane, mogą być przesyłane w ten sam sposób.
- BUFFER FLOW CONTROL - kontrola zajętości bufora. Pozwala zapobiec przepełnieniom buforów powiązanych
ze strumieniami danych. Jeśli jeden z procesów wysyła przez strumień więcej danych niż drugi jest w
stanie odebrać to wtedy jest zatrzymywany, aby wolniejszy proces mógł nadążyć z odbieraniem i
przetwarzaniem danych.
- DETEKCJA I KOREKCJA BŁĘDÓW TRANSMISJI - jeśli podczas transmisji wystąpi błąd obie strony połączenia
zostają o tym powiadomione, a następnie starają się zaradzić jakoś zaistniałej sytuacji, ponownie
wysyłając brakujące pakiety.
- POŁĄCZENIE FULL-DUPLEX - połączenie z możliwością jednoczesnej transmisji w obie strony w celu
zmniejszenia ograniczenia przepustowości sieci.
TCP organizuje i zlicza bajty strumienia danych za pomocą 32-bitowych numerów sekwencji. Każdy pakiet
zawiera początkowy numer sekwencji pakietu oraz numer sekwencji, którą nadawca powinien odebrać w
następnym pakiecie. Numer sekwencji pakietu to numer pierwszego bajtu danych w pakiecie w stosunku do
początku transmisji danych w strumieniu. Numer kolejnej sekwencji to numer pierwszego bajtu danych,
którego oczekuje nadawca pakietu. Okna są używane aby transmisje danych w strumieniach były
wydajniejsze. Wymiana danych w oknach pozwala na efektywniejsze wykorzystanie przepustowości, ponieważ
dopuszcza transmisję kilku pakietów, zanim zostanie zażądana odpowiedź.
W dowolnym momencie transmisji odbiorca może ustalić rozmiar okna równy zero, co oznacza, że nie
odbierze żadnych danych, dopóki rozmiar okna nie zostanie zwiększony. Powodem tego zachowania odbiorcy
może być np. przepełnienie bufora.
Budowa nagłówka TCP
-----------------------------------------------------------
| Port źródłowy | Port docelowy |
-----------------------------------------------------------
-----------------------------------------------------------
| Numer sekwencji |
-----------------------------------------------------------
-----------------------------------------------------------
| Numer kolejnej sekwencji |
-----------------------------------------------------------
-----------------------------------------------------------
| Przesunięcie|Zarezer-| Flagi| Rozmiar okna |
| danych | wowane | | |
-----------------------------------------------------------
-----------------------------------------------------------
| Suma kontrolna | Wskaźnik pilnych danych |
-----------------------------------------------------------
-----------------------------------------------------------
| Opcje |
-----------------------------------------------------------
-----------------------------------------------------------
| Dane |
-----------------------------------------------------------
- Port źródłowy - port TCP, którego używa nadawca pakietu,
- Port docelowy - port TCP, którego używa odbiorca pakietu,
- Numer sekwencji - zawiera numer pierwszego bajtu danych transportowanych za pomocą pakietu,
- Numer kolejnej sekwencji - zawiera numer poerwszego bajtu danych, których oczekuje nadawca,
- Przesunięcie danych - liczba 32-bitowych słów nagłówka,
- Zarezerwowane - do wykorzystania w przyszłości,
- Flagi - informacje sterujące (bity SYN, ACK, FIN) używane do rozpoczęcia, kontynuacji i zakończenia
połączenia,
- Rozmiar okna - wielkość okna transmisji lub rozmiar bufora danych odbieranych,
- Suma kontrolna - pozwala wykryć uszkodzenia nagłówka pakietu, występujące w wyniku błędów transmisji,
- Wskaźnik pilnych danych - opcjonalny, pierwszy bajt pilnych danych w pakiecie, który pokazuje gdzie
jest ich koniec,
- Opcje - opcje protokołu, tj. rozmiar największego segmentu TCP,
- Dane - dane protokołu wyższej warstwy.
TCP pozwala na utrzymanie wielu jednoczesnych połączeń między różnymi aplikacjami na jednym komputerze.
W celu rozróżnienia tych połączeń używa się numerów portów. Para końcówek określa jednoznacznie
połączenie między dwoma komputerami. Końcówki są zdefiniowane jako końce połączenia między dwoma
aplikacjami. Końcówka to para dwóch liczb: IP oraz numeru portu TCP komputera, czyli np.:
206.0.125.81:1026
(komputer) (port)
Technologia ta jest bardzo ważna, ponieważ pozwala na dokonanie wielu połączeń, przypisując im osobne
numery portów.
Nawiązanie połączenia TCP następuje w 3 krokach:
- wysłanie bitu SYN/ACK od strony próbującej nawiązać połączenie,
- odpowiedź w postaci SYN/ACK - nastąpiło połączenie
- gdy nie ma już danych do wysłania którakolwiek ze stron może zamknąć połączenie za pomocą pakietu FIN.
==========
2.3 TCP/IP by CZaR|Ny
==========
Do najistotniejszych zalet protokołów TCP/IP można zaliczyć:
- otwartość i niezależność od specyfikacji sprzętowo-programowej systemów komputerowych,
- możliwość integracji wielu różnych rodzajów sieci komputerowych,
- wspólny schemat adresacji pozwalający na jednoznaczne zaadresowanie każdego użytkownika,
- istnienie standardowych protokołów warstw wyższych.
Protokoły TCP/IP to dzisiaj cały zestaw protokołów przeznaczonych do:
- transferu danych: IP (Internet Protocol), TCP (Transmission Control Protocol), UDP (User Datagram Protocol),
- kontroli poprawności połączeń: ICMP (Internet Control Message Protocol),
- zarządzania siecią: SNMP (Simple Network Management Protocol),
- zdalnego włączania się do sieci: TELNET (Network Terminal Protocol),
- usług aplikacyjnych typu przesyłania plików: FTP (File Transfer Protocol).
Protokół tworzący Internet - TCP/IP możemy opisać za pomocą siedmiowarstwowego modelu ISO/OSI. Lepiej
jednak oddaje funkcje i właściwości protokołu TCP/IP uproszczony model czterowarstwowy. W modelu tym
najważniejsze są warstwy sieciowa i transportowa, pozostałe są połączone i tworzą dwie warstwy zwane
warstwą dostępu do sieci oraz warstwą aplikacji. Funkcje tych warstw pokrywają się z zadaniami odpowiadających
im warstw w modelu ISO/OSI.
ZESTAWIENIE WARSTW:
Warstwy TCP/IP Warstwy ISO/OSI
_________________________________
| TELNET FTP |_______APLIKACJI_________
| SMTP |______PREZENTACJI________
| TFTP |_________SESJI___________
+++++++++++++++++++++++++++++++++
| TCP | UDP |______TRANSPORTOWA_______
+++++++++++++++++++++++++++++++++
| IP |________SIECIOWA_________
+++++++++++++++++++++++++++++++++
| PODSIECI |______ŁĄCZA_DANYCH_______
| |________FIZYCZNA_________
+++++++++++++++++++++++++++++++++
Warstwa dostępu do sieci jest najniższą warstwą w hierarchii architektury protokołów TCP/IP. W warstwie
tej do datagramów IP dodaje się nagłówki oraz zakończenie i w ten sposób otrzymuje się ramki przesyłane
w sieci. Funkcje tej warstwy odpowiadają w przybliżeniu funkcjom dwóm najniższych warstw modelu ISO/OSI.
Do komunikacji w sieciach rozległych lub przez łącza szeregowe mogą być stosowane takie protokoły jak PPP
(Point-to-Point Protocol) lub SLIP (Serial Line IP). Te dwa protokoły zostały specjalnie opracowane do
przesyłania datagramów IP poprzez szeregowe łącza dwupunktowe. Protokół SLIP zazwyczaj jest stosowany do
łączenia pojedynczych komputerów poprzez łącza szeregowe. Natomiast w sieciach rozległych zalecane jest
stosowanie protokołu PPP.
Warstwa Internetu znajduje się powyżej warstwy dostępu do sieci. Podstawowym protokołem tej warstwy jest IP.
Protokół ten jest odpowiedzialny za przesyłanie pakietów zwanych datagramami między użytkownikami sieci. Jest
to protokół bezpołączeniowy, co oznacza, że datagramy są przesyłane przez sieć bez kontroli poprawności ich
dostarczenia. W efekcie datagram może zostać zgubiony w sieci, przekłamany lub zniekształcony. Protokół IP
jest przeznaczony do sieci o bardzo dobrej jakości i niezawodności łączy transmisyjnych. Drugim protokołem
tej warstwy jest ICMP, który jest ściśle związany z IP. Służy on do przesyłania komunikatów o nieprawidłowościach
w pracy sieci. Protokół pozwala na przesyłanie wiadomości sterujących między węzłami sieci. Wiadomości te
dotyczą sterowania przepływem, testowania połączeń, wskazania alternatywnych połączeń i wykrywania niedostępnych
użytkowników.
Warstwa transportowa zapewnia bezpośrednie połączenie między końcowymi użytkownikami (systemami) wymieniającymi
informacje. Do najważniejszych protokołów tej warstwy zaliczamy TCP oraz UDP. Protokół TCP jest protokołem
połączeniowym umożliwiającym wykrywanie błędów na obu końcach połączenia. Ma on możliwość ustanowienia i
utrzymania połączenia wirtualnego między dwoma użytkownikami w celu przesyłania danych, sterowania przepływem,
przesyłania potwierdzeń oraz kontroli i korekcji błędów. Protokół UDP jest protokołem bezpołączeniowym, nie
posiadających mechanizmów sprawdzania poprawności dostarczenia danych do miejsca przeznaczenia. Segmenty TCP
jak i pakiety UDP w celu ich dalszego przesłania są umieszczane wewnątrz datagramu IP.
Każda warstwa ma swoją terminologię określającą dane aktualnie przez nią obrabiane. Ponieważ protokół TCP/IP
składa się z dwóch głównych protokołów warstwy transportowej TCP i UDP, więc również w nazewnictwie wprowadzony
został podział.
===============================================
| WARSTWA | TCP | UDP |
-----------------------------------------------
| Aplikacji | Strumień | Wiadomość |
-----------------------------------------------
| Transportowa | Segment | Pakiet |
-----------------------------------------------
| Internetu | Datagram |
-----------------------------------------------
|Dostępu do sieci| Ramka |
===============================================
Warstwa aplikacji zawiera procesy wykorzystujące protokoły TCP lub UDP. Protokoły tej warstwy dostarczają
użytkownikom różnych usług. Do najbardziej znanych protokołów warstwy aplikacji korzystających z TCP należą:
- TELNET (Network Terminal Protocol) dla usług terminalowych. Pozwala na rozpoczęcie sesji poprzez sieć.
- FTP (File Transfer Protocol) dla transferu plików. Umożliwia interakcyjne przesyłanie plików.
- TFTP (Trivial File Transfer Protocol) dla prostych usług transferu plików. Jest to uproszczona wersja
protokołu FTP.
- SMTP (Simple Mail Transfer Protocol) dla wymiany poczty elektronicznej. Umożliwia pracę w trybie zapamiętaj
i prześlij (store-and-forward) pomiędzy systemami poczty korzystającymi z serwerów pocztowych.
- HTTP (Hyper Text Transfer Protocol) do udostępniania w sieci stron zapisanych na serwerach WWW (World Wide Web).
Natomiast do bardziej znanych protokołów warstwy aplikacji korzystających z UDP należą:
- DNS (Domain Name Service) do zamiany adresów IP na nazwy urządzeń sieciowych.
- RIP (Routing Information Protocol) do wymiany informacji związanych z aktualizacją reguły doboru tras w
węzłach sieci.
- NFS (Network File System) do współdzielenia plików przez wiele komputerów dołączonych do sieci. Jest to
rozproszony system plików działających według modelu klient-serwer.
==========
2.4 UDP by CZaR|Ny
==========
UDP - User Datagram Protocol
Protokół ten działa w sposób bezpołączeniowy. Czyli zapewnia tak samo zawodny sposób dostarczania pakietów
co protokół IP. W protokole tym nie uwzględniono jakiejkolwiek kontroli transmisji czy korekcji błędów, konsekwencją
czego pakiety UDP mogą zostać zagubione, zduplikowane albo też przybyć w nieprawidłowej kolejności. Dzięki
wykorzystaniu mniejszych nagłówków niż ma to miejsce w przypadku TCP pozwala na lepsze wykorzystanie przepustowości
łączy i dzięki temu na szybsze przetwarzanie pakietów.
UDP jest wykorzystywane głównie w przypadkach, gdy kontrola transmisji jest zapewniona przez protokoły wyższych
warstw. Usługi wykorzystujące UDP to międzi innymi: NFS, SNMP, TFTP oraz DNS.
Pakiety protokołu UDP są nazywane datagramami. Są one transportowane przez Internet za pomocą protokołu IP i zawierają
nagłówek UDP oraz dane - czyli: UDP dołącza nagłówek do danych wysyłanych przez użytkownika. Następnie przesyła je dalej
do IP, gdzie dodawany jest kolejny nagłówek, po czym całość jest umieszczana w ramce i wysyłana przez Internet.
Budowa datagramu UDP
-------------------------------------------------
| Port źródłowy | Port docelowy |
-------------------------------------------------
-------------------------------------------------
| Rozmiar datagramu | Suma kontrolna |
-------------------------------------------------
-------------------------------------------------
| Dane |
-------------------------------------------------
Porty źródła i przeznaczenia - 16-bitowe numery portów UDP używane do przetwarzania datagramów,
Rozmiar datagramu - rozmiar datagramu w bajtach,
Suma kontrolna - opcjonalna - pozwala wykryć ewentualne uszkodzenie zawartości datagramu,
Dane - dane protokołów wyższych warstw.
UDP stosuje tzw. multiplexing oraz demultiplexing pomiędzy warstwą protokołu i oprogramowaniem użytkowym. Pozwala to
na jednoczesne wykorzystywanie protokołu UDP przez wiele par aplikacji. Do multiplexingu oraz demultiplexingu
wykorzystywane są porty UDP.
Każda aplikacja chcąc wysłać jakikolwiek datagram UDP, musi poza adresem docelowym znać numer portu UDP. Po stronie
odbiorcy następuje sprawdzenie czy numer portu na który został wysłany datagram, jest przypisany nasłuchującej
aplikacji. Jeśli tak to zostanie jej niezwłocznie przekazany, w przeciwnym wypadku zwrócona zostanie na adres i port
nadawcy informacja o błędzie - ICMP error message.
==========
2.5 ICMP by CZaR|Ny
==========
ICMP - Internet Control Message Protocol
ICMP - protokół służący do przesyłania różnego rodzaju pakietów informujących o błędach i
innych ważnych sytuacjach oraz do kontrolowania kondycji połączenia.
Transportowanie pakietów ICMP jest procesem dwustopniowym. Komunikat ICMP jest dołączany
do pakietu IP jako dane, a następnie umieszczany i transportowany przez Internet w postaci
ramki. Komunikaty ICMP mogą zostać zagubione lub powielone, a to ze względu na to, że ICMP
używa takiego samego, zawodnego sposobu komunikowania się co datagramy UDP.
Budowa datagramu ICMP
----------------------------------------------------
| Typ komunikatu | Kod | Suma kontrolna |
----------------------------------------------------
Typ komunikatu - określa rodzaj sytuacji powodującej wysłanie datagramu,
Kod - zawiera dodatkowe informacje o typie komuniaktu,
Suma kontrolna - pozwala wykryć ewentualne uszkodzenia datagramu ICMP.
ICMP może także zawierać nagłówek i dane pakietu, który spowodował jego wysłanie. Pomaga to
ustalić aplikację oraz protokół, które stały się przyczyną błędu.
Najważniejsze komunikaty ICMP
--------------------------------------------------
| Typ komunikatu | Nazwa |
--------------------------------------------------
| 0 | Echo Reply |
--------------------------------------------------
| 3 | Destination Unreachable |
--------------------------------------------------
| 4 | Source Quench |
--------------------------------------------------
| 5 | Route Redirect |
--------------------------------------------------
| 8 | Echo Request |
--------------------------------------------------
| 11 | Datagram Time Exceeded |
--------------------------------------------------
| 12 | Datagram Parameter Problem |
--------------------------------------------------
| 13 | Timestamp Request |
--------------------------------------------------
| 14 | Timestamp Reply |
--------------------------------------------------
| 15 | Information Request |
--------------------------------------------------
| 16 | Information Reply |
--------------------------------------------------
| 17 | Address Mask Request |
--------------------------------------------------
| 18 | Address Mask Reply |
--------------------------------------------------
Poniżej opis najważniejszych komunikatów ICMP:
- Echo Reply (0) oraz Echo Request (8) - służą do testowania kanału komunikacyjnego pomiędzy
dwoma komputerami. Odbiorca datagramu ICMP Echo Request jest proszony o odpowiedź na tzw.
ping. Odpowiedź jest formułowana za pomocą datagramu ICMP Echo Reply. Dzięki temu nadawca
może stwierdzić czy jest możliwość nawiązania połączenia z odbiorcą, oraz sprawdzić bieżącą
kondycję połączenia z odbiorcą.
- Destination Unreachable (3) - tego typu komunikatu używa się w sytuacjach gdy: router lub
bramka nie potrafią ustalić kierunku w którym powinien być wysłąny pakiet, gdy parametr
TTL zostanie zmniejszony do 0, gdy pakiet musi zostać podzielony na fragmenty, ale ma
ustawioną flagę Don't Fragment, lub gdy określony protokół lub aplikacja w miejscu przeznaczenia
pakietu jest nieaktywna.
- Source Quench (4) - gdy bufor odebranych danych wypełni się, to pakiet, który się w nim
nie zmieści, zostanie porzucony. Dla każdego takiego pakietu wygenerowywany jest datagram
ICMP Source Quench, który dla nadawcy porzuconych pakietów jest sygnałem do zwolnienia
strumienia wysyłanych danych.
- Route Redirect (5) - informacje o bieżącej topologii sieci są co pewien czas odświeżane i
wysyłane do sąsiednich sieci, co pozwala na zachowanie aktualnych tablic routingu. Gdy
tylko router zidentyfikuje nadawcę używającego niewłaściwej trasy dla swoich pakietów, po
przetworzeniu pakietu wysyłą do nadawcy datagram ICMP Route Redirect informujący o
istnieniu lepszej trasy dla jego pakietów.
- Datagram Time Exceeded (11) - komunikat ten jest wysyłany przez router albo bramkę w sytuacji
gdy napotkają one datagram z parametrem TTL równym 0. Urządzenie napotykające datagram
TTL=0 ma obowiązek go porzucić, a następnie wysłać do nadawcy komunikat ICMP Datagram Time
Exceeded.
- Datagram Parameter Problem (12) - używany jest w wyniku napotkania datagramu, którego
nagłówek utrudnia, lub uniemożliwia jego dalsze przetwarzanie. W tym przypadku datagram
jest porzucany, a jego nadawcy zwracany jest komunikat ICMP Datagram Parameter Problem.
- Timestamp Request (13) i Timestamp Reply (14)- używa się ich do synchronizowania zegarów
komputeró w sieci.
- Information Request (15) oraz Information Reply (16) - za ich pomocą komputer może uzyskać
adres IP w sieci, w której się znajduje. W celu realizacji rozprzestrzeniany jest datagram
ICMP Inforamtion Request zawierający jedynie część adresu opisującą sieć do której należy
komputer, oczekując odpowiedzi w postaci ICMP Information Reply zawierającą pozostałą
część adresu IP tego komputera.
- Adress Mask Request (17) oraz Adress Mask Reply (18) - komunikaty te używane są do otrzymania
maski podsieci w której znajduje się komputer. ICMP Adress Mask Request może być wysyłany
bezpośrednio do urządzenia, które udzieli tej informacji (router, bramka) lub też jest
rozprzestrzeniany w całej sieci lokalnej.
==========
2.6 FTP by CZaR|Ny
==========
Protokół FTP
File Transfer Protocol
Jest to protokół działający na zasadzie klient-serwer. Jest jedną z usług sieciowych
zdefiniowanych w warstwowym modelu TCP/IP, opisującym funkcje sieci komputerowych. Protokół
ten określa sposób przesyłania plików pomiędzy dwoma komputerami. Dzięki niemu nie istnieje
konieczność uzyskiwania pełnego dostępu do zasobów komputera-odbiorcy. Połączenie z serwerem
FTP nie omija autoryzacji użytkownika na zdalnej maszynie. Dostęp do poszczególnych plików i
katalogów uzależniony jest od uprawnień posiadanych przez zalogowanego użytkownika. Serwery
FTP przeznaczone do użytku publicznego pozwalają przeważnie na uzyskanie anonimowego dostępu
do określonych zasobów osobom, które posługują się identyfikatorem 'anonymous'.
Działanie protokołu FTP jest bardzo proste - wykorzystuje on dwa porty TCP/IP jako niezależne kanały
informacyjne z czego jeden służy do sterowania sesją, a drugi do właściwego przesyłania plików.
Czyli prościej mówiąc protokół FTP umożliwia użytkownikowi sieci przesyłać pliki i zbiory, a także
i przede wszystkim kopiować zbiory z publicznych kont.
Zadania protokołu FTP,które określono w specyfikacji RFC 0765 to:
- Udostępnianie plików
- umożliwienie bezpośredniego korzystania z komputerów zdalnych (oczywiście przy użyciu programów),
- ujednolicenie sposobów korzystania z różnych nośników danych na zdalnym komputerze,
- niezawodne przesyłanie plików.
Parametry protokołu FTP:
-v - Wyłącza wyświetlanie odpowiedzi zdalnego serwera.
-n - Wyłącza auto-logowanie przy początkowym połączeniu.
-i - Wyłącza interaktywne monity w czasie przesyłania wielu plików.
-d - Włącza analizę programu, wyświetlając wszystkie polecenia ftp, które przechodzą między klientem a serwerem.
-g - Wyłącza możliwość używania symboli wieloznacznych w lokalnych nazwach plików i ścieżek. (Patrz polecenie glob w opisie poleceń).
-s:nazwapliku - Określa plik tekstowy zawierający polecenia ftp; polecenia te będą automatycznie wykonywane po uruchomieniu polecenia ftp. W tym parametrze nie są dozwolone spacje. Należy używać tej opcji zamiast readresatora (>).
-a - Używa lokalnego interfejsu przy wiązaniu połączeń danych.
-w:rozmiarokna - Zmienia domyślny rozmiar bufora przesyłania, wynoszący 4096.
Komputer - określa nazwę lub adres IP zdalnego komputera, z którym należy się połączyć
Do przesyłania plików można użyć dowolnego klienta FTP.
==========
2.7 HTTP by CZaR|Ny
==========
Protokół HTTP
Hypertext Transfer Protocol
Protokół HTTP stanowi najważniejszą część ogólnoświatowej sieci World Wide Web. Działanie
serwera opiera się na przyjmowaniu od klienta pojedyńczych rozkazów i wykonywaniu ich. Każdy
rozkaz wykonywany jest niezależnie od pozostałych. Właśnie dzięki protokołowi HTTP przesyła
się żądania udostępniania dokumentów WWW i informacje o kliknięciu odnośnika oraz informacje
z formularzy. Jak wiadomo zadaniem stron WWW jest publikowanie informacji a możliwe jest to
właśnie dzięki protokołowi HTTP.
Protokół ten jest dlatego tak uzyteczny, ponieważ udostępnia znormalizowany sposób komunikowania
się komputerów ze sobą. Określa formę żądań klienta dotyczących danych oraz formę odpowiedzi
serwera na żądania klienta. Jest on zaliczany do tzw. protokołów stateless, z tego powodu że
nie zachowuje żadnych informacji o poprzednich transakcjach serwera z klientem, czyli po
zakończeniu transakcji wszystkie dane przepadają. Stało się to właśnie powodem spopularyzowania
ciasteczek, czyli cookies.
Oficjalna specyfikacja protokołu HTTP jest zawarta w dokumencie RFC 2068.
Przykłady:
Ogólna postać nagłówka wysłanego przez klienta i odpowiedź serwera, oddzielone pojedyńczą
pustą linią. Polecenie OPTIONS pozwala uzyskać informację o tym jakie metody można stosować
do danego zasobu (* oznacza dowolny zasób, więc w tym przykładzie służy raczej jako
sprawdzenie, czy serwer działa).
OPTIONS * HTTP/1.0
HTTP/1.1 200 OK
Date: Fri, 18 Feb 2000 08:07:24 GMT
Server: Apache/1.3.1 (Unix) PHP/3.0.4
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
Informowanie serwera o preferencjach klienta za pomocą dodatkowych pól: Accept-Language, Accept, Accept-Encoding
HEAD http://www.jakis_host.pl/~user/ HTTP/1.0
accept-language: pl
HTTP/1.1 200 OK
Date: Fri, 18 Feb 2000 08:14:28 GMT
Server: Apache/1.3.1 (Unix) PHP/3.0.4
Vary: accept-language
Connection: close
Content-Type: text/html
Content-Language: pl
Expires: Fri, 18 Feb 2000 08:14:28 GMT
Typowy błąd polegający na niezakończeniu URLa wskazującego na katalog znakiem /. Po otrzymaniu kodu błędu 301 od serwera większość przeglądarek automatycznie wysyła powtórne żadanie do serwera - tym razem z poprawnym URLem umieszczonym przez serwer w polu Location.
GET /~user HTTP/1.0
accept-language: pl
HTTP/1.1 301 Moved Permanently
Date: Fri, 18 Feb 2000 08:15:54 GMT
Server: Apache/1.3.1 (Unix) PHP/3.0.4
Location: http://www.jakis_host.pl/~user/
Connection: close
Content-Type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>301 Moved Permanently</TITLE>
</HEAD><BODY>
<H1>Moved Permanently</H1>
The document has moved <A HREF="http://www.jakis_host.pl/~user/">here</A>
</BODY></HTML>
==========
2.8 POP, POP2, POP3 by CZaR|Ny
==========
Protokoły POP, POP2 i POP3
Protokół POP (Post Office Protocol) służy do przenoszenia poczty elektronicznej z serwera
pocztowego na komputer użytkownika. W pewnym momencie powstały dwie wersje protokołu POP:
POP2 i PO3. Podstawową różnicą pomiędzy nimi polega na tym, że korzystanie z protokołu POP2
wymaga uruchomionego serwera SMTP w przeiwieństwie do POP3, który może samodzielnie odbierać
poczte.
Protokół POP opart jest na architekturze klient-serwer, w której poczte odbiera serwer pocztowy
a następnie przechowuje ją do momentu, aż użytkownik się zaloguje na serwerze i pobierze ją.
Większość przeglądarek posida wbudowaną obsługę protokołu POP3 (można tutaj wymienić przeglądarki
Netscape, Opera, IE). Niedociągnięcia w protokole pozwalają na zdalne zalogowanie się na
serwerze w przypadku gdy zostało zmienione hasło dostępowe do skrzynki pocztowej.
Port usługi POP3 również jest narażony na atak bezpośredniego połączenia telnetowego. W takim
przypadku możliwe jest uzyskanie niektórych istotnych informacji z punktu widzenia bezpieczeństwa
systemu.
==========
2.9 IGRP by CZaR|Ny
==========
Protokół EIGRP i IGRP
Protokół IGRP (Interior Gateway Routing Protocol), czyli protokół bram wewnętrznych został
opracowany przez firmę CISCO, jako protokół wektorowo - odległościowy, wykorzystywany w
routingu wewnątrz systemu autonomicznego. Późniejsze połączenie technologii wektorowo -
odległościowej i stanów przyłączy spowodowało powstaniem rozszerzonej wersji protokołu
EIGRP (Enhanced Interior Gateway Routing Protocol). Poniżej przedstawione są formaty
pakietów.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Numer + Kod + Niewykorzystywane + AS + AS - sieci + Suma +
+ wersji + operacji + + + + kontrolna +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rys 1. Format pakietu IGRP
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Numer + Kod + Suma kontrolna + AS - podsieci + AS - sieci + AS +
+ wersji + operacji + + + + +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rys 2. Format pakietu EIGRP
Znaczenie poszczególnych pól jest nastepujące:
- Numer wersji (Version Number) - stosowana wersja protokołu.
- Kod operacji (Operation Code) - określa czy pakiet jest żądaniem czy aktualizacją.
- AS (Autonomous System) - numer systemu autonomicznego.
- AS podsieci (AS Subnets) - informacja o podsieciach na zewnątrz danego systemu autonomicznego.
- AS sieci (AS Nets) - informacja o liczbie i sieciach na zewnątrz danego systemu autonomicznego.
- Suma kontrolna (Checksum) - obliczna jest według standardowego algorytmu UDP.
==========
2.10 UUCP by CZaR|Ny
==========
Protokół UUCP
Protokół UUCP czyli inaczej UNIX-to-UNIX Cpou Protocol wymaga zestawu programów do transmisji
plików między różnymi systemami uniksowymi, a także do wykonywania poleceń na zdalnych systemach.
Mimo, że protokół ten został wyparty przez inne protokoły tj. FTP i SMTP, które są bardziej
poręczne i uniwersalne to na wielu systemach dalej można spotkać aktywną usługę UUCP, którą
używa się w celach administracyjnych. W zależności od systemu i wersji serwera istnieje wiele
sztuczek, które pozwalają użytkownikom kont UUCP na powiększenie swoich uprawnień w systemie.
==========
2.11 IPX by CZaR|Ny
==========
Protokół IPX
Internetwork Packet Exchange
Jest to protokół bezpołączeniowy i właśnie z tego powodu jest podobny do zawodnego sposobu
dostarczania datagramów oferowanego przez protokół IP. IPX wymaga również aby każde urządzenie
komunikujące się za jego pomocą posiadało unikalny adres składający się z 2 części: numeru
sieci oraz numeru komponentu. Numer sieci IPX jest przydzielonym 32-bitowym adresem, a numer
węzła 48-bitowym adresem MAC interfejsu sieciowego.
Przykładowy adres IPX może wyglądać tak: 45D20148.02A03BC436F
IPX korzysta z kilku schematów transportu w celu przetworzenia w ramki informacji i danych
protokołów wyższych warstw. Najbardziej popularne wsród nich to: 802.3 Raw, 802.3, Ethernet II,
Ethernet SNAP.
Sieciowe numery IPX odgrywają głowna rolę podczas wymiany pakietów między róznymi segmentami
sieci. Każdy segment ma przydzielony unikalny adres sieciowy, dzięki któremu pakiety IPX
mogą być transportowane do odpowiednicj komputerów w różnych sieciach. Uzupełnieniem adresu jest
tzw. numer socketu, który służy do identyfikacji procesu docelowego na maszynie odbiorcy.
Poniżej przedstawiona jest budowa pakietu IPX.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Suma + Długość + TC + Typ + Segment +
+ kontrolna + pakietu + (czas życia) + pakietu + docelowy +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Komponent + Socket + Segment + Komponent+ Socket +
+ docelowy + docelowy + źródłowy + źródłowy + źródłowy +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ DANE +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dobra a teraz po kolei:
Suma kontrolna - w tym polu domyślnie znajdują się zera, ale może się w nim znajdować także
suma kontrolna obliczona na podstawie części IPX pakietu.
Dlugość pakietu - całkowiya długość pakietu IPX.
TC (czas życia) - podczas przetwarzania pakietu przez routery pole to zwiększane jest o 1. Największą
wartość jaką może wynosić to 15. Gdy któryś z routerów powiększy tą wartośc do
16 to wtedy pakiet jest porzucany.
Typ pakietu - może oznaczać:
+ (typ 0) - nieznany typ pakietu,
+ (typ 1) - pakiet inforamcji o topologii sieci,
+ (typ 4) - pakiet używany przez protokół SAP,
+ (typ 5) - pakiet SPX,
+ (typ 20) - rozprzestrzenialny pakiet IPX NetBIOS
Segment docelowy - adres sieci do której nalezy odbiorca pakietu. Jeśli odbiorca znajduje się w sieci
lokalnej to segment przyjmuje wartość 0.
Komponent docelowy - adres sprzętowy docelowego interfejsu sieciowego.
Socket docelowy - numer socketu uzywanego przez proces docelowy.
Segment źródłowy - adres sieci do której należy należy nadawca pakietu.
Komponent źródłowy - adres sprzętowy interfejsu sieciowego nadawcy.
Socket źródłowy - numer socketu używanego przez proces będący nadawcą pakietu.
Dane - dane pakietu IPX, które często zawierają nagłówek protokołu wyższej warstwy.
==========
2.12 SPX by CZaR|Ny
==========
Protokół SPX
Sequenced Packet Exchange
Protokół SPX jest głównym protokołem transportowym używanym w technologii NetWare. jest to
protokół nadrzędny w stosunku do protokołu IPX. Protokół ten zapewnia niezawodny sposób dostarczania
danych, wykorzystując w tym celu protokół IPX. SPX jest protokołem używającym okna o rozmiarze
jednego pakietu, zorientowanym na transmisje w pakietach.
Nagłówek pakietu SPX wygląda następująco:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Sterowanie połączeniem + Typ strumienia danych + Identyfikator połączenia (nadawcy) +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Identyfikator połączenia + Numer sekwencji + Numer kolejnej + Rozmiar alokacji +
+ (odbiorcy) + + sekwencji + +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
No i po kolei:
Sterowanie połączeniem - w tym polu znajdują się informacje służące do kontroli przepływu danych.
Typ strumienia danych - rodzaj danych przenoszonych za pomocą pakietu, czyli np.:
+ 0xFE - zawiadomienie o zakończeniu połączenia,
+ OxFF - potwierdzenie odbiory zawiadomienia o zakończeniu połączenia,
+ 0x00 - do wykorzystania przez użytkownika.
Identyfikator połączenia (nadawcy) - przydzielony numer połączenia IPX. Używany do demultiplexingu.
Identyfikator połączenia (odbiorcy) - przydzielony przez odbiorcę numer połączenia IPX. Używany do
demultiplexingu.
Numer sekwencji - numer ostatnio wysłanego pakietu. Pakiety są zliczane osobno w obu kierunkach.
Numer kolejnej sekwencji - numer sekwencji oczekiwanego pakietu.
Rozmiar alokacji - najwyższy numer sekwencji, jaki może zostac wysłany. Służy do bieżącego eliminowania
pakietów bez potwierdzenia odbioru.
==========
2.13 SAP by CZaR|Ny
==========
Protokół SAP
Service Advertisemenet Protocol
SAP jest protokołem, za pomocą którego różnego rodzaju demony serwerów sieciowych mogą rozprzestrzeniać
informację o swojej obecności i rodzaju świadczonych usług. Zazwyczaj informacje tego typu są rozsyłane
w odstępach 60-sekundowych. Identyfikator SAP określa rodzaj świadczonej usługi.
Pakiety SAP zawierają informacje o maksymalnie 7 usługach. Jeśli istnieje konieczność przekazania
wiadomości o większej liczbie usług wtedy wysyła się więcej pakietów.
Poniżej przedstawiam schemat budowy pakietu SAP.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Operacja + Typ usługi + Nazwa usługi +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Adres segmentu + Adres komponentu + Numer soketu + Czas życia +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Operacja - pole określające, czy dany pakiet jest zapytaniem czy odpowiedzią.
Typ usługi - identyfikator typu usługi np.:
+ 0x0004 - Serwer plików,
+ 0x0005 - Serwer zadań,
+ 0x0007 - serwer drukowania,
+ 0x0009 - archiwum,
+ 0x000A - kolejka zadań,
+ 0x0021 - SNA Gateway,
+ 0x002D - serwer czasu,
+ 0x002E - Dynamic SAP,
+ 0x0047 - Adversting Print Server,
+ 0x004B - Btrieve VAP,
+ 0x004C - SQL VA,
+ 0x0077 - nieznana usługa,
+ 0x007A - NetWare VMS,
+ 0x0098 - serwer dostępowy NetWare,
+ 0x009A - Named Pipes Server,
+ 0x009E - NetWare-Unix,
+ 0x0107 - NetWare 386,
+ 0x0111 - Test Server,
+ 0x0166 - NetWare Management,
+ 0x026A - NetWare Managemant.
Nazwa usługi - zawiera unikalny ciąg znaków będący nazwą serwera.
Adres segmentu - adres sieciowy serwera.
Adres komponentu - adres sieciowy komponentu.
Adres soketu - numer soketu dla żądań i odpowiedzi serwera.
Czas życia - liczba routerów i bramek na drodze pomiędzy klientem a serwerem.
Żeby zaoszczędzić na przepustowości sieci a także zabezpieczyć się przed przeciążeniami spowodowanymi
pakietami SAP, routery oraz bramki wyposażone są w odpowiednie filtry odrzucające niechciane pakiety
SAP. W dużych i średnich sieciach jest to konieczność. Zaleca się wtedy skonfigurowanie komunikatów
SAP tak, żeby odrzucały te z nich, które nie są konieczne dla działania sieci. Przykład: sieci fizyczne
oddalone od siebie z reguły nie potrzebują udostępniać sobie drukarek.
Jeśli uda zaatakować się router czy bramkę to wtesy można spowodować silne obciążenie lub nawet
załamanie duzych sieci, usuwając lub też modyfikując filtry pakietów SAP. Przeciążenie pakietami SAP
jest dość częstym powodem degradacji przepustowości sieci opartych na technologii Novell.
==========
2.14 RIP by CZaR|Ny
==========
Protokół RIP
Routing Information Protocol
W podstawowej wersji protokół ten jest protokołem, którego funkcjonowanie oparte jest na klasach
sieci. W kolejnej wersji tego protokołu wprowadzona została możliwość pracy bezklasowej. Formaty
obu wersji pakietu RIP przedstawione są poniżej:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Pole + Numer + Niewykorzy + AFI + Niewykorzy + Adres + Niewykorzy + Niewykorzy + Miernik +
+ cenie + wersji + stywane + + stywane + wpisu + stywane + stywane + +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rys.1. Format pakietu RIP
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Pole + Numer + Niewykorzy + AFI + Znacznik + Adres + Maska + Następny + Miernik +
+ cenie + wersji + stywane + + trasy + wpisu + podsieci + przeskok + +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
rys.2. Format pakietu RIP v.2
A teraz zajmijmy się znaczeniem pól:
Polecenie - określa czy pakiet jest żądaniem czy odpowiedzią.
Numer wersji - stosowana wersja protokołu.
AFI (Identyfikator Rodziny Adresów) - sygnalizuje typ stosowanego adresu:
+ IP (IPv4)
+ IP6 (IPv6)
+ NSAP
+ HDLC
+ BBN 1822
+ 802
+ E.163
+ E.164
+ F.69
+ X.121
+ IPX
+ Appletalk
+ Decent IV
+ Banyan Vines.
Znacznik trasy - określa czy trasa jest trasą wewnętrzną czy zewnętrzną.
Adres wpisu - adres IP wpisu.
Maska podsieci - maska podsieci IP wpisu.
Następny przeskok - adres IP routera kolejnego przeskoku.
Miernik - liczba przeskoków do sieci docelowej.
==========
2.15 RTMP by CZaR|Ny
==========
Protokół RTMP
Routing Table Maintenance Protocol
Jest stosowany jako protokół warstwy transportu w sieciach Appletalk. Został opracowany jako
protokół wektorowo - odległościowy zapewniający informowanie routerów lokalnych o dostępności
sieci. Format pakietu RTMP:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Sieć + Długość ID + ID węzła + Niewykorzystywane + Początek + Odległość + Koniec +
+ routera + + + + zakresu 1 + + zakresu 1 +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Opis:
Sieć routera - określa sieć, w której pracuje router.
Długość ID - określa długość identyfikatora węzła.
ID węzła - identyfikator węzła.
Początek zakresu 1 - początek zakresu sieci 1.
Odległość - odległość sieci.
Koniec zakresu 1 - koniec zakresu sieci 1.
==========
2.16 OSPF by CZaR|Ny
==========
Protokół OSPF
Open Shortest Path First
OSPF - protokół wybierania najkrótszej ścieżki. Protokół stanów przyłączy OSPF jest normą
przemysłową i zalicza się do grupy bogatych w funkcej zaawansowane protokołów bram wewnętrznych.
Oto jak wygląda format pakietu:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Maska + Interwał + Opcje + Priorytet + Interwał + DR + BDR + Sąsiad +
+ + + + + nieaktywności + + + +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Opis:
Maska - maska sieci przyłącza.
Interwał - odstęp czasowy pomiędzy kolejnymi pakietami Hello, w sekundach.
Opcje - opcjonalne funkcje routera.
Priorytet - priorytet routera. Wartość 0 uniemożliwia wybranie routera jako wyróżnionego.
Interwał nieaktywności - limit czasowy nieaktywności routera w sekundach.
DR - informacja o wyróżnionym routerze w sieci.
BDR - informacja o zastępcy wyróznionego routera sieci.
Sąsiad - identyfikatory routerów mających brać udział w transmisjach pakietów Hello.
==========
2.17 SMTP by CZaR|Ny
==========
Protokół SMTP
Simple Mail Transfer Protocol
Protokół ten jest głównie używany do przenoszenia poczty elektronicznej. Standardowo serwery SMTP
oczekują na przychodzącą pocztę na porcie 25, a odebraną pocztę kopiują do odpowiednich skrzynek
pocztowych. eśli wiadomość nie może zostać dostarczona, nadawcy zostaje zwrócony komunikat błędu
zawierający początkowy fragment wiadomości. Po uzyskaniu połączenia przy użyciu protokołu TCP
komputer wysyłający pocztę czeka na komputer odbierający pocztę, po to aby wysłać wiersz tekstu
identyfikujący klienta oraz informujący, że klient jest gotowy do wysłania poczty. W systemie
tym sumy kontrolne nie są wymagane do nawiązania kontaktu z powodu wewnętrznych mechanizmów
kontrolujących przepływ danych w protokole TCP. W momencie gdy poczta zostanie odebrana przez
serwer w całości, połączenie zostaje zwolnione.
Podstawowe problemy dotyczące wymiany poczty to m.in. mail bombing czy mail spamming, ale nie
brakuje też innych ataków typu DoS.
Teraz wyjaśniam co to jest atak DoS (denial of Service) - celem ataku tego typu jest zablokowanie
możliwości korzystania z określonych lub wszystkoch usług atakowanego serwera, lub też doprowadzenie
serwera do stanu, w którym atrakujący może poszerzyć swoje uprawniena do korzystania z serwera,
włącznie z przejęciem konta root'a.
A teraz w skrócie:
"mail bombing" - jest to atak typu DoS wykonywany przez wysyłanie na pojedyńczą skrzynkę pocztową
lub serwer dużej ilości poczty w celu ograniczenia dostępności serwera lub przepełnienia skrzynki
pocztowej.
"mail spamming" - nie jest to atak sam w sobie, ale przy wysyłaniu dużej ilości zbędnej poczty tj.
reklama na skrzynki pocztowe wielu użytkowników serwery zostają przeciążone i w gruncie rzeczy powoduje
to przepełnianie skrzynek pocztowych... blaaah, ale teraz namieszałem, ale mam nadzieję, że
zrozumieliście o co mi chodzi ;]
No to by było na tyle...
==========
2.18 ARP by CZaR|Ny
==========
Protokół ARP
Protokół ARP nie jest protokołem internetowym, nie pouszcza sieci lokalnej i nie musi byc routowany
z tego powodu. Jest rozsyłany do wszystkich interfejsów w sieci lokalnej za pomocą pakietów.
Jego budowa wygląda tak:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Typ sprzętu + Typ protokołu +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Długość adresu + Długość adresu + Pole operacji +
+ sprzętowego + protokołu + +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ARP - adres sprzętowy nadawcy (bajty 0 - 3) +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ARP - adres sprzętowy nadawcy + ARP - adres IP nadawcy pakietu +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ARP - adres IP nadawcy + RARP - adres sprzętowy odbiorcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ RARP - adres sprzętowy odbiorcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ RARP - adres IP odbiorcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
No dobra a teraz wyjaśniam:
Typ sprzętu - identyfikator typu fizycznego interfejsu hosta docelowego.
Typ protokołu - czyli typ protokołu używanego przez nadawcę.
Pole operacji - zawiera informację czy pakiet jest zapytaniem czy odpowiedzią protokołu
ARP czy protokołu RARP.
Reszta jest chyba jasna ;]
==========
2.19 RARP by CZaR|Ny
==========
Protokół RARP
Jest on w pewnym sensie odwrotnością protokołu ARP. Pozwala on komputerom rozprzestrzenić ich
adres sprzętowy, oczekując aż demon serwera zarządzający adresami w sieci lokalnej odpowie,
podając wolny adres IP. Dzięki temu protokołowi komputery bezdyskowe oraz inne urządzenia
sieciowe mogą otrzymywać własne adresy IP.
Ramka protokołu RARP wygląda następująco:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ARP - adres IP nadawcy + RARP - adres sprzętowy nadawcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ RARP - adres sprzętowy odbiorcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ RARP - adres IP odbiorcy +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Tutaj chyba też nie musze nic tłumaczyć bo łatwo się domyślić co jak z czym do czego ;]
==========
2.20 Model OSI by CZaR|Ny
==========
OSI czyli Open Systems Interconnection Model został opracowany przez ISO (International Organization for
Standardization) do opisania procedur wykonywanych podczas komunikacji. Model OSI zawiera siedem
warstw. Trzeba umieć rozpoznawać te warstwy jako osobne elementy, których współpraca jest
konieczna do skutecznej komunikacji. OSI pozwala na specjalizowanie się producentów w wypuszczaniu
nowych produktów, które są przeznaczone dla określonej warstwy modelu. Pozwala także usystematyzować
wiedzę.
Warstwy modelu OSI:
++++++++++++++++++++++++++++++++
+ APLIKACYJNA +
++++++++++++++++++++++++++++++++
+ MULTIMEDIALNA +
++++++++++++++++++++++++++++++++
+ SESYJNA +
++++++++++++++++++++++++++++++++
+ TRANSPORTOWA +
++++++++++++++++++++++++++++++++
+ SIECIOWA +
++++++++++++++++++++++++++++++++
+ PRZESYŁOWA +
++++++++++++++++++++++++++++++++
+ FIZYCZNA +
++++++++++++++++++++++++++++++++
No i teraz zabierzemy się za omawianie poszczególnych warstw od fizycznej aż do aplikacyjnej.
1. WARSTWA FIZYCZNA
Warstwa ta odpowiedzialna jest za przesyłanie sygnałów w sposób elektryczny, elektromagnetyczny,
mechaniczny, optyczny i każdy inny sposób, wykorzystując do tego fizyczne medium komunikacyjne.
Elementami tej warstwy są np. kart sieciowe, okablowanie, czy też topologie budowy sieci takich
jak Ethernet i Token Ring.
2. WARSTWA PRZESYŁOWA
Zapewnia ona wiarygodną transmisję bitów za pomocą sieci zbudowanej na warstwie fizycznej. Warstwe
tą możemy podzielić na dwie podwarstwy:
- MAC - podwarstwa ta jest odpowiedzialna za formatowanie ramek, definiowanie fizycznej toologii
sieci a także za detekcję błędów,
- LLC - zapewnia jednolity sposób komunikowania się warstwy przesyłowej z elementami wyższych warstw
przy wykorzystaniu jednakowego interfejsu niezależnie od różnic w fizycznej budowie sieci.
3. WARSTWA SIECIOWA
Na tym poziomie modelu OSI pracują protokoły adresowe oraz te których zadaniem jest wyznaczanie trasy
pakietów w sieci.
4. WARSTWA TRANSPORTOWA
Ta warstwa jest odpowiedzialna za przesyłanie danych w postaci ciągów bajtów niezaleznie od tego
czy są przesyłane w postaci strumieni (TCP), czy też w postaci osobnych datagramów (UDP). Ogólnie
rzecz biorąc zadaniem tej warstwy jest udostępnianie sposobu nawiązania połączenia (TCP), detekcja i
korekcja błędów przesyłanych pakietów oraz multiplexing i demultiplexing przesyłanych danych.
5. WARSTWA SESYJNA
Wastwa ta dokonuje, niezbędnej do poprawnego działania warstwy multimedialnej, koordynacji wymiany
danych pomiędzy komputerami. Przykładem protokołu używanego w tej warstwie jest protokół NetBEUI.
6. WARSTWA MULTIMEDIALNA
W tej warstwie operacje są wykonywane nie tylko na pojedyńczych bajtach, czy strumieniach danych, ale
także na nośnikach informacyjnych, wymagających kompresowania, dekompresowania, szyfrowania, deszyfrowania
itd. przy użyciu różnych systemów kodowania tj. ASCII, JPEG, MPEG, MP3 itd. Warstwa ta jest także
odpowiedzialna za przekazywanie danych do warstwy aplikacyjnej.
7. WARSTWA APLIKACYJNA
Jest ostatnią i najwyższą warstwą modelu OSI. Jej zadaniem jest bezpośrednie komunikowanie się z
użytkownikiem, umożliwienie aplikacjom dostępu do sieci, dokonywanie synchronizacji pracy różnych
aplikacji itd. Typowe usługi występujące w tej warstwie to FTP, WWW oraz SMTP.
No i tak w skrócie wygląda model OSI.
---------------------------------------------------------------------------------------------
---------------------------
3. Linux
---------------------------
==========
3.1 Polecenia w Linuksie by qrack
==========
Wszystkie polecenia mają składnie polecenie1 argument1 argument2 argumentn
Dzięki średnikowi (;) można pisać kilka poleceń w jednej linijce
oddzielając je tym znakiem od siebie.
spis poleceń
ls - to samo co dir w dosie, wyświetla pliki i katalogi
ls -a - wyświetla wszytskie pliki
ls -l - wyświetla wykaz szczegółowy
gdy chcemy mieć np, wykaz szczegółowy wszytskich plików piszemy ls -la
man komenda - manual do komendy, np
man ls - wypróbój sam
cd - zmiania katalogu. przykłady
cd /usr - przejście do katalogu usr
cd .. - przejście do wcześniejszego katalogu
cd / - przejście do głownego katalogu
cp - kopiowanie
cp plik /kat1/kat2 - kopiuje plik do /kat1/kat2
cp plik1 plik2 - kopiuje zawartość plik1 do plik 2
rm - usuwanie
rm plik1 - usuwa plik 1
rm -r kat1 - usuwanie katalogu kat1
rm -f - usuwanie bez potwierdzenia
rmdir - usuwanie pustych katalogów
rmdir kat1 kat2 kat3 - usuwa katalogi kat1 kat2 kat3
mv - przenoszenie i zmiania nazwy
mv plik1 plik2 - zmiania nazwy z plik1 na plik2
mv plik /kat - przenosi plik do kat
mkdir - tworzenie katalogu
mkdir kat - tworzy katalog kat
mkdir kat1 kat2 kat3 - tworzy katalog kat1 kat2 kat3
mkdir /kat1/kat2/kat3 - tworzy strukturę katalogową /kat1/kat2/kat3
chmod - udostępnianie
chmod 777 plik/katalog - udostepnianie pliku/katalogu na pelnych prawach
chmod 666 - prawo odczytu i zapisu dla wszytskich uzytkownikow
chmod -R - uzyj aby dodac prawa dostepu wszytskim plikom w katalogach
wiecej w manualu
cat - wyswietla zawartosc pliku n
cat plik1 - wyswietla zawartosc plik1 na ekranie
cat plik1|more wyswietla zawartość stronami
cat > plik1 - mozemy dopisac tekst do pliku1 gdy nacisniemy Ctrl+D
cmp - (compare) porownywanie zawartosci plikow
cmp plik1 plik2
df - wolne miejsce na wszytskich dyskach
df - disk free ilosc wolnego miejsca na dyskach
diff - pokazuje roznice miedyz dwoma plikami np.
diff plik1 plik2
dmesg - komunikaty startu systemu
du katalog - podaje wielkosc katalogu
finger - informacje o danym uzytkowniku np.
finger michal
ftp - obsłyga ftp, wpisujemy ftp a potem:
open - łączymy sie z jakimś serwerem, np open buraki.org.pl
get - pobieranie pliku
send - wysylanie pliku
bye - koniec sesji.
help - pomoc
grep katalog (lub plik) lancuch - przeszukiwanie plikow za danym lancuchem
last - sprawdzanie logow np.
last root - sprawdza kiedy logowal sie root
lastcomm - sprawdza co porabial ostanio dany uzytkownik np.
lastcomm jasio
less plik - lepsze od more mozna przegladac plik
logout - wylogowanie sie
man - super pomoc np.
man ls - wszystko o ls
mail - odbieranie poczty troche niewygodne napisz list otrzymasz liste
komend
more plik - dzieki temu poleceniu przejzych plik
mount - mountowanie dysków
jeśli chcemy zamountować np windowski dysk hda1 robimy tak:
1. tworzymy katalog np C w /mnt
2.piszemy
mount -t vfat /dev/hda1 /mnt/C
jeśli mountujemy cd-rom:
1. tworzymy katalog np. CD w /mnt
2. piszemy
mount -t iso9660 /dev/hdd /mnt/CD
taks amo dla partycji dosowskiej:
mount -t msdos /dev/hdc1 /mnt/D
i dla stacji FDD:
mount -t ext2 /dev/fd0h1440 /mnt/fd
passwd - zmiana hasla
jesli jestes zalogowany jako root, wpisujesz:
passwd user i podajesz nowe haslo
w innym wypadku najpierw wpisuejsz stare, potem nowe haslo
ps - pokazuje co porabiasz w pamieci
ps -aux - wszytskie procesy
set - ustawia zmienne
shutdown - wyłaczenie lub reboot kompa
shutdown -h now - wyłączenie kompa
shutdown -r now - reboot
tar - pakowanie/rozpakowywanie plików
tar -zxvf plik1.tar - rozpakowanie pliku
tar -cvf plik1 - pakowanie pliku
who - wypisuje informacje o zalogowanych uzytkownikach
whoami - podaje jako kto jestesmy zalogowani w systemie
==========
3.2 Odinstalowywanie Linuksa by CZaR|Ny
==========
Każdy kto od dłuższego czasu pracuje na Linuxie wie jakie zalety, a również jakie wady ma
system. Podstawa to opanować tylko środowisko i można naprawde dużo. Jest jednak pewien
problem dla początkujących użytkowników - instalacja, pierwsze kroki, czasem coś się
sypnie w systemie jak to na początku bywa i wtedy pojawiają się schody. Czasami trzeba
po prostu postawić system od nowa i żeby to zrobić czasami jesteśmy zmuszeni do
sformatowania dysku. I tutaj nasuwa się pytanie 'Jak to zrobić?'. Odpowiedź jest bardzo
prosta.
Istnieją dwa sposoby na odinstalowanie Linuxa.
+++++
3.2.1 Sposób pierwszy
+++++
Przejdź do pracy w trybie użytkownika root. Wywołaj program cfdisk i następnie wskaż
partycje Linuxa po czym usuń ją przyciskiem delete. Wskaz na partycję Windosową i aktywuj
ją przyciskiem bootable. Następnie zapisz zmiany stanu partycji przyciskiem write. Następnie
wyjdź z programu cfdisk klikając przycisk quit. Teraz trzeba się zając usunięciem z dysku
zawartości sektora ładującego czyli MBR z zapisanym tam LILO. Używa się do tego celu
polecenia /sbin/lilo -u. Ostatnią rzeczą, którą trzeba zrobić to zamknąć system Linux
poleceniem logout z poziomu środowiska graficznego lub poleceniem halt.
+++++
3.2.2 Sposób drugi
+++++
Można też usunąć Linuxa z poziomu ładowalnej dyskietki DOS-owej poleceniem fdisk. Istnieje
duże prawdopodobieństwo, że zamiast partycji Linuxowych zobaczysz jedną partycję typu
extendet. Usuwasz ją i teraz pozostaje już tylko usunięcie programu LILO z zeroewgo sektora
ładującego. Można to zrobić poleceniem fdisk /mbr.
Można teraz pomyśleć nad nową organizacją partycji.
==========
3.3 SDI dla Mandrake 8.2 by CZaR|Ny
==========
Każdy kto ma tą dystrybucje i SDI wie, że potrafi robić nam pewne złoślistwa i czasami nie
udaje się połączyć z netem za pierwszym razem. Czasami do plików nadpisują się głupoty takie,
że szok. Za pierwszym razem bawiłem się z tym jakieś trzy razy zanim połączył się z netem.
Więc do rzeczy. Pierwszą sprawą, którą trzeba się zająć to zainstalowaniem pakietu pppd. Ważne
jest też aby wsparcie dla PPP było włączone w konfiguracji jądra. Zazwyczaj przy standardowej
instalacji ta zależność jest spełniona.
Pierwszym plikiem który trzeba edytować to plik pap-secrets. Tam znajduje się miejsce dla loginu
oraz hasła, które zostało przydzielone przez TPSA. W umowie o SDI jest zawarty Login oraz passełko.
No to edytujemy plik /etc/ppp/pap-secrets i tam podajemy login * hasło Twoje_IP. Powinno to
mniej więcej wygladać tak:
begginer * haslobegginera 217.78.249.122
Po wpisaniu danych należy po podaniu adresu IP (czyli tutaj 217.78.249.122) entera.
Następnie należy edytować plik /etc/ppp/options. W tym pliku umieszcza się parametry wywołania
programu pppd. Dzięki temu nie trzeba będzie każdorazowo wpisywać tych opcji podczas usuchamiania
pppd.
W pliku options wpisujesz (za chwilke wytlumacze co oznaczają poszczególne wpisy):
115200
modem
defaultroute
noauth
lock
crtscts
persist
mru 1500
mtu 1500
user begginer <------------ tutaj zamiast begginer wpisujesz swój login tj. w pap-secrets
lcp-echo-interval 20
lcp-echo-failure 5
No i po ostatnim wpisie znowu enter.
A teraz co oznaczają wpisy:
115200 - szybkość połączenia,
modem - używanie modemu,
defaultroute - ustawianie routingu,
noauth - wyłączenie identyfikacji,
lock - ustawia plik lock dla danego portu,
crtscts - kontrola sprzętowa RTC/CTS,
persist - kiedy nastąpi przerwanie połączenia, pppd wznowi przerwane połączenie,
user login - nazwa użytkownika, która została przydzielona przez TPSA w umowie,
lcp-echo-interval 20 - wykrywa zerwanie połączenia,
lcp-echo-failure - odnawia połączenie w przypadku gdyby SDI się zwiesiło.
Ostatni plik, który należy edytować to resolv.conf. Ścieżka do liku to /etc/resolv.conf
W pliku tym wpisujemy:
search tpnet.pl
nameserver 194.204.159.1
nameserver 194.204.152.34
I tutaj tez po ostatnim nameserwerze należy dać enter.
I zrobione.
Połączenie wywołuje się poleceniem
pppd /dev/ttyS0
jeśli oczywiście modem masz podłączony do portu COM1. Jeśli do innego COMa to poniżej podaje
jakie wartości należy wpisać:
ttyS0 - COM1
ttyS1 - COM2
ttyS2 - COM3
ttyS3 - COM4
Teraz, żeby za każdym razem automatycznie przy starcie Linux automatycznie łączył się z
Internetem wystarczy edytować plik /etc/rc.d/rc.local i tam na samym końcu pliku dodać dwie
linijki:
echo "Starting HIS..."
pppd /dev/ttyS0
jeśli oczywiście masz na innym COMie podpięty modem to musisz zmienić wartość.
Teraz wystarczy albo uruchomić SDI poleceniem pppd /dev/ttyS0, albo zrebootować system i już
Linux jest podpięty do Internetu.
==========
3.4 Serwer DHCP by CZaR|Ny
==========
Dynamic Host Configuration Protocol czyli w skrócie DHCP jest protokołem umożliwiającym
zdalną konfigurację protokołu TCP/IP. Dzięki serwerowi DHCP będzie można przydzielać
automatycznie adresy IP w sieci lokalnej.
Zaraz przedstawie cały skrypt, który działa pod Mandrake 8.2 - tylko trzeba wpisac w
nim odpowiednie wartości, ale o tym zaraz.
A więc przechodząc do rzeczy - edytujemy plik /etc/dhcpd.conf i zabieramy sie za wpisywanie.
Ogólnie rzecz biorąc plik wygląda mniej więcej tak:
option domain-name "Jakas_Nazwa";
default-lease-time 86400;
ddns-update-style none;
max-lease-time 86400;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.2 192.168.1.200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
option domain-name-servers 192.168.1.1;
}
Host Twoj_Host {
fixed-address 192.168.1.10;
hardware ethernet 00:00:00:00:00:00;
}
No dobra - teraz sie pewnie zastanawiacie co to wszystko jest? Już tłumacze. Więc:
option domain-name - opcja ta informuje w jakiej domenie pracują komputery w naszej sieci.
Może to być np.: option domain-name "begginer.com"
default-lease-time - jest to okres na jaki zostaje wydzierżawiony adres IP loczony w sekundach.
Jeśli np. jest to dzierżawa na jeden dzień to wpisujesz default-lease-time 86400.
max-lease-time - to jest maksymalny czas dzierżawy adresu IP w sieci lokalnej.
subnet - adres sieci.
netmask - maska sieci.
range <adres startowy IP> <adres końcowy IP> - tutaj definiuje się początkowy i końcowy adres IP jaki
może przydzielać serwer DHCP. W naszym przypadku serwer DHCP przydziela adresy
z puli od 192.168.1.2 do 192.168.1.200.
option subnet-mask - czyli maska jaką musi sobie ustawić komputer kliencki w naszej sieci.
option broadcast-address - jest to adres rozgłoszeniowy sieci.
option routers - adres domyślnej bramy w podsieci, czyli inaczej gateway'a.
option domain-name-servers - w tym miejscu definiuje się adres IP serwerów DNS jakie mają używać
komputery w naszej sieci lokalnej.
W ten oto sposób mamy już skonfigurowaną sieć.
No pewnie myślicie OK, ale co z tym fragmentem??:
}
Host Twoj_Host {
fixed-address 192.168.1.10;
hardware ethernet 00:00:00:00:00:00;
}
W tym miejscu definiujecie wpisy dla konkretnych kart sieciowych.
W tym przypadku dla jednej. Więc tak:
Host - nazwa kompa w sieci któremu przydzielacie konkretny numer IP.
fixed-address - adres który dostanie ten komputer,
hardware ethernet - tutaj wpisujecie adres MAC karty sieciowej kompa, któremu przydzielacie na stałe IP.
Jak się dowiedzieć jaki adres MAC ma karta sieciowa? Otóż w windzie jest coś takiego jak winipcfg.
Uruchamia się go Start-->Uruchom-->winipcfg-->OK. Jak się pojawi okienko to wystarczy włączyć opcje
'Więcej Informacji' i tam już jest podany adres karty sieciowej. W linuxie komenda arp wyświetli wszystkie
karty, które słyszy (ale to z root'a), lub wystarczy komenda ifconfig.
No dobra - a jak to będzie wyglądało np. dla kilku komputerów w sieci?
Wtedy wystarczy tylko zmienić troszkę wpis:
}
Host Twoj_Host {
fixed-address 192.168.1.10;
hardware ethernet 00:00:00:00:00:00;
}
na troche inny:
}
Host ranger {
hardware ethernet 00:00:00:00:00:00;
fixed-address 192.168.1.10;
}
no i tak dalej i tak dalej :]
No dobra a teraz ostatnia sprawa - masz już plik i chcesz żeby wszystko sie ładnie uruchamiało
przy starcie Linucha. No to edytujesz plik /etc/rc.d/rc.local i na samym końcu dopisujesz coś
takiego:
echo "Starting DHCPd server"
dhcpd eth0
i wszystko powinno ruszyć bez większych problemów ;]
==========
3.5 Iptables dla Mandrake 8.2 by CZaR|Ny
==========
No jakby na to nie spojrzeć tego bym nigdy sam nie wymyślił. Ale to co wydaje się z początku trudne
zawsze jest prostsze niż się początkowo wydawało. Myślałem nad tym i myslałem, aż w końcu kolega
poratował mnie linkiem - nie pamiętam już go dokładnie, ale co tam. Wiem, że artykuł o tym jest na
stronie http://www.slackware.com.pl i ta konfiguracja działa także na Mandrake 8.2
To zaczynamy:
Najpierw należy utworzyć plik /etc/rc.d/rc.masq. W tym celu używamy polecenia touch rc.masq i zmieniamy
jego prawa poleceniem chmod +x rc.masq, co pozwoli na wykonanie pliku. Edytujemy pliczek rc.masq pod
edytorkiem np. pico i wpisujemy jego zawartość:
#!/bin/sh
# Uruchomienie przekazywania pakietow
echo "1" > /proc/sys/net/ipv4/ip_forward
# Czyszczenie tablic iptables (NAT i Filtrowanie)
/sbin/iptables -F -t nat
/sbin/iptables -X -t nat
/sbin/iptables -F -t filter
/sbin/iptables -X -t filter
# Odrzucenie i brak zezwolenia na forwardowanie pakietow
/sbin/iptables -t filter -P FORWARD DROP
# Przepuszczanie pakietow z sieci lub przeznaczone dla sieci
/sbin/iptables -t filter -A FORWARD -s 192.168.1.0/255.255.255.0 -d 0/0 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -s 0/0 -d 192.168.1.0/255.255.255.0 -j ACCEPT
# Udostepanianie Internetu przez Maskarade
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.2 -d 0/0 -j MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.3 -d 0/0 -j MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.4 -d 0/0 -j MASQUERADE
# Moduly do FTP i IRCa
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
I zapisujemy plik rc.masq - juz mamy maskaradke na iptables ;]
I tak:
192.168.1.0 - to adres sieci
255.255.255.0 - maska sieci
Kolejną rzeczą jest utworzenie odwołania do pliku rc.masq w pliku /etc/rc.d/rc.local.
Edytujemy plik rc.local i dopisujemy na samym końcu pliku:
echo "Starting Masquerade..."
if [ -x /etc/rc.d/rc.masq ]; then
/etc/rc.d/rc.masq
fi
Jeśli mamy również zainstalowany i skonfigurowany serwer DHCP i jest on również dopisany
do pliku rc.local to wtedy odwołanie do rc.masq musi być przed regółką uruchamiającą serwer
DHCP - w przeciwnym wypadku będą się sypać same błędy przy każdym starcie Linuksa, a będzie
to spowodowane wcześniejszym uruchomieniem serwera DHCP.
No a teraz wystarczy zrobić reboot systemu albo odpalić plik rc.local i gotowe.
==========
3.6 Konfiguracja serwera WWW pod Mandrake 8.2 by CZaR|Ny
==========
Więc jak już się postawiło serwer na Linuksie i jest już podłączony do netu, to czasami ma się
ochote na zrobienie własnej strony i wrzucenie jej na własny serwer. Jednak dystrybucja Mandrake
8.2 ma to do siebie, że ma troche inne nazwy plików niż w pozostałych dystrybucjach i czasami
trzeba się troche namęczyć, żeby te pliki znaleźć. Więc teraz opisze krok po kroku co i jak trzeba
zrobić, żeby mieć własny serwer WWW.
Zaczynamy....
Logujemy się na roota i zaczynamy.
Więc na samym początku należy zainstalować serwer Apache. W Mandarynce jest to plik
apache-1.3.23-4mdk.i586.rpm. Instalujemy go poleceniem rpm -i apache-1.3.23-4mdk.i586.rpm i mamy już
serwer Apache zainstalowany. Potem możemy doinstalować moduły obsługujące PHP, MySQL, XML itd :] - ale
to już według własnego uznania.
Co robimy dalej? Szukamy pliku commonhttpd.conf i edytujemy go - zapisujemy gdzieś jego oryginał, żeby
w razie jakiegoś błędu nie było problemów z uruchomieniem serwera WWW.
Na samym początku nadajemy prawa dla pliku /etc/rc.d/init.d/httpd
chmod 755 /etc/rc.d/init.d/httpd
Następnie wykonujemy polecenie:
/etc/rc.d/init.d/httpd start
i w ten oto sposób uruchamiamy serwer Apache.
Potem jeśli trzeba to konfigurujemy automatyczne uruchamianie serwera Apache poleceniem:
ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S85httpd
i konfigurujemy automatyczne zatrzymywanie serwera Apache:
-s /etc/rc.d/init.d/httpd /etc/rc.d/rc0.d/K15httpd
Jeśli te pliki są już w tych katalogach (czyli rc3.d i rc0.d) to ten krok można pominąć.
Kolejną rzeczą jest utworzenie konta administratora serwera www:
useradd -d /usr/local/www -p '********' -g users www
chown -R www /usr/local/www
gdzie -p '********' to własne hasło, które musisz ustawić, dla administratora serwera www.
No dobra - teraz sie można zabrać za kolejną część konfiguracji.
Edytujemy w końcu ten nieszczęsny plik commonhttpd.conf i zabieramy się za wpisywanie pewnych
rzeczy, które się przydadzą przy tworzeniu katalogów udostępnijących strony internetowe w necie
albo w sieci lokalnej.
No to otwieramy plik commonhttpd.conf w jakimś edytorze i modyfikujemy :]
Zaraz pod linią Alias /icons/ "/usr/local/www/icons" wpisujemy
Alias /Apache/ "/usr/local/www/htdocs/manual/"
zapisujemy plik commonhttpd.conf i restartujemy serwer Apache poleceniem:
/etc/rc.d/init.d/httpd restart
Teraz zajmiemy się dodawaniem nowego pliku indeksu. Edytujemy znowu plik commonhttpd.conf i
szukamy w nim linii DirectoryIndex. Powinna wyglądać tak:
DirectoryIndex index.html index.htm
i możemy tam dopisać jakie pliki indeksu ma obsługiwać nasz serwer www jwszcze, np. chcemy,
żeby obsługiwał pliki index.cgi, index.php3 i index.php, wtedy dopisujemy je do DirectoryIndex
i po wpisaniu ta linia w pliku commonhttpd.conf powinna wyglądać tak:
DirectoryIndex index.html index.htm index.cgi index.php3 index.php
Zapisz zmiany w pliku i znowu restart serwera WWW
/etc/rc.d/init.d/httpd restart
Kolejnym krokiem jest zmiana nazwy katalogu zawierającego strony użytkowników. Znowu trzeba
edytować plik commonhttpd.conf i znalezc linie UserDir i wpisanie do niej nazwy katalogu np.
public_html
UserDir public_html
Zapisujesz zmiany i znowu restartujesz serwer Apache poleceniem:
/etc/rc.d/init.d/httpd restart
No i dochodzimy prawie do końca.
Teraz tworzymy strony www poszczególnych uzytkowników Linuksa.
Zmieniamy uprawnienia dla katalogu osobistego np.:
chmod 755 /home/jakis_user
Gdzie 'jakis_user' to nazwa twojego konta domowego. Czyli np. jeśli masz konto w katalogu home o
nazwie dajmy na to marek to robimy coś takiego:
chmod 755 /home/marek
Wylogowujemy się z konta roota i logujemy się na własne konto np. marek i teraz tworzymy na swoim
koncie katalog public_html:
mkdir public_html
No i już mamy prawie wszystko :]
Ostatni krok to zalogowanie się znowu na konto root i edycja pliku commonhttpd.conf w celu
dopisania liniii przekierywujących określone adresy URL.
Szukamy linii Redirect i wpisujemy tam (tutaj dla konta marek):
Redirect /marek/ http://www.twoj_host.com.pl/~marek/
gdzie twoj_host to albo twoj numer IP albo domena jaką ustaliłeś przy konfiguracji serwera.
Na sam koniec pozostaje jeszcze tylko restart serwera Apache po raz kolejny:
/etc/rc.d/init.d/httpd restart
I to już koniec. Już jest zainstalowany serwer Apache. Możesz już wrzucać swoje strony WWW na serwer
i pokazywać je światu.
Widać, że troche zakręcony jest Mandrake, ale nie ma to jak Linuks ;)
Czyli jednym słowem mówiąc - No Windows, No Gates, Apache Inside :]
---------------------------------------------------------------------------------------------
---------------------------
4. Sieci
---------------------------
==========
4.1 Anonimowość w sieci by krasztest
==========
+++++
4.1.1 Wstęp
+++++
Ten dokument jak zreszta caly projekt jest skierowany do osob poczatkujacych, ktore chca
zapoznac sie z tematem internetu i hacku. Ten dokument traktuje o rozleglym temacie anonimowosci w
internecie.
+++++
4.1.2 Proxy
+++++
a) Anonimowe Proxy
Serwery proxy zwane takze w3cache sa to serwery dzieki ktorym nasza przegladarka nie musi laczyc sie z
bezposrednio ze strona, tylko laczy sie z serwerem proxy i stamtad sciaga odpowiednie dane. Oczywiscie
przedtem ktos musi laczyc sie z dana strona przez dane proxy. Proxy moze byc postrzegane jak pamiec cache
dla komputera. Tam znajduja sie najbardziej potrzebne dane i wlasnie stamtad sa one pobierane. Pamiec cache
jest szybsza od pamieci operacyjnej. I wlasnie tak ma pracowac serwer proxy. Ma przyspieszac pobieranie
danych z sieci. Polaczenie wyglada tak:
*********** ******* ************
*Nasz komp* ----------> *proxy* -----------> *strona www*
*********** ******* ************
Nalezy pamietac ze nie zawsze serwer proxy przyspieszy laczenie sie z dana witryna. Jesli nikt wczesniej sie z
nia nie laczyl bedzie to trwalo dluze, bo przeciez "przechodzimy" przez dodatkowy serwer. Jesli "kopia" strony
znajduje sie na serwerze proxy jest ona z tamtad przesylana wprost do naszego komputera.
Serwery proxy maja jeszcze jedna wlasciwosc.Dzieki nim mozemy zachowac anonimowosc w sieci. Laczac sie przez
serwer proxy ze strona internetowa jestemy postrzegani przez ta strone nie jako My lecz jako serwer proxy.
Jak to wyglada?
************* **************
*Nasz komp * *Proxy * ************
*IP: * ----------> *IP: * ----------> *Strona www*
*217.111.111* *195.111.111 * ************
************* **************
Proxy "maskuje" nasz adres IP dzieki temu strona www nie "postrzega" nas (217.111.111) lecz proxy (195.111.111).
Jest jedno ale...
b) Jak sprawdzic anonimowosc Proxy?
Nie kazdy sewrer proxy "maskuje" nasz IP (czyli jest anonimowy). Niektore serwery przepuszczaja nasz IP. Jak
znalesc anonimowe proxy? Istnieje wiele stron ktore udostepniaja listy serwerow proxy. Anonimowych i nie
anonimowych ( na koncu rozdzialu podam linki ). Nalezy jednak pamietac ze mimo iz twierdza oni ze dane proxy
jest anonimowe, nalezy zawsze to sprawdzic. Jak? Istnieje kilka sposobow. Mozna wchodzic na strony na ktorych
pokazany jest nasze IP i host. To najprostrza metoda. Istnieje takze strona http://www.all-nettools.com/tools1.htm
( na dole jest button "Proxy Test" ) dzieki ktorej mozna to sprawdzic. Jesli uzyjemy anonimowego proxy to
skrypt zwroci nam IP tylko serwera proxy. Kiedy wsrod danych znajdziecie swoje wlasne IP oznacza to ze uzyty
serwer nie jest anonimowy.
Jak ustawic laczenie sie przez proxy?
Kazda przegladarka internetowa ma taka opcje (chyba). W Operze wybieramy menu Plik->Ustawienia->Siec->serwer proxy.
Mozna ustawic takze dla innych polaczen (FTP, HTTPS).
W IE : Narzedzia->opcje internetowe->polaczenia->ustawienia sieci LAN->uzyj serwera proxy.
Istnieje jeszcze serwis http://anonimizer.com/ ktory umozliwia anonimowe polaczenie, lecz jest to usluga platna.
c) Skad wytrzasnac Proxy?
Linki do baz z serwerami proxy:
http://www.multiproxy.org/env_check.htm
http://www.proxy.prv.pl/
http://soldierproxy.s5.com/CurrentList.htm
http://www.novelsoft.com/dark/proxy/index.html
+++++
4.1.3 Konta shellowe
+++++
Konto shellowe sa to udostepnione zasoby innego komputera w sieci.Komputera postawionego na *nixie (Linux,Unix)
co laczy sie ze znajomoscia podstaw tych systemow operacyjnych. Dzieki temu laczac sie Lynxem (przegladarka
internetowa) jestesmy postrzegani jako serwer na ktorym mamy konto shellowe (mamy IP serwera a nie nasze).
Oczywiscie konto shellowe sluzy takze do mnostwa innych celow ( np. przechowywanie danych, stawiania botow
ircowych ) a nie tylko do surfowania po sieci. Jak znalesc takie konto?
Wpisz np. w googlach "konto shell" a znajdziesz. Wiekszosc ( o ile nie wszystkie ) sa to konta platne wiec
nalezy sie zastanowic gdzie i jak.
+++++
4.1.4 Java Script
+++++
Dbajac o nasze bezpieczenstwo proponuje wylaczyc w przegladarce internetowej obsluge Java Script. Niektore
skrypty moga byc bardzo niemile i np. zainstalowac na naszym koputerze niepotrzebne programy, lub wyciagnac
od nas jakies pliki. Oczywiscie nie wszystkie skrypty sa takie. Niektore strony nie beda sie otwierac dopoki
nie bedziesz mial wlaczonej obslugi Java Script, wiec jesli masz zamiar wejsc na jakas nieznana i szemrana
strone - po prostu wczesnej wylacz obsluge Java Script.
+++++
4.1.5 Cookies
+++++
Cookies ( czyli ciasteczka ) sa to informacje umieszczone na naszym dysku twardym zamieszczone przez serwer na
ktorym przegladalismy strone internetowa. Zawarte sa tam dane takie jak skad przywedrowalismy na dana strone,
jakie podstrony odwiedzilismy. Cookies umozliwiaja takze dostowsowanie strony do upodoban usera. Jesli uzytkownik
zawsze wchodzil na np. do dzialu download to przy kolejnym otwarciu strony serwer autoamtycznie przeniesie nas
do tego dzialu.
Niektorzy nie lubia aby zbierac o nim informacje. Mozna wiec wylaczyc przyjmowanie cookies. Zabezpieczy nas to
przede wszystkim od duzej ilosci czasami niechcianych plikow na dysku twardym. Dobrym wyjsciem jest ustawienie
akceptacji cookies dla danych serwisow. Nasza przegladarka bedzie akceptowala ciasteczka tylko od nich. Nalezy
pamietac ze niektore serwisy oparte sa na cookies, a co za tym idzie wylaczenie ich obslugi spowoduje niemoznosc
zaladowania strony lub wystapienie bledow.
+++++
4.1.6 Fake mail i mailbombing
+++++
Fake mail jest to list elektroniczny ktory nie ujawnia prawdziwego adresu nadawcy. Co potrzebuje?
Klienta telnetu i adresu serwera udostepniajacego mozliwosc wysylania maili. Chyba najlepszym klientem telnetu
jest program o nazwie CRT, wiec polecam go.
Nalezy polaczyc sie telnetem na port 25 serwera.
Serwer zareguje np :
220 adres.serwera.smtp ESMTP
Serwer czasami poda tez wersje programu.
piszemy :
helo cos_tam - przywitamy sie z serwerem, a on przywita si z nami. To co tu wpiszemy pojawi sie pozniej w naglowku poczty
mail from : ja@ty.pl - fakeowy adres spod ktorego wysylamy maila, moze byc dowolny
rcpt to : ktos@gdzies.cos - adres pod ktory wysylamy maila
data - zaczynamy pisac tresc maila
subject : jakis temat - temat listu.
tresc listu
np.:
Date: [tu data z godziną wedlug np. wzoru: 30 Mar 02 22:22:22]
From: [jeszcze raz adres nadawcy]
To: [analogicznie odbiorcy]
Subject: [wiadomo chyba;-).......]
[tresc wiadomosci np. "Cos tam cos tam";]]
. [piszemy kropke i wciskamy enter]
chcac zakonczyc wpisywanie tresci listu musimy napisac kropke (".") w oddzielnej lini.
Serwer poinformuje nas o skolejkowaniu maila do wyslania.
Pomimo tego ze ofiara otrzyma list od np: OsamaBinLadem@afganistan.org nie oznacza to od razu ze list jest
anonimowy. Nalezy wtedy zajrzec do naglowka i tam najczesciej w lini "Recived from:" bedzie sie znajdowal host
i adres IP wysylajacego. Niektore serwery nie przepuszcaja danych o nadawcy, ale trzeba takich poszukac. Sa to
najczesciej starsze wersje sendmaila. Niektore serwisy umozliwiaja wyslanie takich anonimowych maili. Odplatnie lub nie.
Nalezy tez pamietac ze niektore serwery SMTP nie wysla maila jesli nie bedzie pasowal im adres nadawcy lub odbiorcy.
Najczesciej chodzi o adres nadawcy i niektore serwery uniemozliwiaja wyslanie maila z innego adresu niz ich wlasny
( np: serwer smtp.costam.pl bedzie umozliwial wyslanie maila tylko z adresu gienek@costam.pl). Jesli trafimy na taki
serwer a nie zalezy nam na bardzo urozmaiconym adresie nadawcy wystarczy wpisac cokolwiek przed znakiem
malpy ( aaa@costam.pl, qwewqr@costam.pl)
Mailbombing jest to po prostu zalanie skrzynki internetowej olbrzymia iloscia maili. Jesli ofiara laczy sie poprzez
modem moze to zablokowac taka skrzynke bo sciaganie wszystkich maili potrwa bardzo dlugo. Jesli ktos ma stale
lacze ( np:SDI ) to nie bedzie to trwalo tak dlugo. Istnieje bardzo duzo programow sluzacych do wysylania takich
bomb np:Anubis. Wystarczy tylko wpisac kilka informacji i juz. Wazna rzecza jest to ze anonimowe bombery ( czy
tez e-mail sendery) same z siebie nie sa anonimowe. W opcjach umozliwiajace wyslanie fake maila oprocz danych
nadawcy i odbiorcy, tematu i tresci listu jest tez opcja uzycia danego serwera SMTP. Czy bedzie on anonimowy
zalezy od tego czy znajdziemy takowego.
+++++
4.1.7 Bezpieczenstwo danych osobowych
+++++
Wedlug mnie bardzo waznym sposobem zachowania anonimowosci w internecie jest zasada nie podawania prawdziwych
danych osobowych. Wymagane jest to min. przy zakladaniu kont poczty elektronicznej. Oczywiscie firma zobowiazuje
sie do nieudostepniania innym twoich danych, ale zawsze istnieje mozliwosc np.ich wykradzenia. Podczas procesu
tworzenia konta po prostu zmyslaj wszystkie dane. Nikt nigdy nie sprawdzi ich autentycznosci!!! Nie podawaj prawdziwego
adresu, nr telefonu, imienia i nazwiska.
==========
4.2 Obliczanie adresu sieci na podstawie adresu IP by CZaR|Ny
==========
Kiedy szukasz adresu sieci danego komputera a znasz jedynie jego adres IP oraz maskę
podsieci, zastanawiasz się co zrobić i nie wiesz jak to zrobić to jest na to sposób.
Dajmy na to, że adres IP sieci wynosi 205.0.125.81 a maska podsieci wynosi 255.255.255.224.
Aby obliczyć adres sieci danego komputera wystarczy wypisać ostatnie oktety adresu IP oraz
maski podsieci, a potem wystarczy dokonać logicznej operacji AND na każdej parze ich bitów.
No to zabieramy się za liczenie:
Najpierw liczymy wartość dla IP:
(.81)
Bity: 0 1 0 1 0 0 0 1
Wartość: 128 64 32 16 8 4 2 1
---------------------------------------------
64 +16 +1 = 81
~~
A potem zabieramy się za liczenie za liczenie wartości dla maski:
(.224)
Bity: 1 1 1 0 0 0 0 0
Wartość: 128 64 32 16 8 4 2 1
---------------------------------------------
128 +64 +32 = 224
~~~
Zgadza się? Pewnie, że sie zgadza...
Teraz zabieramy się za ostatnią operację czyli dokonujemy logicznej operacji AND:
(81 AND 224)
Bity(81): 0 1 0 1 0 0 0 1
Bity(224): 1 1 1 0 0 0 0 0
Bity(81 AND 224): 0 1 0 0 0 0 0 0
Wartość: 128 64 32 16 8 4 2 1
----------------------------------------------
64 = 64
~~
No i z tego widać, że adres sieci tego komputera, którego szukaliśmy wynosi 205.0.125.64
No dobra a teraz jakiś inny przykład, żeby sobie jeszcze udoskonalić liczenie.
IP sieci: 217.96.245.67
Maska sieci: 255.255.255.163
Zaczynamy liczyć:
(.67)
Bity: 0 1 0 0 0 0 1 1
Wartość: 128 64 32 16 8 4 2 1
-----------------------------------------------
64 +2 +1 = 67
(.163)
Bity: 1 0 1 0 0 0 1 1
Wartość: 128 64 32 16 8 4 2 1
-----------------------------------------------
128 +32 +2 +1 = 163
(67 AND 163)
Bity(67): 0 1 0 0 0 0 1 1
Bity(163): 1 0 1 0 0 0 1 1
Bity(67 AND 163): 0 0 0 0 0 0 1 1
Wartość: 128 64 32 16 8 4 2 1
-------------------------------------------
2 +1 = 3
I w ten oto sposób wiesz już, że adres wynosi 217.96.245.3
Myśle, że z innymi obliczeniami dacie sobie już rade, a jeśli dalej nie wiecie jak się to
liczy to prześledźcie jeszcze raz oba przykłady a na pewno zrozumiecie - to WCALE NIE JEST
TRUDNE!!!
==========
4.3 Sniffing by krasztest
==========
Sniffig jest to metoda podsluchiwania (przechwytywania) danych w sieci lokalnych. Kazdy komputer w sieci lokalnej musi
miec "cos" co polaczy go z ta siecia. Tym czyms jest karta sieciowa. W sieciach opartych o huby, sniffing jest bardzo
prosty. Huby dzialaja jak wzmacniacze. Odbieraja informacje, wzmacniaja je i rozsylaja je po wszystkich swoich portach,
niewiedzac do kogo jest adresowana ramka. Karta sieciowa sprawdza naglowek otrzymanej ramki i jesli byla ona adresowana
do niej, przyjmuje ja, jesli nie to po prostu ja ignoruje. Sniffery przestawiaja tryb pracy karty sieciowej w tryb
mieszany, co oznacza ze taka karta sieciowa bedzie przyjowala wszystkie ramki, takze te do niej nie adresowane. Przyjmijmy
ze ktos logowal sie na swoje konto pocztowe. Wiadome jest ze musi on wyslac swoj login i haslo. Z komputera te dane trafia
do huba, ktory rozesle je po calej sieci. Te dane dotra takze do naszego komputera i jesli dziala u nas sniffer przejmiemy je.
Siec moze byc takze oparta o switche. Switch jest bardziej inteligentnym uzadzeniem i juz nie rozsyla bezmyslnie jak hub
ramek po calej sieci. Dokonuje on analizy naglowka ramki (szuka adresu karty sieciowej odbiorcy). Switch posiada w swojej
pamieci tablice w ktorej zawarte sa adresy kart sieciowych i nr portow do ktorych sa dane karty podlaczone. Informacja w
rezultacie wysylana jest tylko do okreslonego komputera. Switch moze jednoczesnie dokonywac transmisji miedzy kilkoma
komputerami twozac w ten sposob kilka kanalow informacyjnych.
Czy mozna sniffowac w sieciach opartych na switchach? Mozna ale jest to o wiele bardziej trudne niz w sieciach opartych
na hubach. Mozna tak przeprogramowac tablice switcha, ze ramka skierowana do danego komputera zostanie wyslana takze na
nasz komputer. Mozna zasypac switcha falszywymi adresami MAC co w rezultacie doprowadzi do zawieszenia sie switcha i
przejscia w tryb pracy huba.
Sniffery to nie tylko programy do podsluchiwania. Sluza one przede wszystkim do analizowania ruchu w sieci, jako nazedzie
administracyjne. Podsluchujac duza siec moze sie zdarzyc ze przechwycimy duza ilosc danych, ktore sa nam niepotrzebne i
tylko zasmieca nam dysk. Nalezy wtedy nalozyc filtr. Sniffer odfiltruje informacje nam niepotrzebne.
Sniffera mozna takze uzyc na swoim wlasnym komputerze do podpatrzenia jakie dane sa od nas wysylane. Czasem zdaza sie ze
uzywany programow Peer-2-Peer (np. Kaaza) i nie wiemy czy programy te czasem nie zbieraja jakis danych o nas. Obserwujemy
wowczas to co wychodzi z portow naszego komputera. Oczywiscie zeby cos znalesc nalezy wiedziec czego sie szuka.
Jak wykryc sniffera w sieci?
Po pierwsze mozemy zainstalowac antysniffera, ktory bedzie sprawdzal tryby kart sieciowych. Jesli znajdzie taka w trybie
mieszanym, mozna podejzewac ze dzaiala tam sniffer. Mozna tez analizowac ruch w sieci. Mozna pingowac komputer podejrzany
o podsluchiwanie, wtedy czas odpowiedzi takiego komputera bedzie dluzszy niz w przypadku nie-sniffujacego komputera.
Jak ustrzec sie sniffingu?
Najwazniejsze wydaje sie byc szyfrowanie danych. Nie ustrzeze nas to przed przechwyceniem danych, ale skutecznie utrudni to
odczytanie np. hasel. Nalezy takze kozystac z szyfrowanych polaczen (SSH,SSL,PGP,HTTPS), mozna takze zastosowac tunelowanie.
po wiecej informacji : google.com
==========
4.4 Warchalking i Wireless LAN by krasztest
==========
Warchalking zalewa swiat. Nowa "technika" staje sie coraz bardziej popularna, tak jak bezprzewodowe sieci lokalne. Co
to jest Warchalking? Warchalking to po prostu rysunki kreda na scianach pokazujace min. jak daleko od wezla sie znajdujemy,
jaka jest jego przepustowosc (bandwidth), nazwa sieci. Co daje Warchalking? Daje mozliwosc darmowego dostepu do internetu
poprzez slabo zabezpieczone sieci. Wystarczy laptop, odpowiednia karta sieciowa i NetStumbler (program przeczesujacy
czestotliwosci w poszukiwaniu fal sieci, po namierzeniu sieci zwraca adres MAC Acces Pointow, nazwe sieci, SSID,czy uzyto
szyfrowania WEP i wiele innych ciekawych danych) i mozna zaczynac.
Slowo Warchalking ewoluowalo z WarDialing i przeksztalcilo sie w Wardriving czyli jezdzenie samochodem po miescie z
odpalonym Stumblerem i szukanie WLAN-ow. W uzyciu jest takze inne slowo opisujace podobna czynnosc lecz odbywajaca sie
pieszo :) Obecnie trwaja prace nad ujednoliceniem znakow uzywanych do mazania kreda po scianach ("Walchalkerzy" pisza
kreda, mimo iz napis kreda zniknie po pierwszym deszczu, a nie np. sprayem bo to juz podchodzi pod wandalizm i jest karalne.
W krajach na zachodzie writerzy sa scigani z o wiele wieksza zaciekloscia przez prawo niz u nas. To ma podobno zmusic do
czestych update-ow znanych wezlow). Niestety w Polsce ta metoda nie jest tak bardzo popularna jak w innych krajach,
szczegolnie na zachodzie Europy i USA.
Czestym bledem umozliwiajacym laczenie sie z WLAN-ami jest pozostawienie przez adminow dostepu do takiej sieci bez potrzeby
logowania.
IEEE 802.11b to najbardziej rozpowszechniony protokol sieci bezprzewodowych. Standard 802.11b jest zdefiniowany w pasmie
2.4GH. Sieci bezprzewodowe wykorzystuja dwie topologie : gwizdy i kraty. Topologia gwiazdy wykozystuje do komunikacji
Acces Poit (punkt dostepu) czyli stacje bazowa. Moze byc ona takze mostem do przewodowej czesci sieci. W topologii kraty
brak jest centralnego Acces Pointa, kazdy wezel moze swobodnie komunikowac sie z sasiednim wezlem.
Innym rozwiazaniem jest specyfikacja Bluetooth, dajaca mozliwosc przesylania danych na odleglosc 10m i 100m z
przepustowoscia 1Mbps w pasmie 2.4 GH. Dzieki niemu weszlo nowe okreslenie sieci komputerowej - PAN (Personal Area Network).
Jest to idealne rozwiazanie dla malych firm gdzie odleglosc nie przekracza 10m.
Siec bezprzewodowa moze skladac sie z dwoch komputerow jak rowniez z kilkudziesieciu stacji i wielu Acces Pointow. Komputer
musi posiadac odpowiednia karte sieciowa, dzieki ktorej poprzez Acces Pointy bedzie przesylal dane. Siec bezprzewodowa moze
istniec sama jak rowniez moze byc czescia (podsiecia) wiekszego LAN-a.
Sygnal sieci bezprzewodowych rozchodzi sie w powietrzu, nie tylko w okreslonym zasiegu, ale takze duzo dalej, lecz nie
jest on juz tak mocny aby karty sieciowe mogly go wykryc. Mozna wtedy uzyc specjalnych duzych anten, ktore wylapia ten
sygnal.
W standardzie zaimplementowano protokol WEP (Wired Equivalency Protocol) aby chronic prywatnosc sieci bezprzewodowych
(WLAN jest o wiele bardziej narazony na podsluch niz normalny przewodowy LAN z tego powodu iz nie istnieje potrzebna
fizycznego podlaczenia do sieci). WEP mam za zadanie zapobiec nieautoryzowanemu dostepowi do sieci.
Administratorzy WLAN-ow zaczynaja stosowac techniki bezpieczenstwa znane z przewodowych sieci. Dobrym sposobem jest
stworzenie honey pota, ktory ma za zadanie zwabic potencjalnego napastnika. Komputer taki ma sprawiac wrazenie waznego
serwera z waznymi danymi a przy okazji troche slabiej zabezpieczonego, jednoczesnie z zainstalowanym systemem monitoringu.
System analizuje ruchy hakera i ma go caly czas na oku. Podczas gdy ten buszuje na serwerze, loguje sie jego dzialania i
tworzy jego profil. Honey pot moze byc laptopem bedacym w zasiegu WLANa.
==========
4.5 WAN ROUTING by Remarks
==========
Jak sama nazwa wskazuje document ten nie jest szczegółowym opisem zagadnienia routingu. Jego celem jest, owszem,
dostarczenie pewnej wiedzy ale nie bedzie ona wiedzą specjalistyczną, wiec nie dziwcie sie jeżeli niektóre zagadnienia
ze względu na pewne ograniczenia (czasowe i objętosciowe) bedą podane w sposób uproszczony, łopatologiczny :P
Jednoczesnie zakładam iż czytelnik posiada pewna wiedzę (wie mniej więcej co to jest TCP/IP,model OSI etc) i ma
minimum IQ 110 :P
PS: Prosze o wyrozumiałość ...to mój pierwszy faq
A teraz konkrety...........
ROUTER w LANie
1.LAN, cechy charakterystyczne sieci lokalnych(rozważania teoretyczne);
2.Segmentacja
1.
Chyba kazdy z nas potkał się z LAN (Local Area Network). Jest to dosłownie sieć o zasięgu lokalnym. Do zapewnienia
możliwości w nich wymiany informacji nie są potrzebne routery, gdyż kazdy host ma bezposredni dostep do tego samego
medium transmisyjnego(kabel koncentryczny, skrętka,światłowód) co obiekt docelowy. Poza tym takie sieci mają
z racji lokalnego zasięgu, jednolitą zazwyczaj budowe fizyczną (rozwiązania, sposób pracy i paramentry elektryczne)
oraz topologie (magistrali, pierscienia, gwiazdy).Nie potrzebne są więc tam żadne urządzenia aktywnie pośredniczące w
wymiane danych, z wyjatkiem tych, które pozwalają retransmitowac(wzmacniać) sygnały elektrycznie i go nie
zmieniaja(huby, switche). Mowiąc uczenie LAN jest narzedziem do komunikacji, ktore działa na wastwie fizycznej i
łącza modelu OSI, zapewniając dwie krytyczne 'usługi'- dostępu do nośnika (to że mozesz fizycznie się podpiąć) oraz
zdolnosć do zaadresowania(adresy MAC 48-bitowe) i przesyłanian ramek(funkcjonalnie jest to warstwa łącza - link leyer)
danych do innych lokalnie podłączonych maszyn. Lokalnośc zasięgu należy wiązać z fizycznymi mozliwosciami transmisji
i jej ograniczeniami konstrukcyjnymi (topologia sieci tez wpływa na wydajność sieci, liczba hostów) oraz zastosowaniem
jednolitej technologii z którą musi być zgodny sprzęt użytownika.
To co wyróżnia LAN od WAN (sieci rozległych, o których wkrótce powiem) to posiadanie tzw. domeny dostepu do nośnika.
Słowo domena ma tu znaczenie zblizone do "zasobu"(maksymalnej przepustowości dostępnej w sieci). Domena jest tu
"obszarem" w sensie sieci z ktorego możemy uzyskać dostep(fizyczny) do "uslug" (tu transmisji danych) gwarantowanych
przez LAN. Ow dostęp jest różnie ograniczany aby moc zapewnić korzystanie z możliwości łączności przez jak największą
liczbe hostów jednoczesnie.
W sieciach na bazie standardu Ethernet ma to charakter rywalizacji (domena rywalizacji). W sieci takiej dsotep
opiera się na wspołzawodnictwie (dość chaotycznym) o mozliwośc transmisji w danej chwili danych. Każde urządzenie
podłączone do domeny rywalizacji moze rozpoczać transmisje dopiero w momencie wykrycia , ze aktualnie żaden inny ruch
nie odbywa się w nosniku (fizycznym). W rzeczywistości, poniewaz transmisje nie sa natychmiastowe, cisza ze strony
LAN może oznaczać,ze urzadzenia w dalszym ciagu moga emitowac sygnały ale transmisja nie dotrła do nasluchujacego hosta.
W takim wypadku rozpoczęcie nowej transmisji spowoduje elektryczne nałozenie sie impulsów i powstanie przekłamań,
ponieważ w każdej chwili wszystkie urządzenia w sieci maja elektryczny dostęp do medium (i wszystkie przechwytuja
nawet te ramki, które nie sa bezposrednio do nich adresowane!).
Określa się to mianem domeny kolizji czyli obszaru sieciowego w której możliwe jest zakłucenie transmisji poszczególnych
hostów przez siebie na wzajem. Dlatego też wazne jest aby sieci nie składały się ze zbyt duzej ilosci kompów walczacych
o łacze( norma IEEE to 1024 hosty) oraz aby odległosci skrajnych konców sieci były na tyle blisko by mozna bylo wykryc
kolizje(ok 200-300 w zalezności od medium i uzywanego standardu ethernet. Wiecej info na ten temat: www.net.pagina.pl).
Oczywiście istnieją tez inne metody sterowania dostepem do nośnika np. przesyłanie znacznika jak w pierścieniu FDDI
(światłowód) i Token Ring ale nie będe tu ich teraz opisywał gdyż nie jest to celem tego faqu a wymienione technologie
zadko uzywane (FDDI zazwyczaj jest wykorzystywane do konstruowania łączy miedzysieciowych MAN,łączenia switchy w duzych
lanach, zas token ring to w zasadzie juz stary grzmot i nadaje się do muzeum :P ).
Kolejny waznym zagadnieniem jest domena rozgłaszania MAC. W "skład" owej domeny wchodzą wszystkie urządzenia, które w
wyniku rozgłoszenia jednej maszyny do wszystkich pozostałych (transmisja pod adres broadcast FF:FF:FF:FF:FF) są w stanie
bezpośrednio odebrac nadawane dane bez wykorzystania protokolow warstw wyższych.....
2. Segmentacja
....Zawsze mozna rozszerzyc (lub modelowac) domene podłączając kolejny segment LAN np. poprzez hub/switch lub most
(brigde) czy tez wykorzystanie technologii VLAN. Jednak wymienione przeze mnie rozwiazania róznia sie.
O ile hub tworzy z dwóch domen kolizji jedną, o tyle switch(w takiej sytuacji pełni funkcje brigde'a) zachowuje
ich rozdzial pozytywnie wpływajac na wydajnosc sieci( mniej kolizji = mniejsze opóźnienia, szybszy transfer).Tak czy
siak otrzymujemy jedną domene MAC.....i własnie na tym polega segmentacja. Nalezy ponadto zauważyć że jesli do switcha
podłączymy same hosty końcowe (a nie segment lan np. na hubie) to w zasadzie w takiej sieci nie istnieje domena kolizji.
A to dlatego iż switch przypisuje adresy MAC komputerów do portów fizycznych do których podłączone sa poszczególne
kompy.Tak więc pakiety skierowane do konkretnego kompa nie sa rozgłaszane w całej sieci (script kiddie ze sniferem
nic tu nie zdziała :P ).
BRIDGE.
...czyli most jest sprzętowym (lub softwarowym - choc z takim się jeszcze nie spotkałem) urządzeniem, które dziala na
warstwie łącza i fizycznej i segmentuje domene dostepu do nośnika a jednocześnie scalajac domeny rozgłoszenia. Wszystkie
mosty trzymają tablice (agregują ze sobą port(y) fizyczny i adres(y) MAC).
Jak działa wiec mostkowanie?
Gdzy most otrzyma pakiet(z nieswitchowanej sieci) sprawdza w tablicy czy pakiet ten jest przeznaczony do innej sieci
którą bridge łączy czy też docelowy komp znajduje sie w tym samym LANie z którego przyszedła ramka? Jeśli dojdzie do
2 sytuacji to nie podejmuje żadnych działań gdyż na pewno juz go odebrał adresat. Jesli zaś ramka jest przeznaczona do
innej sieci przekazuje ją.
Tak działa most przeźroczysty (transparent) i jest on wbudowany w wiele switchy i hubów (obsługujących rózne topologie
- nie mylić z rodzajami LAN !!!) i routerów.
TRANSLATING BRIDGE.
...czyli most tłumaczący, pozwala na łączenie routerów o róznych topologiach i architekturach(np. token ring, ethernet,
FDDI) uzupełniając funkcje mostu przeźroczystego mozliwościa konwersji ramek i sygnału elektrycznego. Jednak te
udogodnienie moze być stosowane tylko dla architektur o tych samych długościach adresu i zgodnych z zaleceniami
IEEE na adresowanie MAC.
SPEED-BUFFERING BRIGDE.
...czyli most z buforowaniem prędkości łączy sieci o podobnej architekturze ale róznej prędkości transmisji.
SWITCH(przełącznik)
to urządzenie wieloportowe w przeciwieństwie do bridge'a, często integrujace w sobie jego funkcje(np. funkcje translacji).
Tak jak mosty "uczy się" adresów MAC(przypisuje je do port(ów)) i tworzy czasowe logiczne scieżki dla połączeń z ich
własną specyficzna szybkoscia trasnmisji. Innymi słowy jesli do switcha np. 5 kompów z kartami 10Mb/s to nie współdziela
oni ze sobą tego pasma (10/5 = 2 Mb/s) lecz każdy z nich ma do dyspozycji pełne pasmo 10MB (przez switch przepływ wtedy
5*10Mb/s)
HUB(koncentrator)
prosty "łącznik" zestawiający jedną domene dostepu i MAC. W takiej stworzonej domenie wszystkie kompy dzielą sie pasmem.
---------------------------------------------------------------------------------------------
---------------------------
5. Systemy Operacyjne
---------------------------
==========
5.1 Systemy Operacyjne by krasztest
==========
+++++
5.1.1 Wstep
+++++
Nie bedzie tu opisany zaden system , lecz tylko nakresle z jakich czesci skladaja sie systemy operacyjne i jak wyglada ich
budowa. Nie bedzie to wielka rozprawa na ten temat bo przeciez mozna by kilka ksiazek napisac, postaram sie zawrzec kilka
najwazniejszych informacji.
+++++
5.1.2 Nizszy poziom zarzadzania procesorem (procesami)
+++++
W tej warstwie procesom przydziela sie procesor lub procesory, a kazdy z procesow ma wlasna przestrzen adresowa (proces
to - w skrocie - uruchominy program). Procesy moga dzielic sie na watki, ktore dzialaja na wspolnej przestrzeni adresowej.
Im takze przydziela sie procesor. Na nizszym poziomie zarzadzania procesorem nastepuje takze synchronizacja procesow (poprzez
semafory). Procesy sa reprezentowane za pomaca Bloku Kontrolnego Procesu. Jeden Blok to jeden proces. Blok taki zawiera
min. informacje :
- stan procesu
- licznik rozkazow tego procesu
- rejestry procesora dotyczace procesu
- informacje zwiazane z przydzielaniem pamieci operacyjnej
- informacje o stanie przydzielonych urzadzen I/O
Skoro w tej warstwie przydziela sie procesom procesory, musi istniec jakis sposob (algorytm) aby rozwiazac ten problem.
Algorytm karuzelowy - Procesy w stanie gotowosci sa umieszczane na liscie cyklicznej. Procesor zostaje przydzielony jednemu
z nich a po uplywie pewnego czasu, przydziela sie procesor kolejnemu procesowi.
Algorytm z uwzglednieniem priorytetu - Niektore procesy w systemi sa wazniejsze, wiec daje sie im wiekszy priorytet. Procesor
przydziela sie temu procesowi, ktory jest w stanie gotowosci i posiada najwiekszy priorytet. Proces moze utrzymywac procesr
tak dlugo jak potrzebuje, lub proces o wyzszym priorytecie moze trzymac procesor dluzej od procesow z nizszym priorytetem.
Algorytm uwzgledniajacy odwrotnosc kwanta czasu - Gdy proces wykozysta caly czas jemu przydzielony, umieszczany jest na koncu
kolejki, lecz gdy proces wykozysta np. polowe czasu, umieszcany jest w polowie kolejki procesow.
+++++
5.1.3 Zarzadzanie pamiecia
+++++
a)Jeden spojny obszar
Ta metoda wykozystwywana jest w systemach w ktorych nie ma wieloprocesowosci. W danym momencie w pamieci moze istniec tylko
jeden proces, ktory musi byc mniejszy od dostepnej ilosci pamieci operacyjnej.
b)Strefy
W pamieci moze istniec na raz wiele procesow. Kazdy proces otrzymuje jeden spojny obszar w pamieci. Gdy proces jest usuwany
nastepuje zwolnienie nastepuje zwolnienie strefy. W przypadku gdy tuz za lub tuz przed zwalniana strefa istnial wolny fragment
pamieci, to tworzony jest z nich jeden wolny obszar pamieci. Wada tej metody jest tzw. fragmentacja pamieci czyli duza liczba
bardzo malych wolnych obszarow pamieci. W sytemie przechowuje sie tablice obszarow wolnych oraz tablice stref procesow.
c)Strefy przemieszczalne
Metoda ta jest bardzo podobna do metody Stref lecz w przypadku gdy trzeba utworzyc strefe wieksza od najwiekszego wolnego
obszaru dokonuje sie przesuniecia istniejacych stref do przodu albo do tylu. Umozliwilo to wyeliminowanie fragmentacji
pamieci.
d)Stronnicownie
Pamiec operacyjna jest podzielona na bloki o tej samiej wielkosci, a przestrzen adresowa procesu jest podzielona na stronnice
o takiej samej wielkosci jak bloki. Stronnice sa umieszczane w blokach. Kazdy proces posiada tablice odwzorowan stron w bloki
(Pege Map Table) czyli przypozadkowanie blokow do stron.
e)Stronnicownie na zadanie
dzieki tej metodzie mozna sztucznie zwiekszyc pamiec operacyjna poprzez wykozystanie pamieci dyskowej. Mniej potrzebne stronnice
przechowywane sa na dysku twradym. Jesli stronnica przechowywana na dysku jest potzrebna sciaga ja sie do pamieci oeracyjnej.
PMT posiada dodatkowa kolumne, ktore okresla czy stronnica znajduje sie na dysku czy w pamieci operacyjnej.
f)Segmentacja
Program dzielony jest na logiczne jednostki odzwierciedlajace jego budowe. Segmentami moga byc wiec funkcje nistandardowe,
procedury itp. Istnieje tutaj tablica odwzorowan segmentow, zawierajaca takie informacje jak:
- rozmiar segmentu
- stan segmentu
- miejsce umieszczenia segmentu w pamieci
- operacje
Wiele procesow moze kozystac z tych samych segmentow, wiec pamietane sa one tylko w jednej kopii.
g)Segmentacja ze stronnicowniem na zadanie
Segmenty skaladaja sie ze stronnic o tej samej wielkosci, a wiec nie wszystkie stronice segmentu musza sie znajdowac naraz w
pamieci.
+++++
5.1.4 Wyzszy poziom zarzadznia procesorem.
+++++
W tej warstwie procesy tworzy sie, usuwa, zatrzymuje i wznawia.Tutaj znajduja sie tez mechanizmy wykozystywane do komunikacji
miedzy procesami.
Tutaj wybiera sie sposrod procesow przedlozonych, te ktore przejda do stanu wprowadzenia (zostanie utworzony dla nich Blok
Kontrolny Procesu). Jesli w stanie wprowadzenia otrzymaja potrzebne im zasoby to przejda one do stanu gotowosci.
Procesy moga komunikowac sie ze soba poprzes wysylanie komunikatow. Moze sie to odbywac na drodze:
a)proces A wysyla komunikat procesowi B i czeka na potwierdzenie odebrania
b)proces A wysyla komunikat procesowi B i kontynuuje swe dzialanie nie czekajac na potwierdzenie
c)proces A wysyla komunikat do skrzynki S i ten proces ktory zajrzy tam jako pierwszy odbiera komunikat
Komunikat to obszar pamieci ktory zawiera min. takie informacje jak wskaznik do nadawcy, wielkosc komunikatu, tresc, wskaznik
do nastepnego komunikatu.
+++++
5.1.5 Warstwa zarzadzania urzadzeniami I/O
+++++
Ta warstwa zajmuje sie min.:
- planowaniem operacji I/O
- buforowaniem
- spoolingiem
- rezerwacja uzadzen
- obsluga bledow urzadzen
+++++
5.1.6 Poziom zarzadzania informacja
+++++
Sklada sie z modulow:
- modul symbolicznego systemu plikow (zamienia nazwy plikow i katalogow na unikalny identyfikator)
- modul podstawowego systemu plikow (sprawdza czy dany plik jest juz otwarty. Jesli tak to dane o tym pliku przechowywane sa
w tablicy aktywnych plikow. Jesli nie to przeglada sie podstawowy katalog plikow aby pobrac odpowiednie dane)
- modul sprawdzania mozliwosci dostepu (maciez kontroli dostepu, listy kontroli dostepu, hasla, szyfrowanie)
- modul logicznego systemu plikow
- modul fizycznego systemu plokow (przelicza nr bajtu na nr bloku ktory trzeba wczytac z dysku i przekazuje do poziomu
zarzadzajacego urzadzeniami I/O wlasciwa operacje I/O)
- poziom zarzadzajacy I/O (transmituje dane do wlasnego bufora. Po zakonczeniu transmisji przenosi dane do wlasciwego miejsca
w pamieci operacyjnej)
---------------------------------------------------------------------------------------------
---------------------------
6. Programowanie
---------------------------
==========
6.1 BASH programowanie by CZaR|Ny
==========
BASH jest najbardziej popularną powłoką używaną na systemach *nixowych, a także skryptowym
językiem programowania, która umożliwia efektywnie zarządzać systemem.
Zajmiemy się zaraz prostymi przykładami i omówimy ich działanie.
No to zaloguj się na swoje konto domowe na Linuxie.
Pierwszą rzeczą jaką musisz zrobić to w linni komend wpisać polecenie:
touch skrypt
i masz juz utworzony skrypt, ale jest on pusty. Edytuj plik pod jakimkolwiek edytorem - może
to być edytor pod Midnight Commanderem lub pod pico lub jakimkolwiek innym i teraz zabierasz
się za tworzenir swojego pierwszego skryptu. Pierwsza linia skryptu wygląda zawsze tak samo:
#!/bin/bash
Ta linia ma największe znaczenie - wskazuje ona na rodzaj shella w którym ma być wykonany
skrypt. Tutaj jak widać skrypt będzie wykonany przez interpreter poleceń /bin/bash. Jest to
niezależne od tego jaki rodzaj powłoki w danym momencie używasz.
Najprostszym skryptem jest wyświetlenie na ekranie napisu: "Witaj świecie!".
Zaczynamy więc zabawę. Wpisz do skryptu taka oto zawartość:
#!/bin/bash
#To jest moj pierwszy skrypt
echo "Witaj swiecie!"
Linia '#To jest moj pierwszy skrypt' jest komentarzem i nie będzie ona wyświetlana podczas
uruchamiania skryptu. W bashu każdy komentarz zaczyna się właśnie od Hasha, czyli tego
znaku ---> #
Zapisz skrypt. Teraz już masz gotowy swój pierwszy skrypt. Wystarczy nadać mu jeszczetylko
prawa wykonywalności:
chmod +x skrypt
Teraz ostatnią rzeczą jaką musisz zrobić to uruchomić skrypt. W linii poleceń wpisujesz:
./skrypt
Wciskasz enter i co pokazuje się na ekranie? No właśnie - na ekranie pokazuje się napis:
Witaj swiecie!
W ten oto sposób napisałeś i uruchomiłeś swój pierwszy skrypt BASHowy.
Jak już wiesz jak pisać skrypty dla powłoki oraz jak je uruchamiać możesz się wziąść za
dalszą edukację. Jednym z lepszych kursów w internecie jest kurs diefa.
Kurs ten znajduje się na stronie http://republika.pl/dief/main.html
Link do jego strony podany jest również w Linkach ;]
==========
6.2 Wstep do programowania w C by CZaR|Ny
==========
No dobra czas się wziąść za programowanie w C. Jeśli dalej sie zastanawiasz czy warto programować
to przeczytaj sobie text Estora na ten temat. Text ten znajdziesz na jego stronie, czyli dokładnie
pod tym adresem: http://www.estor.terramail.pl/bycprogramista.html
Programowanie nie jest trudne, ale trzeba sie przyłożyć i chcieć programować i poszerzać swoją wiedzę.
W tym tekście tylko chce przybliżyć jak powstają proste programy, z czego się składają i dlaczego
warto pogłębiać tą wiedzę.
No to startujemy.
Pierwszą rzeczą jaka jest potrzebna to oczywiście środowisko w którym będziemy tworzyć i kompilować
programy napisane przez nas. Jakie są dobre programy do pisania własnych aplikacji w języku C? Jest
ich wiele i każdy znajdzie coś dla siebie. Na sam początek polecam: Miracle C, Borland C - w sumie
proste i dość przyjemne w obsłudze jeśli chodzi o Windows. Pod systemami operacyjnymi z rodziny
*nixów wykorzystuje się kompilatory cc i gcc, a programy pisze się w notatnikach np. pico. Gcc i cc
służą tylko do komilacji napisanego już programu.
Jak już masz kompilatory to czas zacząć naukę. Zabieramy się za pisanie pierwszego programu.
Otwórz sobie nowy projekt i tam wpisz:
#include <stdlib.h>
int main(void)
{
/* Program wyswietla napis */
printf("Witaj. Jestem Twoim pierwszym programem!\n");
return 0;
}
Po skończeniu należy tylko zapisać program np. moj1.c, potem skompilować i powinien uruchomić się
program, który wyświetli jedną linię. Będzie to wygladało tak:
Witaj. Jestem Twoim pierwszym programem!
No dobra uruchomić się uruchomił, ale co ten cały kod oznacza?
Więc od początku:
#include <stdio.h>
Dodanie tego wiersza daje taki sam efekt jak dołączenie do programu całej zawartości pliku 'stdio.h' w
miejscu, gdzie znajduje się słowo 'include'. Include to inaczej pliki dołączane. Są one wygodnym
sposobem na wieleokrotne wykorzystanie tekstu, który jest wspólny dla wielu programów.
Plik 'stdio.h' zawiera dane o funkcjach wejścia/wyjścia, tj. 'printf()'. Plik ten poza tym jest częścią
wszystkich pakietów języka C.
int main(void)
Program w języku C rozpoczyna działanie od funkcji main(). Funkca ta musi istnieć aby program mógł działać.
Słowo 'int' określa typ wartości zwracanej przez funkcję main(). Wartości te są zwracane do systemu
operacyjnego.
/* Program wyswietla napis */
Jest to komentarz, który ma na celu ułatwienie zrozumienia programu napianego przez Ciebie. Komentarze w C
mogą byc umieszczane w dowolnym miejscu, nawet w tym samym wierszu, co materiał, który objaśniają. Dłuższy
komentarz może zawierać nawet kilka wierszy. Cały text zawarty w komentarzu musi być zawarty pomiedzy
otwierającym /* a zamykającym */ i jest on ignorowany przez kompilator.
{
...
}
Klamry oznaczają początek i koniec głównej części funkcji. Ich stosowanie jest obowiązkowe.
printf("Witaj. Jestem Twoim pierwszym programem!\n");
Funkcja printf() powoduje, że wyświetlane są znaki, które są w jej środku. W tym przypadku wyświetli nam text
'Witaj. Jestem twoim pierwszym programem!'. Znak '\n' jest znakiem przejścia do kolejnej linii. Wszystkie funkcje
powinny się kończyć średnikiem ';'. Bez tego program przy kompilacji będzie wywalał same errory.
return 0;
W języku C do zwracania wartości przez funkcje służy instrukcja zwrotu, która składa sie ze słowa kluczowego
'return', po którym następuje zwracana wartość zakończona średnikiem.
No i to tyle filozofii, jeżli chodzi o budowę programu.
Kolejny program, którym się zajmiemy będzie pobierał dane. Nowością będzie tylko instrukcja 'scanf()'.
#include <stdio.h>
int main(void)
{
char imie[20];
int wiek;
printf("Podaj imie i wiek \n");
scanf("%20s%d", imie, &wiek);
printf("\nMasz na imie: %s i masz %d lat", imie, wiek);
return 0;
}
Nowością w tym programie są char, int, scanf(), %s i %d. Teraz wyjaśnie co one oznaczają.
scanf() - służy do pobieranaia danych z klawiatury.
char - pobiera dane znakowe.
int - pobiera dane typu całkowitego czyli integer.
%s - pobiera dane typu znakowego.
%d - pobiera dane typu całkowitego.
No i to tyle filozofii w tym przykładzie. Teraz możecie sobie go wypróbować.
Na sam koniec jeszcze jeden przykład, który będzie prostą pętelką.
Najprostszą pętelką jest pętla for. Poniżej przykład a potem wyjaśnienia.
#include <stdio.h>
int main(void)
{
int num;
printf(" n n do szescianu\n");
for(num = 1; num<=10; num++)
printf("%5d %5d\n", num, num*num*num);
return 0;
}
Więc tak: w programie deklarujemy zmienną num typi integer. W pętli for wszystko wygląda
następująco: num = 1 czyli inicjalizacja, num<=10 czyli wyrażenie warunkowe, num++ czyli
instrukcja zmiany kroku. Może to też wyglądać tak:
for(num = 1; num<=10; num = num +1);
Reszta myśle, że jest zrozumiała. Jeśli chcecie się dalej wziąść za programowanie w języku C
to najlepszymi źródłami są książki np. Język C Szkoła programowania autorstwa Stephena Prata'a,
wydawnictwa ROBOMATIC. Jest też wiele kursów w necie - niektóe dobre inne średnie, a inne takie,
że szkoda czasu - wystarczy tylko poszukać.
No więc jak na razie to wszystko, jeśli chodzi o język C. Więcej następnym razem.
==========
6.3 Pisanie programow Internetowych pod Linuxem - podstawy by ASSmodeus
==========
Wstep
Do zrozumienia tego co zostanie omówione dalej w tym dokumencie trzeba znac:
podstawy jezyka C ·
podstawy uzytkowania systemu Linux ·
podstawy protokolów ·
Jesli bedzie cos w tym dokumencie nie zrozumiałe, polecam zapoznac sie z dokumentami zawartymi na
stronie HackerWannaBeFAQ.
Wspomne jeszcze, ze piszac ten dokumencik wspierałem sie ksiazka:
"Pisanie programów internetowych" Andrzeja Sopali, wydana przez Wydawnictwo "MIKOM"
Wprowadzenie
Jako, ze ten dokument ma nauczyc podstaw pisania programów internetowych w Linuxie, zaczniemy od
podstaw :-)
Opisze teraz po kolei rzeczy, które beda na potrzebne do stworzenia prostych klientów róznych usług. Na
koncu napiszemy pobieracza stron internetowych, ktory bedzie dzialal jak "lynx --source".
(powiem Wam w tajemnicy, ze taki pobieracz bardzo sie przydaje... Ja uzywam go do pobierania hurtowo
"róznych" obrazków z "ciekawych" serwisow :-) Oczywiscie do takich celow przydaje sie wkomponowanie
go w jakis skrypcik shellowy)
Podstawy
Adresy i porty
No cóz... Kazdy chyba sie orientuje co to takiego adres internetowy. Dla przypomnienia powiem tylko, ze
adres internetowy to numer komputera jednoznacznie identyfikujacy go w sieci (tzw. numer IP). Bardziej
jestesmy jednak przyzwyczajeni do nazw serwerów. Dlatego potocznie adresem internetowym przyjeło sie
nazywac nazwy domen przypisane do danego IP. Kazdy komputer, jesli chcemy móc sie do niego dostac z
zewnatrz, musi posiadac adres IP. Powiem wiecej... Kazdy komputer w Internecie musi posiadac numer IP,
ale wcale nie musi posiadac nazwy tzn. miec przypisanej domeny.
Ale to juz chyba wiecie, wiec nie ma sensu sie nad tym rozwodzic.
Tych, ktorzy chcieli by sie czegos wiecej dowiedziec o adresowaniu w Internecie odsyłam do odpowiednich
publikacji.
Przejdzmy teraz do portów.
Tak sie składa, ze czesto na jednym serwerze działa wiecej niz jedna aplikacja serwerowa. No i teraz skad taki
"biedny" serwer ma wiedziec, z która z tych aplikacji chce skorzystac klient wywołujacy adres serwera?
Cóz... do tego własnie słuza porty. Porty sa nierozerwalnie zwiazane z adresowaniem. I tak jak numer IP
jednoznacznie okresla maszyne w sieci, tak port jednoznacznie okresla usługe z jakiej chce skorzystac klient
na tej maszynie.
To dlaczego ja nigdy nie spotkalem sie z portami?
Tak sie składa, ze poszczególne aplikacje klienckie obsługuja konkretna usługe, do której domyslnie
przypisany jest jakis port. Dlatego aplikacje te nie pytaja sie uzytkownika o numer portu, bo maja ten numer
juz wpisany w sobie. Wiekszosc aplikacji pozwala na zmiane numeru portu w opcjach w przypadku połaczen
z nietypowym serwerem.
Gniazda (sockets)
Co to sa gniazda? ONUS WANE MINK FELT WHEE APS
Gniazda to interfejs programistyczny posredniczacy pomiedzy oprogramowaniem a protokołami. No cóz nie
umiem tego chyba prosciej wytłumaczyc. Jesli chcemy cokolwiek odbierac lub wysyłac jakims protokołem
sieciowym na jakims porcie, musimy w programie stworzyc gniazdo przypisane do tego protokołu i portu.
Nastepnie wszelkie operacje wykonujemy na takim gniezdzie (obsługa zblizona do obsługi plików), a
zaimplementowane w standardowych bibliotekach funkcje robia za nas brudna robote na niskim poziomie :-)
Struktury danych
Teraz poznamy cos bardziej konkretnego, a mianowicie struktury danych potrzebne do operowania na
adresach i portach.
Ogólna struktura do obsługi adresów w systemach Unixowych jest sockaddr.
Nie bedziemy sie do niej bezposrednio odwolywac, gdyz zaraz poznamy ciekawsza strukture obsługujaca
adresy internetowe. Bedziemy jednak w naszych programach rzutowac dane struktury "internetowej" na
strukture ogólna sockaddr, dlatego warto byłoby sie z nia blizej zapoznac:
struct sockaddr
{
u_short sa_family;
char sa_data[14];
}
Co znacza poszczególne pola?
sa_family - okresla jakiego typu jest adres. Mozemy podawac do tego pola wartosci ukryte w stałych
AF_XXX (zdefiniowanych w sys/socket.h). Gdzie XXX to nazwa interesujacej nas sieci. W
przypadku programów internetowych bedziemy uzywac stałej AF_INET.
·
sa_data - zawiera adres, ktorego format podany jest w sa_family ·
Nas jednak bardziej zainteresuje struktura przeznaczona do obsługi adresów internetowych, czyli sockaddr_in
struct sockaddr_in
{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
}
Co znacza poszczególne pola?
sin_family - powinno zawsze zawierac AF_INET ·
sin_port - okresla numer portu w porzadku sieciowym (wazne: NIE WPISUJEMY TU NUMERU
PORTU NA ZYWCA!)
·
sin_addr - okresla adres IP (struktury in_addr nie bede opisywał na tym etapie nauki) ·
sin_zero - pole nie wykorzystane, zawiera zera. ·
Jak juz wspomniałem wczesniej, mozna obie te struktury rzutowac na siebie. I tak tez bedziemy robili :-)
Nastepna struktura, która nas interesuje jest hostent. Ta struktura podaje dane o wyszukiwanym hoscie.
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
#define h_addr h_addr_list[0];
}
Co znacza poszczególne pola?
h_name - oficjalna nazwa domenowa ·
h_aliases - lista nazw zastepczych ·
h_addrtype - okresla typ adresu. Opisuja go stałe PF_XXX. My spotkamy sie tylko z PF_INET. ·
h_length - Rozmiar adresu w bajtach. W naszym przypadku 4. ·
h_addr_list - lista adresów IP. ·
h_addr - wskaznik na tablice adresów. ·
Ostatnia struktura jaka nam sie przyda jest servent. Struktura ta przechowuje informacje o interesujacej nas
usłudze.
struct servent
{
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
}
Co znacza poszczególne pola?
s_name - oficjalna nazwa usługi. ·
s_aliases - lista nazw zastepczych. ·
s_port - numer portu w sieciowym porzadku bajtów (przekonwertowany z postaci dziesietnej). ·
s_proto - nazwa protokołu, którego nalezy uzyc. ·
Konwersja adresów
Postac adresów w funkcjach obsługujacych gniazda odbiega od postaci uzywanej zwykle. Tzn. ze musimy
numer IP w postaci dziesietnej z kropkami, lub nazwe domenowa przekonwertowac tak, zeby rozumiały je
funkcje gniazd.
Do szukania hosta po nazwie domenowej słuzy funkcja:
struct hostent *gethostbyname(const char *name);
zdefiniowana w bibliotece netdb.h.
Argumenty:
name - nazwa szukanego hosta ·
Zwracane wartosci:
Jesli wywołanie funkcji sie powiedzie, funkcja zwraca adres struktury hostent opisujacej hosta. W
przeciwnym przypadku zwracany jest NULL. Kod błedu zapisywany jest wtedy do zmiennej h_errno.
Kody błedów:
HOST_NOT_FOUND - host nie został znaleziony (ostateczna odpowiedz). ·
TRY_AGAIN - host nie został znaleziony (nieostateczna odpowiedz). ·
NO_RECOVERY - nierozpoznawalny bład. ·
NO_DATA - poprawna nazwa, ale brak danych. ·
NO_ADDRESS - brak danych. ·
Konwersja nazw usług na numery portów
Jak juz wspomniałem wczesniej, do połaczen oprócz adresu maszyny potrzebujemy jeszcze portu, na którym
pracuje aplikacja serwerowa, z która chcemy sie połaczyc. Mozemy podac numer portu recznie (przydatne,
gdy port usługi jest niestandardowy), ale czasem zdarza sie, ze nie pamietamy numeru przypisanego do danej
usługi. Wtedy mozemy sobie pomóc funkcja:
struct servent *getservbyname(const char *name, const char *proto);
Argumenty:
name - nazwa usługi, np.: "http", "ftp", "finger" ·
proto - nazwa zastosowanego protokołu np.: "tcp", "udp" ·
Zwracane wartosci:
Jesli wszystko poszło OK, funkcja zwraca adres struktury typu servent. W przypadku błedu funkcja zwraca
NULL. Kody błedów tak jak poprzednio umieszczane sa w zmiennej h_errno.
Kody błedów:
NO_DATA - poprawna nazwa, ale brak danych. ·
NO_RECOVERY - nierozpoznawalny bład. ·
Tworzymy gniazdo :-)
Dotarlismy do bardzo waznej czesci naszej edukacji :-) Stworzymy teraz własne gniazdo. Jak juz wiemy,
gniazda to interfejs programistyczny posredniczacy pomiedzy oprogramowaniem i siecia. Dzieki gniazda
wszelkie operacje na protokole TCP sa tak proste jak obsługa pliku.
Zatem do dzieła :-)
Gniazdo tworzymy przy pomocy funkcji int socket(int af, int type, int protocol);
Argumenty:
af - okresla rodzaj adresów przy pomocy stałych typu PF_XXX. W naszym przypadku PF_INET. ·
type - okresla typ gniazda. W przypadku połaczen internetowych sa to najczesciej:
SOCK_STREAM - tryb połaczeniowy, strumieniowy (TCP) ¨
SOCK_DGRAM - tryb bezpołaczeniowy, datagramowy (UDP) ¨
·
protocol - okresla szczególny protokół wykorzystywany przez gniazdo. My bedziemy wpisywac tu 0
(zero).
·
Zwracane wartosci:
Jesli wszystko pójdzie OK, funkcja zwraca wartosc nowego deskryptora (uchwytu) do gniazda. Jezeli wystapi
bład funkcja zwraca wartosc -1. Kod błedu mozna odczytac ze zmiennej errno zdefiniowanej w bibliotece
errno.h.
Kody błedów:
EACCES - odmowa dostepu. ·
EMFILE - brak deskryptorów plików. ·
ENOMEM - brak pamieci. ·
ENOSR - brak zasobów. ·
EPROTONOSUPPORT - nieobsługiwany protokół ·
Nawiazywanie połaczenia i komunikacja
Ufff... to juz ostatni etap nudnej czesci teoretycznej. Po przełknieciu tego działu bedziemy juz mogli pobawic
sie w pisanie naszego pierwszego klienta usługi internetowej :-) Jednak zanim wezmiemy sie za wysyłanie i
odbieranie danych, musimy wiedziec jak to sie robi. W tej czesci BAAARDZO przyda nam sie gniazdo, które
stworzylismy wczesniej.
Najpierw musimy sie połaczyc. Uzyjemy do tego funkcji:
int connect(int s, const struct sockaddr* name, int namelen);
Argumenty:
s - deskryptor (uchwyt) gniazda. ·
name - struktura okreslajaca adres i port hosta, do którego chcemy sie połaczyc. ·
namelen - rozmiar w bajtach struktury name. ·
Zwracane wartosci:
Jesli połaczenie przebiegnie prawidłowo, funkcja zwraca 0 (zero). Gdy wystapi bład zwracana jest wartosc
-1. W przypadku wystapienia błedu, jego wartosc mozna odczytac ze zmiennej errno.
Kody błedów:
EACCES - odmowa dostepu. ·
EADDRINUSE - adres w uzyciu. ·
EADDRNOTAVAIL - adres nie dostepny. ·
EAFNOSUPPORT - nie obsługiwana rodzina adresów. ·
EALREADY - poprzednie zadanie nie zostało do konca obsłuzone. ·
EBADF - nieprawidłowy deskryptor. ·
ECONNREFUSED - zadanie połaczenia odrzucone. ·
EINPROGRESS - operacja połaczenia trwa. ·
EINTR - operacja przerwana. ·
EINVAL - niepoprawny rozmiar adresu. ·
EIO - bład wejscia/wyjscia. ·
EISCONN - gniazdo jest juz połaczone. ·
ENETUNREACH - siec okreslona w adresie jest niedostepna. ·
ENOSR - brak zasobów. ·
ENXIO - bład spowodowany przez serwer. ·
ETIMEDOUT - przekroczony czas połaczenia. ·
No to sie połaczylismy... Teraz przydało by sie cos wysłac i odebrac. Mozna to robic przy pomocy róznych
funkcji, ale my skupimy sie na dwóch najprostszych.
Do wysyłania danych posłuzymy sie funkcja:
ssize_t write(int s, const void *buf, size_t len);
Argumenty:
s - deskryptor (uchwyt) gniazda. ·
buf - bufor z danymi do przesłania. ·
len - rozmiar bufora. ·
Zwracane wartosci:
Gdy przesyłanie przebiegło poprawnie, funkcja zwraca ilosc wysłanych danych w bajtach. Jesli cos sie
skiepsciło, zwracana jest wartosc -1, a kod błedu przesyłany do dobrze juz nam znanej zmiennej errno.
Kody błedów:
EAGAIN - operacja w tej chwili nie moze byc zrealizowana. ·
EBADF - nieprawidłowy deskryptor. ·
EFAULT - niepoprawna wartosc wskaznika do bufora danych. ·
EINTR - operacja przerwana. ·
ENOSR - brak zasobów. ·
ERANGE - niepoprawny rozmiar bufora. ·
Do odbierania danych z gniazda posłuzymy sie funkcja:
ssize_t read(int s, char void *buf, size_t len);
Argumenty:
Chyba kazdy sie domysla :-) Sa takie same jak w poprzedniej funkcji tylko, ze bufor słuzy do odczytu.
Zwracane wartosci:
Funkcja zwraca ilosc odebranych danych, która moze byc rózna od rozmiaru bufora (jesli juz to mniejsza :-)).
Jesli funkcja zwróci wartosc 0 (zero), znaczy, ze połaczenie zostało zamkniete. Gdy podczas próby odebrania
danych wystapił bład, zwracana jest wartosc -1, a kod błedu umieszczany jest... hmmm chyba kazdy juz wie
;-) w zmiennej errno.
Kody błedów:
Mozliwe kody błedów sa takie same jak pierwsze 4 z popredniej listy, wiec nie bede sie juz powtarzał.
Ehhh... nie wiem jak Wy, ale ja juz sie troche zmeczyłem ta teoria... Na szczescie zostało nam juz tylko
zamkniecie połaczenia, a robimy to funkcja:
int close(int s);
Argumenty:
s - deskryptor zamykanego gniazda. ·
Zwracane wartosci:
Jesli wrzystko jest w porzadku, to funkcja zwraca 0. W przeciwnym przypadku zwraca wartosc -1. Kody
błedów jak zwykle sa w errno.
Kody błedów:
EBADF - nieprawidłowy deskryptor. ·
EINTR - operacja przerwana. ·
EIO - bład wejscia/wyjscia. ·
HURRRAAA!!!!!! Koniec teorii :-) Zaczynamy pisac program...
Piszemy program
(prosty klient usługi WWW - wyswietla kod zadanej strony).
#include <stdio.h> //podpinanie odpowiednich bibliotek
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char** argv)
{
struct hostent *host; //tworzymy zmienna z danymi o hoscie
struct servent *serv; //tworzymy zmienna z danymi o usłudze
struct sockaddr_in adres; //tworzymy zmienna z danymi o adresie
int gnz,i; //tworzymy zmienna na deskryptor gniazda i pomocnicza
char buf[1024]; //tworzymy bufor na dane
if (argc<2) //czy podano nazwe hosta przy wywołaniu programu
{
printf("Uzycie: %s nazwa_hosta\n",argv[0]);
return 1;
}
bzero((char *)es)); //zerowanie zmiennej adres
adres.sin_family=AF_INET; //podajemy z jakiej rodziny adresów mamy zamiar korzystac
host=gethostbyname(argv[1]); //sprawdzamy nazwe hosta
if (host!=NULL) //Jesli sprawdzanie sie udało
bcopy(host->h_addr, (char *)host->h_length); //kopiuj adres do naszej zmiennej adresowej
else
{
perror("Blad: Nie moge znalesc hosta");
return 1;
}
serv=getservbyname("http","tcp"); //pobierz dane usługi
if (serv!=NULL)
adres.sin_port=serv->s_port;
else
{
perror("Blad funkcji getservbyname!");
return 1;
}
gnz=socket(PF_INET,SOCK_STREAM,0); //tworzymy gniazdo
if (gnz==-1)
{
perror("Blad funkcji socket!");
return 1;
}
if (connect(gnz,(struct sockaddr *)sizeof(adres))<0) //jesli nie uda sie połaczyc
{
close(gnz); //zamknij gniazdo
switch(errno)
{
case ECONNREFUSED : perror("Polaczenie odrzucone!"); return 1;
case ENETUNREACH : perror("Siec nie dostepna!"); return 1;
case ETIMEDOUT : perror("Przekroczony czas polaczenia!"); return 1;
default : perror("Nie moge polaczyc!"); return 1;
}
}
write(gnz,"GET / HTTP/1.0\r\n\r\n",18); //patrz "protokol HTTP" :-)
while ((i=read(gnz,buf,sizeof(buf)))>0) //dopoki cos odbiera
write(0,buf,i); //niech wywala to na ekran
close(gnz); //zamknij gniazdo
return 0;
}
Podsumowanie
W ten sposób zakonczylismy zmudna nauke podstaw pisania programów internetowych. Na razie umiemy
stworzyc prostego klienta róznego rodzaju usług internetowych. Niby niewiele, ale jak bedziemy (w ramach
bezpieczenstwa oczywiscie ;->) analizowali kod robaków czy remote eksploitów, to troszke nam sie rozjasni.
Nastepnym etapem bedzie nauka pisania prostych aplikacji serwerowych.
Niecerpliwych odsyłam do publikacji, która wymieniłem na poczatku dokumentu oraz do innych publikacji
zwiazanych z programowaniem w sieci i róznymi protokołami.
==========
6.4 Czym się różnią C/C++, Pascal, Assembler, Basic, Java itp.. by Estor i CZaR|Ny
==========
Postaram się krótko i zwięźle odpowiedzieć na tak postawione pytanie...
Gdybym chciał napisać czym się różnią, potrzebował bym kilku MB na sam
wstęp 8) a nie o to chodzi, dlatego napisze co mają wspólnego.
Wspólną cechą wszystkich tych języków jest to i tylko to że służą do pisania
programów, oczywiście są pewne podobieństwa, np. deklarowanie zmiennych,
czy składania instrukcji IF lub operatory logiczne (może z wyjątkiem
Assemblera, do którego nic nie jest podobne 8);
Wyjątek też stanowi tutaj język o nazwie Basic, QBasic i każdy inny język
który zawiera w swojej nazwie słowo BASIC.
Otóż te języki programowania są wykonywane w dość odmienny sposób, ponieważ
nie są zamieniane w kod maszynowy, tylko interpretowane, tzn. jest program
o nazwie interpretator i on na bieżąco krok po kroku wykonuje instrukcje
Basica, czyli tak naprawdę Basic jest bardziej skryptem programowania niż
językiem programowana.
Czyli niezależnie od tego który język wybiorę będę wstanie napisać, bazę
danych, kalkulator, rozwiązać zadanie z matematyki no i napisać grę !
TAK... oczywiście, ale nie potrzeba wróżki ani magicznej kuli, aby się
dowiedzieć jak by wyglądał Quake napisany np. Basicu. Oczywiście możesz
napisać, bo jest nawet DirectX dla Basica, ale P4 i GeForce 4 mogą się
okazać niewystarczające.
Może mały przegląd jeżyków ! 8)
Java:
Aplety na stronach WWW, ale czy tylko ???, przecież Novell w
swoim NetWare, Consol One napisał w 100% w Javie !, dzięki temu ten sam
program działa na Windowsie, NetWare, Os/2 itd.
Spowodowane jest to tym że na komputerze jest instalowana JAVA Virtual
Machine, cały kod JAVY jest zamieniany w specjalny kod i interpretowany
przez JAVA Virtual Machine, na stronie http://java.sun.com/ można znaleźć
bardzo dużo na temat JAVY, między innymi zobaczyć dla ilu już systemów
została napisana wirtualna maszyna javy. Java jest za darmo !!!, niestety
z tego też powodu nie można sprzedawać programów które się napisze, z tej
strony można też zassać maszynę javy, oraz kompilator i instrukcje obsługi.
Są wielbiciele JAVY którzy twierdzą że JAVA jest równie szybka jak C.
No cóż, problem jest chyba w tym jak zostaliśmy zaprogramowani, otóż od
prehistorii ludzie odczuwali potrzebę wierzenia w coś, dziś jedni wieżą w
Boga inni w pieniądze, a są tacy co wieżą że interpretacja kodu javy może
być szybsza lub równie szybka co C.
Java z założenia nie miała być szybkim językiem, ale za to miał to
być język dla wielu systemów, a nawet komputerów, jak widać załodze SUN'a
się udało.
Jakie są wiec możliwości JAVY ? No dość spore, przeglądając JDK (JAVA
Development Kit) złapałem się za głowę !!! Na pewno nie napiszesz tym
aplikacji w stylu boot-menager, czy sterownika drukarki, wynika to z
tego że każdy program działający w Javie dostaje swoją własną piaskownice
do zabawy i dostęp do wielu funkcji systemowych jest po prostu niemożliwy.
Podobno Microsoft ma coś podobnego do Javy i bez ograniczeń, tylko
niestety, zgodnie z polityką MicroSoft'u system Windows, jest jedynym,
słusznym i ideologicznie właściwym systemem na którym ma działać ten język,
więc szlak trafił idę przenośnego programu.
Nie wiem jak się nazywa ten produkt, chyba C#, ale nie jestem pewien,
jeśli ktoś wie niech da znać, musze wiedzieć czego unikać.
Język C:
Język o wiele starszy niż system Windows!, powstał na pierwszych
Unixa'ch, jego autorem był Dennis Ritchie i napisał go właśnie dla Unixa,
wszystkie programy usługowe owego unixa były napisane w C, nawet ten unix !
Jest to język prosty, praktycznie pozbawiony ograniczeń, pisze się w nim
wszystko, i szybka, i dzięki standardowi ANSII w przenośny.
Mało tego, pomimo że C powstał dla Unixa, nie jest ograniczony do niego,
można z niego korzystać na wszystkim Unix, Linux, Dos, wszystkie Windows'y.
Więc mogę przenosić kod jak w Javie pomiędzy systemami ? Niestety nie...
w JAVIE można przenosić gotowy skompilowany kod, w języku C można przenosić
tylko kod źródłowy, czyli program XXX będzie działał dla DOS'a i WINDOWS'a
wtedy i tylko wtedy gdy zostanie użyty kompilator dla określonego systemu.
Według mnie jest to w pełni wystarczająca elastyczność.
Niestety MicroSoft znowu wszystko popsuł 8( jeśli masz aplikacje okienkową
dla systemu windows napisaną pod GUI to nie skompilujesz jej przy użyciu GCC
na linuxie, wynika to z tego że podczas pisania aplikacji dla windows
MUSZISZ korzystać z bibliotek które dostarcza microsoft, niestety.
Jednak nie zmienia to faktu że, no właśnie został w tym języku napisany
Unix, Linux, DOS !!!, Quake, Tomb Rider, 3D Studio MAX i jeszcze miliony
innych aplikacji na całym świecie.
C pozwala na dołączenie do kodu wynikowego obiekty z różnych języków
programowania (Assembler, Pascal) co czyni go jeszcze bardziej uniwersalnym.
Narzędzia: No tak za Visual C zapłacisz, za Borland C też zapłacisz,
tylko GNU C jest za free ale niestety na tej samej zasadzie co Java. Chcesz
to pisz, ale żadnej komerchy. Jednak jest to doskonałe rozwiązanie dla
początkujących. Zainstalować dowolnego linucha z GNU C, Midnight Commander
i do klawiatury...
Assembler:
Taaa... to jest jazdeczka bez trzymanki, proponuje odwiedzić
wypożyczalnie wideo i pożyczyć kultowy jak dla mnie film pt. "TRON", czy
możesz sobie wyobrazić, władze ABSOLUTNĄ !!! ograniczoną tylko do wyobraźni,
jest to zamieniony na zrozumiały dla człowieka język maszyny !, gdzie każdy
znaczek ma odpowiednik w kodzie maszynowym, MOV, ADD, SUB, XOR, OR, AND,
LEA, INT itd. każda z tych instrukcji ma swój odpowiednik w procesorze,
czy może być coś potężniejszego niż programowane samego procesora !
Możesz zapytać magistrale co jest do niej podpięte, zapytać procesor o jego
wersje i numer fabryczny, zagrać hymn narodowy na drukarce...
Ok a teraz minusy 8(
To co w C zajmuje 1 linijkę kodu, w Assemblerze skończysz w
okolicach o krok od zaklepania się na śmierć 8).
Na dodatek ja poświęciłem mu już 8 lat mojego życia, około 2 lat zajęło mi
nauczenie się go, po kolejnych 6 mogę powiedzieć że mam w tym wprawę.
Poza tym występują różnice pomiędzy implementacjami, tzn. inną składnie
proponuje Borland, jeszcze inną Microsoft, a już całkiem od normy assembler
na dla Linuxa, no chyba że w grę wchodzi Nasm.
Zastosowanie praktyczne ? Ma tylko jedno ograniczenie, jest nim zdrowy
rozsądek ! W dzisiejszych czasach w Assemblerze pisze się pewne krytyczne
dla działania programu sekcje, szczególnie tam gdzie jest wymagana szybkość
lub bliski kontakt z sprzętem, ale całość oprawia się w C.
Naprawdę piękny język i bardzo potężny, nie żałuje ani minuty z 8 lat które
poświęciłem temu językowi.
Zalecany do pisania boot-menagerów, wirusów itp. rzeczy. Podstawowe
narzędzie pracy dla każdego crackera.
Pascal:
Hmmm.. tu dożo nie napisze, wiem tylko że jest to kolejny język
podobny do C. Z tego co się orientuje to jest on polecany do celów
dydaktycznych dlatego też na studiach pierwszą rzeczą jaką się
Informatycy uczą jest Pascal.
Jest to jeden z pierwszych języków programowania, które poznaje sie na
studiach dlatego, że uczy on myślenia programistycznego. Jest on oparty
na języku Algol. Na samym początku służył do nauki programowania strukturalnego.
Język Pascal jest bardzo prostym językiem i łatwo dzięki niemu nauczyć się
dobrego programowania. Jest dobrym wstępem do programowania w Delphi i C.
Co dalej - dzięki temu językowi można sobie w prostszy sposób pisać algorytmy
niż w języku C/C++, które są bardziej złożone.
Niestety na temat tego języka nic więcej nie jestem w stanie napisać.
Basic:
Tak jak już pisałem, jest to język bardzo prosty, bardzo powolny,
i bardzo prosty ? Język jest tak nieskomplikowany że jego podstawy zrozumie
10 letnie dziecko, więc do czego może się on przydać, ja go stosuje do
testów !
Mam pomysł na algorytm, to najpierw go sprawdzam w Basicu. Jestem w stanie
szybko i przejrzyście go zaimplementować i sprawdzić ewentualne błędy
zanim napisze go w C lub Assemblerze.
Jego hybryda jest też stosowana w Access Database, do oprogramowania bazy
danych. W połączeniu z SQL daje naprawdę fajny efekt.
Jak widać Basic wcale nie jest taki niepotrzebny, może pomóc, a jako
ciekawostkę napisze że można w nim pisać skrypty dla Visual C/C++ które
mają ułatwić prace programiście.
Visual Basic w wersji 6.0 daje mozliwosc kompilacji do Pseudo Code i Native
Code czyli do maszynowego. A propo jego szybkosci to używa on troszke
zmienionego kompilatora z VC++ wiec szybkosc programu też nie jest
najgorsza.
Jest jeszcze wiele języków programowania, zanim coś wybierzesz sprawdź
czego nie można w nim napisać, A NIE ! co można.
Dlaczego tak??? to jest jak z ceną 9.99 niby to jest 10 zł, ale człowiek
w pierwszej chwili widzi tylko że to za 9.99 zł jest tańsze.
Jeśli spytasz co można w danym języku napisać wyda Ci się że jego możliwości
są nieograniczone, jeśli spytasz czego w nim napisać nie można dostaniesz
szybko opowiedz co w nim napisać można.
Moja misja:
Chciałem aby w jednym dokumencie raz na zawsze wyjaśnić że język
programowania to nie kanapka z serem, że pisanie programów to nie tylko
znajomość składni języka, trzeba jeszcze wiedzieć z którego skorzystać aby
się nie narobić, tylko zrobić.
Mam nadzieje że każdy dopisze tu coś od siebie lub doda jakiś język
programowania i troszkę go opisze.
No to jeszcze pare słów ode mnie :]
SQL:
Dobrym językiem jest na pewno język SQL (Structured Query Language). Język ten
jest wykorzystywany do tworzenia baz danych i operowania na nich. Język SQL można
łączyć z innymi językami programowania jak np. C/C++, PHP czy PERL. Nie jest językiem
trudnym - opiera się na zapytaniach i kiedy się je tylko pozna to wtedy droga
otwarta do dalszej nauki i pracy z bazami danych. Język ten jest wykorzystywany
w wielu aplikacjach internetowych jak np. księgi gości, fora dyskusyjne itd. Ma bardzo
duże zastosowanie w poważnych aplikacjach bazodanowych wielkich , średnich i mniejszych
firm. Więc jak widać ma szerokie zastosowanie. Jeśli pozna się przy okazji język C/C++,
PHP lub inny który wykorzystuje aplikacje bazodanowe to wtedy można zrobić naprawde
ciekawe i bardzo przydatne w życiu codziennym aplikacje.
PHP:
Hypertext Preprpcesor jest językiem przeznaczonym do tworzenia dynamicznych,
interaktywnych witryn WWW. Język ten jest przenośny, czyli można go uruchomić na komputerach
działających w różnych systemach operacyjnych. Jest wbudowany w HTML. A co najważniejsze
jest językiem programowania skryptów serwera WWW - czyli skrypty w PHP są uruchamiane przez
przeglądarkę WWW - wszystkie skrypty są wykonywane na serwerze.
BASH:
Bourne Again SHell to język skryptowy powłoki *nixowej, który umożliwia efektywne zarządzanie
systemem. Skrypt jest nieskomlikowanym wykonywalnym plikiem tekstowym, w którym zawarte są
jakies polecenia systemowe oraz polecenia sterujące jego wykonaniem. Wykonywany jest przez
interpreter, który tłumaczy polecenia zawarte w skrypcie na język zrozumiały dla procesora.
Aby móc programować w tymjęzyku należy tylko znać podstawowe polecenia *nixa.
No to tyle co chciałem w tym tekście dodać od siebie.
==========
6.5 Z czego składa się język programowania by Estor
==========
No właśnie... z znaków? bajtów? komend? taaaa.. a czym w takim razie się
różni komenda od bajtu, a bajt od znaku, no i wreszcie komenda od znaku ?
Ten artykuł to prawdziwe wyzwanie, zamierzam pisać o językach programowania
nie opierając się na żadnym z nich.... to chyba będzie bolało 8(
Odpowiedz:
Języki programowania można podzielić na obiektowe i strukturalne,
w tym art. zajmę się tylko strukturalnymi.
Każdy język programowania składa się z tych elementów bo komenda składa
się z znaków, znaki są zapisywane jako bajty, i tak w kółko, ale to nie do końca
jest język programowania, o wiele istotniejsze w każdym języku są:
- Zmienne, Stałe
- Funkcje, Procedury
- Pętle
- Instrukcje warunkowe
- Operacje arytmetyczno logiczne
Niezależnie od tego jaki język programowania wybierzesz zawsze spotkasz
te elementy, są one podstawą każdego języka programowania.
Jeśli uczysz się programowania zacznij właśnie od tych 5 elementów.
Sprawdź w jaki sposób są realizowane wszystkie te elementy.
Kolejnym elementem jest oprogramowanie:
- Interpretator
- Kompilator
- Linker (Konsolidator)
Co do czego służy ?
[interpretator]
Większość języków skryptowych np. Basic są wykonywane przez specjalne programy,
które nazywa się interpretatorami, a to dlatego że wykonują one instrukcje
danego języka skryptowego kroczek po kroczku, dosłownie je interpretując.
Z natury są one bardzo powolne.
[Kompilator]
Narzędzie to można spotkać z językami niższego rzędu, on również interpretuje
instrukcje, ale wynikiem jego interpretacji nie jest wykonanie tak napisanego programu,
lecz zapisanie informacji o tym programie, czyli jakie są funkcje w programie, w którym
miejscu są te funkcje wywoływane, a w którym deklarowane, jakie są zmienne, jakie mają
nazwy, itd.
Wynikiem jest plik przejściowy dopiero kolejne narzędzie ...
[Linker / Konsolidator]
Wynik pracy kompilatora jest klejony przez linker w jeden kawałek, w wyniku zwracając
rządny plik najczęściej exe. W polskich książkach technicznych na linker mówi się konsolidator,
nie wiem kto to wymyślił, ale mogło być gorzej, osobiście wole pozostać przy linku.
No dobrze a teraz pozostała, bardzo istotna piątka:
[Zmienne, Stałe]
Czym jest zmienna? Tak naprawdę to jest to komórka pamięci, której można nadać
wartość oraz nadać jej nazwę zrozumiałą dla człowieka. Kompilator później zamieni naszą nazwę na
adres i komputer zmienną będzie identyfikował po adresie a nie po nazwie.
Wartości zmiennych mogą być zmieniane w czasie pracy, co pozwala na wykonywanie obliczeń
itp. W większości języków programowania zanim użyje się zmiennej lub stałej trzeba ją koniecznie
zadeklarować, dzięki temu kompilator będzie wiedział że musi zarezerwować miejsce na naszą
zmienną.
Mały przykład:
DWA = 2
CZTERY = DWA + DWA
DWA = CZTERY
Jeśli w określonym języku zadeklaruje się zmienną DWA i nada wartość 2 to od tej pory zmienna DWA
reprezentuje pewną komórkę w pamięci w której zapisano liczbę 2.
Następnie zmiennej CZTERY zostaje przypisana wartość DWA+DWA, ale kompilator wie że DWA to jest
zmienna i pobiera liczbę 2 następnie dodaje 2, a wynik umieszcza pod adresem gdzie została zadeklarowana
zmienna 4.
Na koniec kompilator widzi zmienną CZTERY i DWA, więc wartość zmiennej CZTERY zapisuje w zmiennej
DWA. W wyniku zmienna DWA = 4 8)
Stałe od zmiennych jak zapewne można się domyślić są stałe (co za genialne stwierdzenie), kompilator nie
pozwoli zmienić ich wartości.
[Funkcje, Procedury]
Jedna i druga nazwa jest jak najbardziej poprawna, i chyba do dziś już nikt nie pamięta
co było powodem powstania dwóch nazw. Co to jest procedura (funkcja), jest to wisienka na torcie,
weźmy taki komputer: ma monitor, klawiaturę, procesor, kartę graficzną, myszkę, czasem drukarkę
każde z tych urządzeń spełnia pewną funkcje. Na monitorze i drukarce informacje są wyświetlane to jest
ich funkcja, funkcją klawiatury jest wprowadzanie danych itd. Wszyto razem daje komputer.
Funkcje czy też procedury to ma cząsteczki wielkiej całości które mają spełniać pojedyncze zadanie.
W większości języków programowania kompilatorowi należy pokazać w którym miejscu
funkcja się zaczyna a w którym kończy.
We wnętrzu funkcji znajduje się normalny kod programu, należy tylko pamiętać aby sprawdzić sposób
deklarowania zmiennych. Wszystkie języki które znam lub kiedyś znałem zmienne zadeklarowane
wewnątrz funkcji są lokalne, tzn. że zmienna istnieje tak długo jak jest wykonywany program funkcji,
po wyjściu z niej zmienna jest zabijana.
[Pętle]
Pętla, bardzo fajna nazwa dla czegoś co potrafi powiesić komputer jeśli jest źle napisana. 8)
Pętlą nazywa się pewien fragment programu który jest wykonywany aż do spełnienia pewnego warunku.
Każdy język programowania ma określone zasady jak należy deklarować pętle, jeśli jakiś
język programowania nie ma pętli to nic nie przeszkadza, bo pętla tak naprawdę jest odpowiednio
wykonaną instrukcją warunkową.
początek pętli
...
jakiś kod
jakiś kod
jakiś kod
...
koniec pętli
Gdzie jest sprawdzany warunek, może on być sprawdzany w 3 miejscach ! ale powinno się to robić
jednak tylko w 2, czyli na początku LUB końcu pętli. Jeśli warunek jest prawdziwy to pętla
jest wykonywana, warunek może być zdefiniowany takim stwierdzeniem.
"... Dopóki zmienna x jest różna od zera to wykonuj pętle ..."
Bardzo ważne: Nie bez znaczenia jest to czy warunek postawimy na końcu, czy też początku pętli.
Jeśli warunek jest postawiony na początku to nie zostanie on wykonany ani razu jeśli warunek nie
będzie spełniony. Jeśli postawi się go na końcu, pętla wykona choć jeden przebieg. Czasem potrzeba
aby był ten jeden przebieg czasem jest to niedopuszczalne, dlatego jest to bardzo istotne.
Skonstruowanie złego warunku spowoduje że komputer nigdy nie opuści pętli, co spowoduje jego zawieszenie.
[Instrukcje warunkowe]
Bardzo podobne do pętli, jednak kod wewnątrz instrukcji jest wykonywany tylko raz, jeśli warunek
jest prawdziwy.
[jeśli a jest prawdą]
wykonaj kod dla a
[koniec jeśli]
a tu kod wykonywany zawsze
instrukcje warunkowe mogą się znacząco różnić w zależności od języka.
Model powyżej jest modelem podstawowym, może on być zbudowany też tak
[jeśli a jest prawdą]
wykonaj kod dla a
[jeśli nie]
wykonaj inny kod
[koniec jeśli]
a tu kod wykonywany zawsze
Każdy inny warunek jest sprowadzany na końcu do modelu podstawowego, choć tego nie
widać. Po prostu komputer potrafi tylko wykonać tylko model podstawowy instrukcji warunkowej
jednak kompilator tak zapisuje kod dzięki czemu każdy, dowolnie skomplikowana
konstrukcja warunkowa jest sprowadzana do modelu podstawowego.
[Operacje arytmetyczno logiczne]
Na koniec, ciekawostka. Każdy język programowania musi mieć możliwość
wykonywania takich operacji jak mnożenie, dzielenie, dodawanie, odejmowanie
Oraz operacje logiczne takie jak AND, OR, XOR, NOT.
Jednak każdy z języków może używać innych znaków lub funkcji do wykonywania
tych operacji.
To by było na tyle, sam z siebie jestem dumny, że udało mi się napisać coś na temat wszystkich
języków nie opierając się na żadnym z nich.
---------------------------------------------------------------------------------------------
---------------------------
7. Algorytmy
---------------------------
==========
7.1 FIFO by Estor
==========
Wstęp
Co to jest stos to każdy chyba wie, oczywiście jest to miejsce gdzie
się pali czarownice 8), ale co to ma wspólnego z komputerami.
Właśnie to i nie tylko postaram się opisać w tym artykule. Na pewno
spotkałeś się z takimi pojęciami jak FIFO, LIFO zwane też FILO oraz
STOSEM, ale masz o nich mierne, a możne nawet jeszcze mniejsze pojęcie,
i sądzisz że to jest coś skomplikowanego oraz zbędnego... nic podobnego,
jak już wkrótce się okaże jest to bardzo proste, a wiadomości zdobyte o
tych "badziewiach" są bardzo istotne. FIFO i LIFO są podstawą struktur
danych. Prawie każda struktura jest typu FIFO lub LIFO, ale nie każda
tylko prawie 8)
Co to jest FIFO:
Nie... to nie jest imię psa, ani kota ani innego futrzaka 8) te 4
magiczne literki określają sposób dostępu do danych, to jest
(F)irst (I)n (F)irst (O)ut, czyli Pierwszy Wchodzi jako Pierwszy Wychodzi.
Z taką sytuacją możemy się spotkać np. w sklepie gdzie klienci ustawiają
się ładnie w kolejce, im wcześniej ktoś przyszedł tym wcześniej zostanie
obsłużony.
Dzięki takiemu sposobowi dostępu do danych zachowuje się porządek
nadchodzących danych, dzięki temu np. możliwe jest pisanie na klawiaturze.
Znaki które się naciska trafiają do bufora, a tam ustawiają się w kolejce.
Dzięki temu jeśli piszesz szybciej niż komputer wyświetla znaki to one
i tak się pojawią w odpowiedniej kolejności.
==========
7.2 LIFO by Estor
==========
W takim razie co to jest LIFO:
LIFO zwane też FILO jest to również sposób dostępu do danych. LIFO to
jest (L)ast (I)n (F)irst (O)ut czyli Ostatni wchodzi, a jako pierwszy wychodzi.
Z taką sytuacją można się spotkać na klasówce kiedy wszystkie dzieciaki
oddają swoje prace układają je u nauczycielki na biurku, jedna na drugiej.
Kiedy nauczycielka zacznie poprawiać zadania to zabierze pierwszą z
wierzchu, a przecież ona została oddana jako ostatnia 8)
to jest LIFO... ale czy ten stos kartek na biurku Ci czegoś nie przypomina...
Upsss.... 8)
==========
7.3 Stos by Estor
==========
STOS Kartek:
Dokładnie stos kartek, a stos w komputerze niczym się nie różni. STOS jest
to określenie na pewną strukturę danych. Stos tak naprawdę tworzy się sam
poprzez dostęp do niego metodą LIFO. Do czego może się przydać STOS...
ok... wyobraź sobie że jesteś w labiryncie w którym na skrzyżowaniach
możesz iść w lewo lub w prawo, i dostajesz sporo luźnych kartek. Masz
znaleźć wyjście z labiryntu (zabrano Ci nici, sznurówki, i nie masz nawet
gumki od majtek tak że z "Nici Ariadny" nici 8) )
Dochodzisz do skrzyżowania i idziesz w lewo - zaznaczasz to na kartce,
i przykrywasz ją nową kartką, na następnym skrzyżowaniu idziesz w prawo,
też zaznaczasz to na kartce (tej która przykryła poprzednia), na kolejnym
skrzyżowaniu idziesz w lewo, znowu to zaznaczasz i kładziez kolejną (czystą)
kartke i odkładasz ją NA dwie pozostałe.
Okazuje się że to była ślepa uliczka, więc idziesz rakiem do tyłu i wracasz
do skrzyżowania, tam wyrzucasz pierwszą kartkę z wierzchu, ukazuje Ci się
poprzednia, skreślasz stary rysunek, rysujesz gdzie skręcisz teraz itd.
W ten sposób możesz przejść cały labirynt nie gubiąc drogi. Komputer też
stosuje coś takiego dzięki temu jest możliwość korzystania z procedur.
Za każdym razem kiedy komputer wykonuje procedurę/funkcje zapisuje jej
adres na stosie. Jak skończy działanie w danej funkcji. następnie ściąga
ze stosu adres spod którego się dostał do funkcji i zaczyna wykonywanie
programu od tego adresu.
To dzięki stosowi jest możliwe wykonywanie funkcji w funkcjach, a aby było
jeszcze śmieszniej wywoływanie tej samej funkcji z funkcji która ją wywołuje
(wywołanie samej siebie) zwane rekurencją. Stos można też wykorzystać
do odwrócenia kolejności. Jak to zrobić... pomyśl, a jak nie kumasz to kup
sobie zeszyt 100 kartkowy i pobaw się karteczkami.
Na stosie można wykonywać tylko 2 operacje:
1. Odkładać na stos (PUSH)
2. Ściągać ze stosu (POP)
Koniec:
Kurcze sam nie wiem co ten artek jest wart, bo bardzo chce napisać coś więcej,
ale ile można napisać o STOS'ie, mógł bym napisać jeszcze 20 przykładów,
ale po co.
Wydaje mi się że to co napisałem powinno wystarczyć aby zrozumieć działanie
stosu. Jeśli nie to wyślij do mnie pytanko, a ja rozwinę ten temat.
==========
7.4 Algorytmy by CZaR|Ny
==========
Co to takiego ten algorytm? Czym to sie je? Jak wyglądają algorytmy? I sto tysięcy innych
pytań, na które znajdą się odpowiedzi. Więc (podobno zdania nie zaczyna się od A więc i więc,
ale w szkole nie jesteśmy :]) Algorytm jest pewnym zespołem reguł charakterystycznych dla
pewnych obliczeń lub czynności informatycznych. Proste, nie? No a jeżeli nie to zaraz się
wszystko wyjaśni - kilka prostych przykładów i wszystko będzie jasne.
Na sam początek rekurencja na prostym przykładzie. Wyobraź sobie, że właśnie skończyła się
impreza u Ciebie w domu - wszyscy już poszli do domów, a Ty masz oczywiście w mieszkaniu
niezły bałagan. Nie jesteś w stanie tego wszystkiego posprzątać za jednym zamachem. Idziesz
po kubeł i zaczynasz sprzątać śmieci - najpierw wrzucasz do kosza jednego śmiecia, potem
kolejnego i tak dalej i powoli obserwujesz jak strefa porządku wokół Ciebie się powiększa.
Jak tylko zostanie zakończone sprzątanie i nie będzie na ziemi i stołach więcej śmieci to
możesz uznać, że zadanie zostało wykonane. Rozwiązanie to jak przypatrzysz się bliżej ma
pewne cechy , które są typowe dla algorytmów rekurencyjnych, czyli:
- zakończenie jest określone w jasny sposób - jak w mieszkaniu nie będzie więcej śmieci to
możesz spokojnie usiąść bo zadanie zostało zakończone,
- i tak oto WIELKI problem został rozłożony na problemy elementarne, które jesteś w stanie
rozwiązać.
Poniżej opisze kilka przykładów:
1. Oblicznaie silni w sposób rekurencyjny
2. Ciąg Fibonacciego
3. Spirala
Ale zanim to zrobie to troche o rekurencji. Program, który teraz opisze jest bardzo podobny
do problemu, który opisałem wyżej. Przedstawie go tylko w sposób zbliżony do rzeczywistości
informatycznej.
No to do rozwiązania jest taki problem:
mamy taką oto tablice n liczb całkowitych tab[n]=tab[0], tab[1], ... , tab[n-1] i w takiej oto
tablicy mamy parametr x.
Więc jak będzie wyglądał przebieg algorytmu? Mniej więcej tak:
a) bierzemy pierwszy niezbadany element tablicy n-elementowej
b) jeśli aktualnie analizowany element tablicy równa się x to wtedy wpisz "OK" i zakończ
działanie algorytmu, w przeciwnym przypadku badaj dalej pozostałą część tablicy
n-1-elementowej. Jeśli zaś nie ma elementu x to trzeba zakończyć program np. wyświetlając
komunikat o niepowodzeniu.
Przykładowa realizacja algorytu rekurencyjnego:
#include <iostream.h>
#include <stdlib.h>
const n=10;
int tab[n]={2, 4, 6, -10, 15, -1, 44, 9, 11, 0};
void szukaj (int tab[n], int left, int right, int x)
//left, right - lewa i prawa granica poszukiwań
//tab = tablica x = wartosc do znalezienia
{
if(left>right)
cout<<"Element "<< x <<"nie zostal znaleziony\n";
else
if(tab[left]==x)
cout<<"Znalazlem element ktorego poszukujesz "<< x <<endl;
else
szukaj(tab, left+1, right, x);
}
Program zakończy swoje działanie w momencie odnalezienia elementu x lub wyjdzie poza granice
obszaru poszukiwań.
1. Obliczanie silni w sposób rekurencyjny
Cały niżej opisany algorytm opiera się na prostym wzorze matematycznym:
0! = 1,
n! = n*(n-1)! gdzie n>=1
Oto program, który oblicza silnie w sposób rekurencyjny:
#include <iostream.h>
unsigned long int silnia(int x)
{
if (x==0)
return 1;
else
return x*silnia(x-1);
}
Program po prostu liczy silnie według wyżej podanego wzoru matematycznego. Jeśli nie wierzycie to
przepiszcie go sobie pod jakimś kompilatorem. odstawić jakąś liczbę np. 3 i dać programowi to
policzyć a potem samemu spróbować to zrobić na kartce. Prawda, że proste? :]
2. Ciąg Fibonacciego
Ciąg Fibonacciego jest zdefiniowany następująco:
fib(0) = 1,
fib(1) = 1,
fib(n) = f(n-1)+fib(n) gdzie n>=2
A oto jak wygląda program:
#include <iostream.h>
unsigned long int fib(int x)
{
if (x<2)
return 1;
else
return fib(x-1)+fib(x-2);
}
Teraz przeanalizujmy na spokojnie dzrzewo wywołań rekurencyjnych:
************
+ fib(4) +
************
/ \
/ \
************ ************
+ fib(3) + : fib(2) :
************ ************
/ \ / \
/ \ / \
************ ************ ************ ************
: fib(2) : + fib(1) + : fib(1) : : fib(0) :
************ ************ ************ ************
/ \
/ \
************ ************
: fib(1) : : fib(0) :
************ ************
No i teraz spójrzcie jeszcze raz na drzewo. Każdy element w którym zastosowałem dwukropek
jest problemem elementarnym. Każdy problem o rozmiarze n>=2 zostaje rozbity na dwa mniejsze
problemy n-1 i n-2.
3. Spirala
Tutaj właśnie zostanie zaraz przedstawiony algorytm w postaci graficznej -program będzie
rysował tzw. spiralę czyli coś takiego:
****************************
*
********************** *
* * *
* * *
* ************** * *
* * * * *
* * * * * *
* * * * * *
* * ********** * *
* * * *
* * * *
* ****************** *
* *
* *
**************************
Przechodzimy do rozwiązania zadania. Wybieramy jako parę startową pewną parę (x,y). Idea
polega na narysowaniu 4 odcinków zewnętrznych spirali i dotarciu do punktu (x',y'). W nowym
punkcie startowym możemy już wywołać rekurencyjnie procedurę rysowania, która jest obarczona
pewnymi warunkami, które zagwarantują jej poprawne zakończenie.
No to zabieramy się za program:
#include <GRAPHICS.H>
#include <conio.h>
const double alpha=10;
void spirala(double lg,double x,double y)
{
if (lg>0)
{
lineto(x+lg,y);
lineto(x+lg,y+lg);
lineto(x+alpha,y+lg);
lineto(x+alpha,y+alpha);
spirala(lg-2*alpha,x+alpha,y+alpha);
}
}
void main()
{
int Karta, Tryb;
Karta = DETECT;
initgraph(&Karta, &Tryb, "d:\\tc\\bgi\\");
setgraphmode(Tryb);
moveto(90,50);
spirala(getmaxx()/2,getx(),gety());
getch();
closegraph();
}
Teraz na zakończenie wyjaśnienie zastosowania poszczególnych funkcji:
=========================================================================
+ FUNKCJA + ZASTOSOWANIE +
=========================================================================
+ lineto(x,y) + kreśli odcinek od punktu bieżącego do punktu (x,y) +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ moveto(x,y) + przesuwa kursor graficzny do punktu (x,y) +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ getmaxx() + zwraca maksymalną współrzędną poziomą +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ getmaxy() + zwraca maksymalną współrzędną pionową +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ getx() + zwraca aktualną współrzędną poziomą +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ gety() + zwraca aktualną współrzędną pionową +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
No i na razie to wszystko. Na zakończenie podam jakieś ciekawe Linki do stron poświęconych
zagadnieniom Algorytmiki, gdzie będziecie mogli rozwijać swoją wiedzę dalej o ile zechcecie.
Zresztą widzicie sami, że algorytmy nie są wcale takie straszne i są bardzo pomocne przy
rozwiązywaniu wielu zagadnień programistycznych.
==========
7.5 Zrozumieć kod CRC by Estor
==========
Wstęp
Czym jest CRC? Cyclic Redundancy Checking w skrócie CRC jest to
wynik wykonania obliczeń matematycznych na bloku danych, który reprezentuje
zawartość i organizacje tych danych. O CRC możesz myśleć jak o wykonaniu
"odcisku palca" dla bloku danych. Wartość ta, czy też odcisk palca nazywa
się sumą kontrolną.
Dzięki porównaniu sumy kontrolnej jednego bloku danych z inną sumą kontrolną
innego bloku danych można stwierdzić czy te dane są identyczne, bez
porównywania całych bloków. CRC najczęściej wykorzystuje się przy
transporcie plików z jednej lokalizacji do drugiej, w zależności od medium
(nośnik informacji np. dyskietka, kabel, fale radiowe) w którym pliki są
transportowane, może dojść do uszkodzenia danych.
Kod CRC pozwala wykryć takie uszkodzenie, większa część protokołów w sieci
używa tego kodu do sprawdzania prawidłowości danych.
Najbardziej znane kody (sumy kontrolne) to:
CRC-12, CRC-16, CRC-CCITT, CRC-32. Każdy z tych kodów różni się długością
kodu oraz wielomianem.
W tym artku postaram się skupić na kodzie CRC-16,słowo kod i suma kontrolna
będą stosowane wymiennie.
Wielomian
W anglojęzycznej dokumentacji kodu CRC bardzo często pojawia się
słowo poly lub polynomial, co oznacza wielomian, ale co to za wielomian,
sam się troszkę na początku wystraszyłem, ale okazuje się że wielomian ten
służy tylko do wyznaczenia pewnej liczby, która jest dzielnikiem bloku
danych 8). np.
CRC_Poly = x^15 + x^14 + x^1 + 1
Wygląda to dość okropnie, ale nas jako programistów interesuje tylko wynik
tych wielomianów.
CRC_Poly = 1100 0000 0000 0011 = 0xC003
Tu ważna uwaga w dokumentacji bardzo często można się spotkać z czymś takim
że wielomian x^16 + x^15 + x^2 + 1 równa się 0xA001, co wydaje mi się że
jest błędne!.
Przed napisaniem tego artka przestudiowałem kilkanaście dokumentów po
angielsku, niestety okazuje się że wiele z nich przepisanych z innych prac,
i ten błąd ciągnie się już od dawna. Aż wreszcie znalazłem stonkę na której
jest opisany proces wyznaczenia wartości wielomianu.
Wyznaczenie wielomianu binarnego:
Wielomian binarny z współczynnikiem z pola bitowego. Dla przykładu
X^5+X^3+X^1+X^0 = X^5+X^3+X+1 = 101011(binarnie). Jak widać w przykładzie,
bit z prawej strony reprezentuje najmniejszą wartość wielomianu czyli X^0.
Nic skomplikowanego.
Co to jest długość kodu? jest to rozmiar liczby (liczony w bitach) po
wykonaniu działań matematycznych, rozmiar wyznacza najstarszy zapalony bit.
I tak CRC-12 składa się z 12 bitów, CRC-16 z 16, a CRC-32 jak się zapewne
można domyślić z 32 bitów.
Jak to działa czyli algorytm:
Nie będzie żadnego kodu, tylko opis kroków które należy wykonać aby
wyznaczyć kod CRC.
Rejestr CRC - Zmienna w programie w której jest przechowywany kod CRC
1. Określ ile bajtów obejmuje blok danych.
2. Wypełnij wszystkie bity rejestru CRC wartością 1
3. Pobierz bajt danych
4. Wykonaj operacje XOR na Rejestrze CRC pobranym bajtem
5. Sprawdź czy zerowy bit jest ustawiony
[Jeśli tak]
6. Przesuń w prawo o jeden bit rejestr CRC
7. Wykonaj operacje : rejestr CRC XOR wielomian
[Jeśli nie]
8. Tylko przesuń w prawo o jeden bit
9. Kroki od 5 powtarzaj aż zostanie sprawdzony cały bajt
10. Jeśli są jeszcze dane to pobierz kolejną daną z bloku danych i wykonaj wszystko od kroku 4
11. Koniec generowania kodu CRC
Przykład:
Proponuje wyznaczyć kod CRC dla 2 bajtowego bloku danych 01,07
wielomianem A001(hex), dla poprawienia czytelności wartości będą zapisywane
binarnie, co 4 bity jest odstęp jednej spacji, pomiędzy bajtami są 2 spacje.
Wszystko po to aby poprawić czytelność przykładu.
CRC_Reg = 1111 1111 1111 1111 Krok2. Wszystkie bity na 1
XOR 0000 0000 0000 0001 Krok4. Wykonanie operacji XOR z bajtem
danych tu 1.
CRC_Reg = 1111 1111 1111 1110 Wynik po XOR Krok5 = false, wykonuje krok 8.
SHIFT = 0111 1111 1111 1111 Wynik po przesunięciu w kroku 8.
Dokonuje porównania w kroku 5.
SHIFT = 0011 1111 1111 1111 Poprzednio zerowy bit mial wartość 1,
XOR 1010 0000 0000 0001 więc przesuwamy i XOR'ujemy
CRC_Reg = 1001 1111 1111 1110 Wynik po XOR Krok5 = false, wykonuje krok 8.
SHIFT = 0100 1111 1111 1111 Wynik po przesunięciu w kroku 8.
Dokonuje porównania w kroku 5.
SHIFT = 0010 0111 1111 1111 Poprzednio zerowy bit mial wartość 1,
XOR 1010 0000 0000 0001 więc przesuwamy i XOR'ujemy
CRC_Reg = 1000 0111 1111 1110
SHIFT = 0100 0011 1111 1111
SHIFT = 0010 0001 1111 1111
XOR 1010 0000 0000 0001
CRC_Reg = 1000 0001 1111 1110
SHIFT = 0100 0000 1111 1111
SHIFT = 0010 0000 0111 1111
XOR = 1010 0000 0000 0001
CRC_Reg = 1000 0000 0111 1110 To jest kod CRC dla danej o wartości jeden,
bity już zostały przesunięte o 8 w prawo
Wykonuje krok 10.
XOR 0000 0000 0000 0111 A tu już jest Krok 4 tym razem z wartością 7.
CRC_Reg = 1000 0000 0111 1001 Krok 5
SHIFT = 0100 0000 0011 1100 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1110 0000 0011 1101 Krok 5.
SHIFT = 0111 0000 0001 1110 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1101 0000 0001 1111 Krok 5.
SHIFT = 0110 1000 0000 1111 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1100 1000 0000 1110 Krok 5.
SHIFT 0110 0100 0000 0111 Krok 8. a później 5
SHIFT 0011 0010 0000 0011 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1001 0010 0000 0010 Krok 5.
SHIFT = 0100 1001 0000 0001 Krok 8. a później 5
SHIFT = 0010 0100 1000 0000 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1000 0100 1000 0001 Krok 5.
SHIFT = 0100 0010 0100 0000 Krok 6
XOR = 1010 0000 0000 0001
CRC_Reg = 1110 0010 0100 0001
Wybik(Hex): = E 2 4 1
A więc kod CRC dla danych 01,07 z wielomianem A001 wynosi E241.
I to już wszystko, następnym razem napsize jak sprawdzić czy kod CRC
jest prawidłowy.
==========
7.6 Kompresja metodą RLE by Estor
==========
Wstęp:
Algorytm RLE czyli run-lenght encoding jest algorytmem który
wykorzystuje się do kompresji grafiki rysowanej ręcznie. Algorytm
wykorzystuje fakt iż każdy obraz w grafice rastrowej wykazuje pewną
koherencje , czyli dużą liczbę pixli o tym samym kolorze sąsiadujących ze
sobą.
Tego typu kompresja została użyta między innymi w plikach PCX, FLI, LBM na
Amigach znanym jako IFF. RLE można również używać do pracy z maskami
bitowymi czy też rastrowymi.
Działanie:
Weźmy dowolny ciąg bajtów np.
5, 5, 5, 5, 1, 0, 1, 5, 5, 0, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7
Ma on długość 22 bajtów i można w nim wydzielić 2 grupy bajtów:
[1] Grupa w której określony bajt ma następcę o tej samej wartości:
{5, 5, 5, 5}, 1, 0, 1,{ 5, 5}, 0, {2, 2, 2, 2, 2, 2, 2}, 3, 4, 5, 6, 7
[2] Grupa w której wartości nie mają sąsiadów o tej samej wartości:
5, 5, 5, 5, {1, 0, 1}, 5, 5,{ 0}, 2, 2, 2, 2, 2, 2, 2,{ 3, 4, 5, 6, 7}
Kompresja polega na znajdowaniu dużej liczby bajtów pasujących do grupy [1].
Grupy takie są zapisywane jako 2 bajty. Pierwszy określa ile razy dana
wartość powtarza się w danej grupie, 2 określa wartość.
Przykładowy ciąg można zapisać następująco:
Liczba
Lp. powtórzeń Wartość
1 4 5
2 1 1
3 1 0
4 1 1
5 2 5
6 1 0
7 7 2
8 1 3
9 1 4
10 1 5
11 1 6
12 1 7
Czyli po skompresowaniu dane urosły do 24 bajtów a więc nie ma kompresji.
Z tego powodu w kompresji używa się liczby ze znakiem.
1 bajt może przyjmować wartości z 2 zakresów:
[1] od 0 do 255 Bajt bez znaku
[2] od -128 do 127 Bajt ze znakiem
Przez takie ulepszenie można zakodować obie grupy liczb, np. grupę [1] na
liczbach dodatnich, zaś grupę [2] na liczbach ujemnych.
Może zaprezentuje to na przykładzie, używając ciągu z początku tego
dokumentu:
Liczba
Lp. powtórzeń Wartość
1 +4 5
2 -3 1,0,1
3 +2 5
4 -1 0
5 +7 2
6 -5 3,4,5,6,7
Ostatecznie zapis w pamięci będzie wyglądać tak:
4 ,5, -3, 1, 0, 1, 2, 5, -1, 0, 7, 2, -5, 3, 4, 5, 6, 7
22 Bajty zostały skompresowane do 18, dekompresor powinien przeczytać owy
zapis następująco
1. Zapisz w kolejnych 4 bajtach wartość 5
{4 ,5 }, -3, 1, 0, 1, 2, 5, -1, 0, 7, 2, -5, 3, 4, 5, 6, 7
wynik: [5, 5, 5, 5]
2. Skopiuj kolejne 3 bajty
4 ,5,{-3, 1, 0, 1}, 2, 5, -1, 0, 7, 2, -5, 3, 4, 5, 6, 7
wynik: 5, 5, 5, 5,[1, 0, 1]
3. Zapisz w 2 bajtach wartość 5 ::
4 ,5, -3, 1, 0, 1, {2, 5,}-1, 0, 7, 2, -5, 3, 4, 5, 6, 7
wynik: 5, 5, 5, 5, 1, 0, 1,[5, 5]
4. Skopiuj tylko 1 bajt o wartości 0
4 ,5, -3, 1, 0, 1, 2, 5, { -1, 0,} 7, 2, -5, 3, 4, 5, 6, 7
wynik: 5, 5, 5, 5, 1, 0, 1, 5, 5, [0]
5. Zapisz w 7 bajtach liczbę 2
4 ,5, -3, 1, 0, 1, 2, 5, -1, 0, {7, 2,} -5, 3, 4, 5, 6, 7
wynik: 5, 5, 5, 5, 1, 0, 1, 5, 5, 0, [2, 2, 2, 2, 2, 2, 2]
6. Skopiuj 5 kolejnych bajtów
4 ,5, -3, 1, 0, 1, 2, 5, -1, 0, 7, 2, {-5, 3, 4, 5, 6, 7}
wynik: 5, 5, 5, 5, 1, 0, 1, 5, 5, 0, 2, 2, 2, 2, 2, 2, 2, (3, 4, 5, 6, 7)
Ilość zaoszczędzonego miejsca nie jest oszałamiająca, może się nawet zdarzyć
że obrazek będzie większy od oryginału, np. ze skanowane zdjęcie.
Wynika to z tego że najmniejszą porcją informacji są 2 bajty, nie może być
mniej ponieważ pierwszy określa liczbę powtórzeń, zaś drugi wartość
powtarzaną.
Implementacja
No cóż nie jest to kanapka z serem i algorytm można zaimplementować
na różne sposoby, czego przykładem może być powstanie kilku "standardów"
zapisu obrazu czyli wspomniane wcześniej PCX, LBM, IFF, FLI, BMP_RLE itd...
Podczas implementowania funkcji należy pamiętać iż musi ona znać rozmiar
kompresowanego bloku w czasie kompresji
jak i dekompresji. Rozmiar jest jedyną wartością która może określić
miejsce końca bloku danych.
Algorytm kompresji:
Założenia
t[] Tablica z elementami do kompresji
pos Pozycja w tablicy
count liczba powtórzeń
tmp zmienna tymczasowa
len długość bloku do kompresji
c_len długość bloku skompresowanego
1. Nadanie wartości początkowych dla t[], pos=0, c_len=0
2. Pobierz wartość z t[pos] do tmp, count=1;
3. Zwiększ wartość pos o 1
4. Czy tmp == t[pos]
[Jeśli równe]
5. count++
6. pos++
7. Dopóki (tmp == tmp[pos] i count < 127 oraz pos < len) goto pkt5.
8. Zapisz do wyjścia 2 bajty: count, tmp
9. dodaj 2 do c_len
10. Jeśli pos < len goto pkt 2, w przeciwnym wypadku zakończ.
[Jeśli różne]
11. W zmiennej tmp zapisz wartość pos
12. count++
13. pos++
14. Dopóki (t[pos-1] != t[pos] i count < 127 oraz pos < len)
goto pkt 11.
15. Zmień znak wartości count na minus
16. Zapisz do wyjścia bajt count oraz skopiuj count bajtów zaczynając
od pozycji t[tmp]
17. Dodaj do c_len wartość count+1
18. Jeśli pos < len goto pkt 2, w przeciwnym wypadku zakończ.
Algorytm zakłada że bajt count nie może mieć wartości ZERO oraz -128,
oczywiście można wykonać taką implementacje ale osobiście proponuje zostawić
je sobie jako znaczniki np. w mojej wersji kompresji obrazu wartość 0
oznacza koniec linii, a -128 zostało do przyszłego użycia.
Algorytm de-kompresji:
Założenia:
t[] Tablica z elementami do kompresji
pos pozycja w tablicy
count liczba powtórzeń
tmp zmienna tymczasowa
len długość bloku do kompresji
d_len długość bloku po dekompresji
1. Nadanie wartości początkowych dla t[], pos=0, d_len=0
2. Pobierz wartość z t[pos] do count
3. Czy wartość count > 0 (dodatnia)
[Jeśli TAK]
4. pos++
5. Do tmp pobierz wartość z t[pos]
6. Zapisz wartość z tmp do wyjścia tyle razy ile jest w count
7. Dodaj do d_len wartość count
8. pos++
9. Jeśli pos < len goto pkt 2.
10. Zakończ działanie
[Jeśli NIE]
11. Zmień znak count na przeciwny (dodatni)</LI>
12. pos++
13. Kopiuj count bajtów do wyjścia
14. Dodaj do d_len wartość count
15. pos++
16. Jeśli pos < len goto pkt 2.
17. Zakończ działanie
Po zdekompresowaniu pliku wartość d_len powinna zawierać długość
zdekompresowanego fragmentu w bajtach.
Koniec:
Efektywność kompresji jest w znacznym stopniu uzależniona od typu danych,
im więcej bajtów o tych samych wartościach sąsiaduje obok siebie tym lepszy
efekt kompresji. Jest on w zupełności wystarczający do kompresowania
animacji duszków gdzie przed kompresją wycina się fragmenty które powtarzają
się pomiędzy conajmniej 2 klatkami animacji ale o tym napisze przy opisie
algorytmu rozszerzającego możliwości RLE i który został użyty w animacji
zapisanej w formacie FLI, FLC. Pozatym RLE nie ogranicza się tylko do
kompresji, tak jak napisałem już na początku można go użyć do kodowania
masek bitowych dla ikon, duszków itp. co w znacznym stopniu przyspiesza ich
rysowanie uwzględniając przeźroczystość.
Miłej zabawy...
---------------------------------------------------------------------------------------------
---------------------------
8. Linki
---------------------------
http://www.algorytm.cad.pl
http://www.faqs.org
http://www.linuxindex.pl/index.html
http://lanzone.koti.com.pl
http://republika.pl/dief/main.html
http://www.underground.org.pl
http://nevillon.pac.pl
http://www.linux.labs.eu.org
http://www.ahg.prv.pl/
http://www.robertgraham.com/pubs/sniffing-faq.html
http://directx.w.interia.pl/
http://arstechnica.com/paedia/w/wireless/security-2.html
http://www.blackalchemy.to/
http://www.secadministrator.com/articles/index.cfm?articleid=24873
http://www.ntsecurity.net/Articles/Index.cfm?ArticleID=26539
http://www.pl.tomshardware.com/network/02q3/020719/
http://www.networld.pl/suplementy/wlan/wlan.html
http://orfi.uwm.edu.pl/~borowik/
http://aknet.com.pl/cmc/siec.htm
---------------------------------------------------------------------------------------------
---------------------------
9. Zakończenie
---------------------------
No na razie to tyle. Jeśli chcecie więcej to bedziecie musieli poczekać jeszcze troche - za niedługo weźmiemy sie za
pisanie drugiego numeru HWF.
Greetz: thx 4 @ll którzy życzyli nam tego, żeby to FAQ powstało i dla wszystkich, którzy to FAQ tworzyli i pomagali nam
poprawiać wszystkie błędy merytoryczne ;]. Szczególne podziękowania dla chłopaków z UPL i Nevillonu ;]
Ungreetz: dla jednego takiego osła, który się uważa za super hax0ra i pozjadał wszystkie rozumy świata - FOK U Trumna -
stań z boku i nie prowokuj! :P
Tutaj podam jak się można z nami skontaktować:
Bartosz "CZaR|Ny" Pieczka
mail: czarny21@poczta.fm
http://www.knowledge-attack.xu.pl
Marcin "Estor" Waśniowski
estor@interia.pl
http://www.estor.terramail.pl
qrack
qrack@wp.pl
krasztest
krasztest@konin.lm.pl
Remarks
eudajmonia@interia.pl
ASSmodeus
assmodeu@wp.pl
----------------------------------------------------------------------------------------------------------------
......:::H4cK3rW4n4b3F4Q Pazdziernik 2002:::......