четвртак, 10. децембар 2009.

CISCO SWITCH CONFIGURATION - LAB 1

Komande koje treba da znate su označene BOLD slovima, ostale nisu neophodne!

SW2-kim0#sh run
Building configuration...

Current configuration : 5697 bytes
!
version 12.2
no service pad
service timestamps debug uptime
service timestamps log uptime
no service password-encryption
!
hostname SW2-kim0
!
!
no aaa new-model
ip subnet-zero
ip routing
!
!
!
!
!
!
no file verify auto
!
spanning-tree mode pvst
spanning-tree portfast bpduguard default
spanning-tree portfast bpdufilter default
spanning-tree extend system-id
spanning-tree uplinkfast max-update-rate 1500
!
vlan internal allocation policy ascending
!
!
interface Loopback0
ip address 1.1.1.222 255.255.255.255

!
interface Port-channel1
description "DOUBLE PORT VEZA SA SW1"
no switchport

ip address 129.1.78.8 255.255.255.0

!
interface FastEthernet0/1
switchport mode dynamic desirable
!
interface FastEthernet0/2
switchport access vlan 22
switchport mode access

!
interface FastEthernet0/3
switchport mode dynamic desirable
!
interface FastEthernet0/4
switchport access vlan 44
switchport mode access

!
interface FastEthernet0/5
switchport mode dynamic desirable
!
interface FastEthernet0/6
switchport mode dynamic desirable
!
interface FastEthernet0/7
switchport mode dynamic desirable
switchport port-security maximum 3
switchport port-security violation shutdown

!
interface FastEthernet0/8
switchport mode dynamic desirable
switchport port-security maximum 3
switchport port-security violation shutdown

!
interface FastEthernet0/9
switchport mode dynamic desirable
!
interface FastEthernet0/10
switchport mode dynamic desirable
!
interface FastEthernet0/11
switchport mode dynamic desirable
!
interface FastEthernet0/12
switchport mode dynamic desirable
!
interface FastEthernet0/13
switchport mode dynamic desirable
!
interface FastEthernet0/14
switchport mode dynamic desirable
!
interface FastEthernet0/15
switchport mode dynamic desirable
!
interface FastEthernet0/16
switchport trunk encapsulation dot1q
switchport mode trunk

!
interface FastEthernet0/17
switchport mode dynamic desirable
!
interface FastEthernet0/18
switchport mode dynamic desirable
!
interface FastEthernet0/19
switchport trunk encapsulation dot1q
switchport mode trunk

!
interface FastEthernet0/20
switchport trunk encapsulation dot1q
switchport mode trunk

!
interface FastEthernet0/21
switchport trunk encapsulation dot1q
switchport mode trunk

!
interface FastEthernet0/22
switchport mode dynamic desirable
!
interface FastEthernet0/23
switchport mode dynamic desirable
!
interface FastEthernet0/24
switchport mode dynamic desirable
!
interface FastEthernet0/25
switchport mode dynamic desirable
!
interface FastEthernet0/26
switchport mode dynamic desirable
!
interface FastEthernet0/27
switchport mode dynamic desirable
!
interface FastEthernet0/28
switchport mode dynamic desirable
!
interface FastEthernet0/29
switchport mode dynamic desirable
!
interface FastEthernet0/30
switchport mode dynamic desirable
!
interface FastEthernet0/31
switchport mode dynamic desirable
!
interface FastEthernet0/32
no switchport
no ip address
channel-group 1 mode on

!
interface FastEthernet0/33
no switchport
no ip address
storm-control broadcast level 20.00
storm-control unicast level 40.00 20.00
channel-group 1 mode on

!
interface FastEthernet0/34
description "TRUNK LINK SW1-SW2"
switchport trunk encapsulation dot1q
switchport trunk native vlan 38
switchport mode trunk
switchport port-security maximum 3
switchport port-security violation restrict

!
interface FastEthernet0/35
switchport mode dynamic desirable
!
interface FastEthernet0/36
switchport mode dynamic desirable
!
interface FastEthernet0/37
switchport mode dynamic desirable
!
interface FastEthernet0/38
switchport mode dynamic desirable
!
interface FastEthernet0/39
switchport mode dynamic desirable
!
interface FastEthernet0/40
switchport mode dynamic desirable
!
interface FastEthernet0/41
switchport mode dynamic desirable
!
interface FastEthernet0/42
switchport mode dynamic desirable
!
interface FastEthernet0/43
switchport mode dynamic desirable
!
interface FastEthernet0/44
switchport mode dynamic desirable
!
interface FastEthernet0/45
switchport mode dynamic desirable
!
interface FastEthernet0/46
switchport mode dynamic desirable
!
interface FastEthernet0/47
switchport mode dynamic desirable
!
interface FastEthernet0/48
switchport mode dynamic desirable
!
interface GigabitEthernet0/1
switchport mode dynamic desirable
switchport block multicast
switchport block unicast
switchport backup interface Gi0/2
switchport backup interface Gi0/2 preemption mode forced
!
interface GigabitEthernet0/2
switchport mode dynamic desirable
switchport block multicast
switchport block unicast
!
interface Vlan1
no ip address
shutdown
!
interface Vlan38
ip address 204.12.1.8 255.255.255.0

max-reserved-bandwidth 80
!
interface Vlan58
description "CORPORATE VLAN"
ip address 10.10.10.1 255.255.255.0

!
router eigrp 100
network 1.1.1.222 0.0.0.0
network 129.1.78.0 0.0.0.255
no auto-summary

!
router bgp 1
no synchronization
bgp log-neighbor-changes
network 129.1.78.0 mask 255.255.255.0
network 203.12.1.0 mask 255.255.255.0
neighbor 1.1.1.11 remote-as 1
neighbor 1.1.1.11 update-source Loopback0
neighbor 1.1.1.11 next-hop-self
no auto-summary

!
ip classless
ip route 1.1.1.11 255.255.255.255 129.1.78.7 name "SW1 - KAMENI"
ip route 129.1.13.0 255.255.255.0 129.1.17.1 name "PREKO R1 DO R3"

ip http server
ip http secure-server
!
!
!
control-plane
!
!
line con 0
logging synchronous
line vty 0 4
logging synchronous
no login
line vty 5 15
no login
!
end

четвртак, 26. новембар 2009.

субота, 21. новембар 2009.

уторак, 16. јун 2009.

AKTIVNI RADOVI

SPORT RAF - HEADER



GARDALAND - ITALIJA - PONUDA


LABON TRAVEL


PLAKAT ZA ŠKOLU ENGLESKOG JEZIKA "Y.B.S"



VIZIT-KARTA PREDUZEĆA "BEA NEKRETNINE"


BANNER PREDUZEĆA "LABON TRAVEL"





PLAKAT RAČUNARSKOG FAKULTETA


WEB-TEMPLATE (STILL UNSIGNED)


JAVA SOURCE CODE: CLIENT - SERVER APP.

Klijen - Server aplikacija napisana u JAVA programskom jeziku. Vrlo jednostavno, moze se koristiti kao instant messaging ili kao command prompt. Evo koda:

----------
SERVER:
----------
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;



import javax.swing.*;

public class Server extends JFrame {

private JTextArea displayarea;
private JTextField textfield = null;
private Socket connection;
private ServerSocket server;
private int counter = 1;
private ObjectInputStream input;
private ObjectOutputStream output;
private String msg;
private String xxx;



public Server()

{

super ("Serverska aplikacija");
Container container = getContentPane();

textfield = new JTextField();



textfield.addActionListener(

new ActionListener() {
public void actionPerformed( ActionEvent event) {
String mout = textfield.getText();
textfield.setText("");


try {
sendData (mout);
}

catch ( IOException ioException ) {
displayarea.append ("Greška u kucanju");
}


}
});

// displej aplikacije

container.add(textfield , BorderLayout.NORTH);

displayarea = new JTextArea();
container.add(new JScrollPane (displayarea), BorderLayout.CENTER);
setSize( 400, 400);
setVisible (true);
}

//-------------------------------------


public void runServer() // metoda za startovanje servera

{

try {

server = new ServerSocket(1600,10); // kreiranje novog soketa na serveru

while ( true ) {

waitforconnection();

getstreams();

pconnection();

close();

++ counter;

}
}


catch ( IOException ioException ) {
ioException.printStackTrace();

}
}


//-------------------------------------


private void waitforconnection() throws IOException

{
displayarea.append ("\nOCEKUJEM KONEKCIJU OD KLIJENTA...\n");
connection = server.accept();
displayarea.append("DOBIJAM ZAHTEV ZA KONEKCIJU...\n");
displayarea.append("KONEKCIJA BR. " + counter + " USPOSTAVLJENA SA: " + connection.getInetAddress().getHostName() + "\n");


}

//-------------------------------------



public void getstreams() throws IOException {

output = new ObjectOutputStream (connection.getOutputStream() );
output.flush();

input = new ObjectInputStream (connection.getInputStream() );
displayarea.append("POSTAVLJENI I/O STREAMOVI \n\n");

}

//-------------------------------------


public void pconnection() throws IOException{



msg = "\nKONEKCIJA USPOSTAVLJENA, CHAT JE OTVOREN!\nKOMANDA ZA ZATVARANJE KONEKCIJE JE CLOSE"; // ispisivanje pozdravne poruke na klijentu
output.writeObject ( msg );
output.flush();

do {

try{
msg = (String) input.readObject(); // čitanje input stream-a
displayarea.append("\n >> KLIJENT KAŽE: << " + msg); // ispisivanje output stream-a excommand(msg); } catch (ClassNotFoundException classNotFoundException ) { displayarea.append("NEPOZNATO"); } } while (!msg.equals("CLOSE")); // KOMANDA ZA ZATVARANJE KONEKCIJE! } //------------------------------------- // baratanje stringovima za ispisivanje poruka public void excommand(String z) { try { int exitv; int pstatus; int l; String ll; String cmd; String check = new String( ".exe"); String c = z; l = z.length(); if (l<5 cmd =" c;" cmd = "Cmd.exe /c " ll =" c.substring(" cmd =" c;" cmd =" c;" cmd = "Cmd.exe /c " cmd =" c" p =" Runtime.getRuntime().exec(cmd);" pstatus =" p.waitFor();" pstatus =" -1;" subp =" new" gar =" new" str =" subp.readLine()" str =" gar.readLine()" error="2," exitv =" p.exitValue();" pstatus ="="" xxx =" new"> " + c +" < "+ " Proces je uspešno izvršen!\n"); sendData (xxx); displayarea.append( xxx); } else { displayarea.append("KOMANDA> " + c + " <"+ " \nPROCES NIJE GOTOV \n"); sendData("KOMANDA> " + c + " <"+ " \nPROCES NIJE GOTOV \n"); } displayarea.append("Vrednost procesa nakon izlaska je: " + exitv +"\n" ); sendData("KOMANDA> " + c + " <"+ " Vrednost procesa nakon izlaska je: " + exitv +"\n"); } catch (IOException e) { System.err.println(e); } } //------------------------------------- // ovde ispisuje svoje poruke, da bi znao sta je rekao klijentu public void sendData (String x) throws IOException { output.writeObject ( x ); displayarea.append ("\n>> JA << " + x ); output.flush(); } //------------------------------------- // metod za zatvaranje konekcije public void close() throws IOException{ displayarea.append("\nDISKONEKTOVANJE... \n"); sendData ("\nDISKONEKTOVAN SERVER"); output.close(); input.close(); connection.close(); } //------------------------------------- // main metoda public static void main ( String args[] ) { Server application = new Server(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); application.runServer(); } } ---------- CLIENT: ---------- import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class client extends JFrame { private JTextField entercommand; private JTextArea displayarea,displayarea1; private Socket clconnection; private String servern; private ObjectOutputStream output ; private ObjectInputStream input ; private String msg; public client ( String host ) { super("Klijentska aplikacija"); servern = host; Container container = getContentPane(); entercommand = new JTextField( ""); container.add(entercommand, BorderLayout.SOUTH); displayarea = new JTextArea(); container.add(new JScrollPane (displayarea), BorderLayout.CENTER); setSize( 500, 500); setVisible (true); entercommand.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent event) { String ord = entercommand.getText(); try { sendData (ord); } catch ( IOException ioException ) { displayarea.append ("Greska!\n"); } } }); } //------------------------------------- public void runClient() { try { connectToServer(); getstreams(); pconnection(); close(); } catch ( IOException ioException ) { ioException.printStackTrace(); } } //------------------------------------- private void connectToServer() throws IOException { try { displayarea.setText ("\nUSPOSTAVLJAM KONEKCIJU SA SERVEROM....\n"); clconnection = new Socket( InetAddress.getByName ( servern ), 1600); displayarea.append( "USPOSTAVLJENA KONEKCIJA SA: " + clconnection.getInetAddress().getHostName() ); } catch ( IOException d ) { System.out.println(d); System.out.println("Exception za konekciju"); } } //------------------------------------- public void getstreams() throws IOException { try { output = new ObjectOutputStream (clconnection.getOutputStream() ); output.flush(); input = new ObjectInputStream (clconnection.getInputStream() ); displayarea.append("\nPOSTAVLJEN I/O STREAM \n"); } catch (IOException s) { System.out.println(s); System.out.println("Exception from GETSTREAM()"); } } //------------------------------------- public void pconnection() throws IOException { do { try{ msg = (String) input.readObject(); displayarea.append("\n >> SERVER KAŽE << " + msg); } catch (ClassNotFoundException classNotFoundException ) { displayarea.append("NEPOZNAT TEKST"); } } while (!msg.equals("CLOSE") ); } //------------------------------------- public void sendData (String x) throws IOException { output.writeObject ( x ); displayarea.append ("\n>> JA << " + x );
entercommand.setText("");
output.flush();

}

//-------------------------------------


public void close() throws IOException {

displayarea.append("\n Zatvaranje konekcije. .. .. ");
output.close();
input.close();
clconnection.close();

}

//-------------------------------------


public static void main( String[] args ) {

client app;

if (args.length == 0 )
app = new client("127.0.0.1");
else
app = new client( args [0] ) ;

app.runClient();

app.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE );


}
}

------------------

Pokrenete prvo server, zatim konektujete klijenta i to je to!
Pazite samo na ip adrese ukoliko konektujete na razlicitim racunarima!

понедељак, 15. јун 2009.

CMOS - ELEKTRONIKA

CMOS

Engl. Complementary Metal–Oxide–Semiconductor) je tehnološka generacija integralnih kola, stvorena 60-ih godina XX veka. Za razliku od TTL tehnologije sa bipolarnim tranzistorima, odlika CMOS tehnologije je bila mala potrošnja struje, što je omogućeno upotrebom FET tranzistora (еngl. Field Effect Transistor). Originalna CMOS tehnologija je vremenom evoluirala u mnoge podvrste. Od 1972. god. pa nadalje, razvijeno je nekoliko serija CMOS kola. Topološke razlike među njima skoro da i ne postoje ili su veoma male. Suštinska razlika između kola je u primenjenoj tehnologiji - iz čega proističu razlike u osnovnim parametrima.
Starija CMOS kola su bila iz 4000 serije, pa ih je po brojevima bilo lako razlikovati od TTL kola serije 7400 ili 5400. Kasnija kola 7400 serije su imala oznaku C, kao na primer 74C00 da označe CMOS kolo. Da bi smo mogli da razmatramo CMOS kola, ukratko ću opisati šta je to integralno kolo.

CMOS NI kolo sastoji se od dva n-mosfeta (MF1 i MF2) koji su vezani na red i dva p-mosfeta (MF3 i MF4) koji su vezani paralelno. Kao što je već objašnjeno, niski napon na gejtu drži n-mosfete zakočene, a p-mosfete provodne. Visoki napon na gejtu ima suprotan efekat, n-mosfete prevodi u provodno stanje, a p-mosfete drži zakočene. Prema tome, logička nula na ulazu x1 ili na x0 ili na oba ulaza, drži bar jedan od tranzistora MF1 i MF2 zakočen, a bar jedan od tranzistora MF3 i MF4 provodan. U tom slučaju na izlazu se dobija visoki napon, odnosno logička 1. Ako su oba ulaza na visokom naponu, onda su MF3 i MF4 zakočeni, a MF1 i MF2 provodni, pa je na izlazu niski napon ili logička 0.


CMOS NILI kolo sastoji se od dva paralelno vezana n-mosfeta (MF1 i MF2) i dva p-mosfeta (MF3 i MF4) koji su vezani na red. Logička 1 na ulazu x1 ili na x0 ili na oba ulaza, drži bar jedan ili oba tranzistora MF1 i MF2 u provodnom stanju, a bar jedan od tranzistora MF3 i MF4 zakočen. Na izlazu y dobija se niski napon, odnosno logička 0. Ako su oba ulaza na logičkoj 0, onda su MF3 i MF4 provodni, a MF1 i MF2 zakočeni, pa je na izlazu visoko napon ili logička 1.



CMOS Invertor

Osnovno kolo CMOS invertora prikazano je na slici. Kolo se sastoji od dva tranzistora, PMOS i NMOS tranzistora. Kvalitativno, kolo se može posmatrati i kao prekidac, zbog toga što PMOS i NMOS tranzistor imaju identicne elektricne karakteristike, što se obezbeđuje tehnološki.



Kada je na ulazu invertora logička nula, na izlazu je logička jedinica, tj. napon VDD, što odgovara tački 1 na slici. Sa porastom ulaznog napona, NMOS tranzistor radi u zasićenju, a PMOS tranzistor u triodnoj oblasti, što odgovara tački 2. U tački 3 oba tranzistora rade u zasićenju i to je oblast maksimalnog pojačanja. Kada ulazni napon dostigne vrednost koja odgovara taćki 4, NMOS tranzistor radi u triodnoj oblasti, a PMOS tranzistor u zasićenju. Najzad, kada je ulazni napon VDD + VTp, PMOS tranzistor se isključuje1, dok je pad napona na NMOS tranzistoru 0 V , tako da je izlazni napon jednak 0 V. Iz navedenog razmatranja se može zaključiti da kod CMOS invertora jednosmerna struja teče samo u prelaznom režimu, odnosno samo pri promeni logičkog stanja invertora. Zbog toga se digitalna CMOS integrisana kola odlikuju veoma malom disipacijom snage, što CMOS tehnologiju čini logičnim izborom za VLSI i ULSI kola.

Logička kola u CMOS tehnici su poznata po veoma maloj disipaciji u oba logička stanja. To dolazi otuda što u svakom od tih stanja jedan od mosfetova u invertoru je zakočen pa se njegova struja svodi na odvodne struje koje su reda 10mA. Osim toga, izlaz ovakvog kola u digitalnim mrežama opterećen je veoma velikim ulaznim otpornostima mosfetova priključenih kola, pa se struja opterećenja svodi praktično na punjenje i pražnjenje kapacitivnosti opterećenja.

Na slici vidimo prenosnu karakteristiku CMOS invertora. Za razliku od običnih MOS invertora vidimo da je logička amplituda kola u ovom slučaju vrlo približna naponu napajanja. Naime, nivoi Vin(0) i Vin(1) su jednaki Vdd. Pored toga, prelazni režimi su vrlo kratki jer su vremenske konstante punjenja i pražnjenja izlaznih kapacitivnosti veoma male. Ovo naročito važi za veće napone napajanja, koji mogu biti od 3 – 18V. Očigledno je da će prelazni režimi da zavise i od faktora grananja, jer svako priključeno kolo povećava kapacitivno opterećenje. Pošto su ulazne otpornosti mosfetova veoma velike, faktor grananja je skoro pa neograničen.
Pošto je trajanje prelaznog režima ovih invertora vrlo kratko, teško je odrediti vrednosti ulaznog napona u prelomnim tačkama odgovarajuće prenosne karakteristike. Zato se za naponski prag promene stanja u ovim kolima uzima vrednos ulaznog napona pri kojoj su struje u zasićenom N i zasićenom P mosfetu jednake, a to je Vut = Vdd/2.

U strukturi kola prepoznaje se osnovna električna šema standardnog CMOS invertora koji čine mosfetovi MF2 i MF3. U kolu sorsa oba mosfeta stavljena su na red jedan mosfet (MF1) prema masi i jedan mosfet (MF4) prema napajanju. Kada je ulazni signal dozvole d na logičkoj 1, mosfet MF1 je provodan i praktično predstavlja kratak spoj. Preko invertora (koji se realizuje kao standardni CMOS invertor) signal dozvole d invertuje se u logičku 0, koja drži MF4 takone u prvodnom stanju, pa je praktično i ovaj mosfet kratak spoj. Prema tome, u slučaju kada je d na logičkoj 1 dobija se ekvivalentno kolo koje je identično standardnom CMOS invertoru koji na izlazu y daje invertovani ulazni signal x. U slučaju da je ulazni signal dozvole d na logičkoj 0, oba mosfeta MF1 i MF4 su neprovodni, pa bez obzira u kom su stanju mosfetovi MF2 i MF4, ne može da teče struja od napona napanja prema izlazu y, niti od izlaza y prema masi. U ovom slučaju kolo se ponaša kao da je izlaz y galvanski odvojen od napona napajanja i mase i kažemo da predstavlja visoku impendansu.

Bilateralni CMOS prekidač

Pored invertora u sistemu CMOS kola, značajnu ulogu igra i bilateralni CMOS prekidač, koji je prikazan na slici 11. Njega čine mosfetovi N i P, vezani u paraleli. Polarizacija substrata postavlja se tako da ovi mosfetovi budu međusobno izolovani, kao što je to pokazano na strukturnoj šemi invertora ranije. Kontrolni napon K dovodi se na gejt mosfeta N, a komplement tog napona na gejt mosfeta P. Komplement napona K se dobija na CMOS invertoru kod koga su naponi napajanja VDD i –Vss = Vdd. Kontrolni napon takođe ima vrednost +Vdd ili –Vss. U toku pozitivnog kontrolnog napona na gejtu mosfeta N je napon K = Vdd, a na gejtu mosfeta P je napon K = -Vss. Prema tome, u oba mosfeta se indukuju odgovarajući kanali, čime je uspostavljena veza između ulaza i izlaza kola. Zahvaljujući MOS strukturi kolo je provodno u oba smera te se zato naziva i bilateralni prekidač. U slučaju kada je kontrolni napon negativan, oba mosfeta su zakočena tako da prekidač ispoljava otpornost preko 109 oma između ulaza i izlaza.
Vodeći računa o razlici potencijala između gejta i sorsa mosfetova, nije teško zaključiti da otpornost bilateralnog prekidača u provodnom stanju zavisi i od veličine ulaznog napona. Naime, kada je ulazni napon Vu = Vss, mosfet N se nalazi u provodnom stanju, dok je mosfet P zakočen, jer je razlika potencijala između njegovog gejta i sorsa manja od praga provođenja. Povećavajući ulazni napon smanjuje se provodnost mosfeta N zbog porasta napona na ulazu kola, a započinje vođenje mosfeta P, tako da će pri Vu = Vdd mosfet N biti zakočen, a mosfet P će provoditi. Prema tome, ekvivalentna otpornost prekidača je jednaka paralelnoj sprezi otpornosti kanala N i P mosfetova. Dodatnom modifikacijom osnovnog prekidačkog kola može se ostvariti otpornost prekidača ispod 100 oma u opsegu napajanja od 10-15V.


To je otprilike sve o CMOS logici, do sledećeg čitanja... Pozdrav!


недеља, 14. јун 2009.

TCP (TRANSMISSION CONTROL PROTOCOL)

TCP/IP protokol stek je skup protokola razvijen da omogući umreženim računarima da dele resurse putem mreže. Razvijen je od strane agencije DARPA u okviru ARPANET-a ranih 1970ih. Ovaj protokol je podržavao niz transportnih i prosleđujućih servisa i obezbeđivao je vrlo pouzdan transport podataka. Već u početcima se pokazao kao dobar pri transferu fajlova, ali pokazivao je nedostatke pri radu sa nekim mrežnim aplikacijama, a posebno pri radu sa packet voice-om iz 1970-te, što je pokazalo da u nekim slučajevima gubitci paketa ne bi trebali biti korigovani nego ostavljeni aplikaciji da se nosi sa njima. To je dovelo do reorganizacije originalnog TCP protkola, u tri nova, jedan jednostavan protokol IP koji bi bio zadužen za adresiranje i prosleđivnje pojedinih paketa, odvojenog TCP protokola koji bi podržavao servise kao što su kontrola toka i podrška u slučaju gubitka paketa.

TCP (engl. Transmition control protocol) je protokol koji pripada transportnom sloju OSI referentnog modela, ima za ulogu da obezbezbedi pouzdan transfer podataka u IP okruženju. Između ostalih servisa koje nudi, neki su: pouzdanost, efikasna kontrola toka podataka, operisanje u ful-dupleksu (istovremeno slanje i primanje podataka) i multipleksiranje koje omogućava istovremen rad niza procesa sa viših slojeva putem jedne konekcije. TCP vrši transver podataka kao nestrukturisan niz bajtova koji se identifikuju sekvencom. Ovaj protokol grupiše bajtove u segmente dodeli im broj sekvence, aplikacijama dodeli broj porta i prosledi ih IP protokolu.



TCP konekcija

Za TCP se kaže da je sa konekcijom zato što pre početka slanja podataka iz jedne aplikacije u drugu, ta dva procesa moraju prvo da se “upoznaju” – tj. moraju jedan drugom da pošalju neke uvodne segmente da bi se uspostavili parametri transfera podataka koji sledi. Prilikom uspostavljanja TCP konekcije obe strane će postaviti vrednosti za mnoge promenljive TCP stanja. TCP “konekcija” nije TDM ili FDM vod sa kraja na kraj kakvi postoje u mreži sa komutacijom vodova. Ona takođe nije ni virtuelno kolo, pošto se stanje konekcije u potpunosti čuva u krajnjim sistemima. Protokol TCP se izvršava samo u krajnjim sistemima ali ne i na usputnim delovima mreže kao što su ruteri i mostovi, na primer. Takođe, ti usputni elementi ne održavaju stanje TCP konekcije. U suštini, usputni ruteri nisu svesni postojanja TCP konekcije jer vide samo datagrame. TCP konekcija obezbeđuje transfer podataka u punom dupleksu. To znači sledeće: ako postoji TCP konekcija između dva procesa na različitim računarima, podaci iz aplikacionog sloja mogu da teku istovremeno u oba smera – od A ka B i suprotno.


TCP konekcija je uvek point-to-point (od tačke do tačke), tj. između pojedinačnog pošiljaoca i pojedinačnog primaoca. Nije moguće “višeznačno rutiranje”, odnosno slanje podataka od jednog pošiljaoca do više primalaca. Uzećemo za primer da proces koji se izvršava na jednom računaru želi da uspostavi konekciju sa procesom koji se izvršava na drugom računaru. Proces koji započinje konekciju naziva se klijent a proces koji odgovara naziva se server. Klijentski aplikacioni proces prvo obaveštava klijentski transportni sloj da želi da uspostavi konekciju sa procesom na serveru. Nakon toga, transportni sloj u klijentu prelazi na proces uspostavljanja TCP konekcije sa TCP-om na serveru. Klijent prvo šalje poseban TCP segment, server odgovara drugim posebnim TCP segmentom i na kraju klijent opet šalje poseban TCP segment. Prva dva segmenta ne sadrže nikakve “korisne podatke”, tačnije nikakve podatke aplikacijskog sloja. Treći segment već može da sadrži takve podatke. S obzirom da se odvija u tri koraka, ovaj postupak uspostavljanja konekcije se često naziva sinhronizovanjem u tri koraka (“3 way handshake”, popularniji naziv na engleskom jeziku). Na sledećoj slici možemo videti izgled sinhronizacije u tri koraka.


Klijentski proces šalje tok podataka kroz soket (engl. socket, vrata procesa). Nakon prolaska podataka kroz soket, oni se nalaze u rukama TCP-a koji se izvršava na klijentu. TCP usmerava ove podatke u otpremnu privremenu memoriju te konekcije, a ta memorija se rezerviše tokom početnog sinhronizovanja u tri koraka. S vremena na vreme, TCP zahteva delove podataka iz otpremne memorije, za šta čak ni u TCP specifikaciji ne postoje tačni podaci. Kaže se da TCP treba da “šalje podatke u segmentima prema sopstvenom nahođenju”. MSS (Maximum Segment Size) je maksimalna količina podataka koja može da se stavi u jedan segment i zavisi od implementacije TCP-a na određenom operativnom sistemu a može se i manuelno konfigurisati. Treba uočiti da je MSS maksimalna količina podataka aplikacionog sloja u segmentu, a ne i veličina segmenta u kom su uključena i zaglavlja.


TCP dopunjava svaki komad klijentskih podataka jednim TCP zaglavljem i tako pravi TCP segmente. Segmenti se predaju naniže mrežnom sloju gde se pojedinačno enkapsuliraju u IP datagrame mrežnog sloja, a zatim se IP datagrami šalju u mrežu. Iz ovoga vidimo da se TCP konekcija sastoji od privremene memorije, promenljivih i soketa konekcije za proces. Pri završetku slanja podataka, server šalje poruku sa podešenim kontrolnim bitom FIN=1 (engl. FINish). Veza od servera ka klijentu se prekida time što klijent na slanje ovakve poruke odgovara sa porukom sa podešenim kontrolnim bitom ACK=1 (potvrda o prijemu). Ukoliko i klijent želi zatvoriti konekciju on isto tako šalje poruku sa podešenim bitom FIN=1. Konačno obostrano prekidanjr veze se potvrđuje od strane servera koji odgovara sa porukom u čijem je zaglavlju podešen bit ACK=1.



Struktura TCP segmenta

TCP segment sastoji se od više polja zaglavlja i jednog polja podataka. Polje podataka sadrži jedan komad aplikacijskih podataka. Kada TCP šalje neku veliku datoteku, kao što je recimo slika na web stranici, on obično deli datoteku na jednake delove veličine MSS-a (osim poslednjeg paketa, koji je obično manji od veličine MSS, jer se automatski popunjava do velićine fajla). Interaktivne aplikacije često prenose delove podataka koji su manji od MSS, kao na primer Telnet. Na sledećoj slici možemo videti strukturu TCP segmenta.


Zaglavlje sadrži broj izvornog porta (source port) i broj odredišnog porta (destination port), koji se koriste za multipleksiranje i demultipleksiranje podataka iz aplikacija gornjeg sloja i prema njima, a sadrži i polje kontrolnog zbira. Zaglavlje TCP segmenta sadrži i sledeća polja:

1. Polje rednog broja (Sequence number, 32 bits) i polje broja potvrde (Acknowledgement number, 32 bits) koje TCP pošiljalac i primalac koriste za implementiranje usluge pouzdanog transfera podataka.

2. Polje prijemnog prozora (Window size, 16 bits) koje se koristi za kontrolu toka.

3. Polje dužine zaglavlja (TCP header length, 4 bits) koje sadrži dužinu TCP zaglavlja u 32-bitnim rečima. Zaglavlje može biti promenljive dužine zbog polja TCP opcija (ukoliko je polje opcija prazno, što je čest slučaj, dužina zaglavlja je 20 bajtova).

4. Polje opcija (Options, 0 ili više 32-bitnih reči) je promenljive dužine koje se koristi prilikom pregovaranja pošiljaoca i primaoca o maksimalnoj dužini segmenta (MSS) ili kao faktor za podešavanje prozora koji se koristi u mrežama velike brzine.

5. Polje oznaka sadrži 6 bitova (URG, ACK, PSH, RST, SYN, FIN). Ukoliko je ACK bit postavljen, označava da je vrednost broja potvrde važeća i da je u pitanju segment potvrde. RST, SYN i FIN se koriste prilikom uspostavljanja i prekidanja konekcije. Ukoliko je bit PSH postavljen, primalac bi trebao istog trenutka da podeli podatke gornjem sloju. URG (urgent) se koristi da bi se označilo da ima podataka koje je gornji sloj na strani pošiljaoca označio kao hitne. Lokacija poslednjeg bajta ovih poruka je određena 16-bitnim poljem pokazivača hitnih podataka (urgent pointer).

Dva najvažnija polja u zaglavlju TCP segmenta su redni broj i broj potvrde i ta polja predstavljaju bitan deo usluge pouzdanog transfera podataka. TCP posmatra podatke kao nestrukturisan ali uređen tok bajtova. Tako i koristi redne brojeve pa se oni odnose na tok prenetih bajtova a ne na niz prenetih segmenata. Iz toga zaključujemo da je redni broj segmenta u stvari redni broj prvog bajta u segmentu unutar toka bajtova.


PRIMER: proces u hostu A šalje niz podataka procesu u hostu B, npr. 500.000 byte. Host A će implicitno numerisati svaki byte. Ako je max veličina segmenta 1000 byte, biće 500 segmenata • Ako je brvi bajt numerisan sa 0, prvi segment dobija redni broj 0, drugi 1000, treći 2000 itd. • Ack polje sadrži redni broj bajta koji se sledeći očekuje da se primi (npr. ako je host primio sve bajtove od 0 do 999, ack će sadržati 1000


Procena vremena povratnog puta i tajm-aut

TCP za oporavak od izgubljenih segmenata koristi mehanizam tajm-aut/ponovljeno stanje. Iako je sama koncepcija ovog mehanizma vrlo jednostavna, prilikom implementiranja u protokolu dolazi do mnogih pitanja. Najočiglednije je pitanje dužine intervala za tajm-aut. Jasno je da tajm-aut mora biti veći od vremena povratnog puta konekcije (RTT), tj. Vremena od kad se segment pošalje dok ne stigne njegova potvrda. U suprotnom bi dolazilo do nepotrebnih ponavljanja.


Procena vremena povratnog puta

Ono što bi trebali da znamo da bismo mogli da razumemo upravljanje TCP tajmerom je kako TCP procenjuje vreme povratnog puta između pošiljaoca i primaoca. Uzorak vremena povratnog puta RTT za jedan segment naziva se SampleRTT i predstavlja trajanje od trenutka slanja segmenta do prijema potvrde tog segmenta. Uglavnom se ne meri za svaki preneti segment i u svakom trenutku se pravi samo po jedan uzorak SampleRTT, tako da se dobija po jedna nova vrednost približno jedanput tokom svakog pojedinačnog povratnog puta. Takođe, nikada se ne izračunava SampleRTT za segment koji se šalje ponovo. Ono što se odmah zaključuje je da će se vrednost SampleRTT menjati od segmenta do segmenta, što zavisi od zagušenja na ruterima i od opterećenja krajnjih sistema. Da bi se procenio tipični RTT uzima se prosek dobijen od više vrednosti SampleRTT. TCP stalno izračunava taj prosek koji se naziva EstimatedRTT i ažurira ga svaki put kada dobije novi SampleRTT po sledećoj formuli:


EstimatedRTT = (1- a)*EstimatedRTT + a*SampleRTT


Vidimo da je nova vrednost EstimatedRTT jednaka zbiru prethodne vrednosti EstimatedRTT i nove vrednosti SampleRTT. Prema dokumenti RFC 2988, preporučena vrednost promenljive alfa je 0,125 pa se gornja formula može napisati na sledeći način:

EstimatedRTT = 0,875*EstimatedRTT + 0,125*SampleRTT


Osim procene trajanja povratnog puta RTT, važno je imati i kvantitativnu meru varijacije RTT-a. Već pomenuti dokument [RFC 2988] definiše varijaciju vremena povratnog puta, DevRTT, kao procenu standardne devijacije SampleRTT od EstimatedRTT.

DevRTT = (1-b)*DevRTT + b*|SampleRTT-EstimatedRTT|


Vidimo da je DevRTT eksponencijalno ponderisan klizni prosek razlike između vrednosti SampleRTT i EstimatedRTT. Preporučena vrednost za b je 0,25.
Nakon što smo izračunali vrednosti EstimatedRTT i DevRTT, sada ćemo videti koju bi vrednost trebalo uzeti kao TCP-ov interval za tajm-aut. Jasno je da bi taj interval trebao da bude veći ili jednak parametrima EstimatedRTT, ali ne bi smeo ni da bude mnogo veći jer TCP ne bi dovoljno brzo ponovo slao segment u slučaju gubitka, čime bi se u aplikaciji značajno povećalo kašnjenje usled gubitka podataka. Stoga, zaključujemo da interval za tajm-aut treba da bude jednak EstimatedRTT plus neka rezerva. Rezerva bi trebalo da bude velika ukoliko vrednosti SampleRTT mnogo variraju, a mala u slučaju male varijacije. Vidimo da će nam za ovo koristiti parametri DevRTT koji smo prethodno izračunali. Konačno, dobija se interval tajm-auta za ponovno slanje po sledećoj formuli:


TimeoutInterval = EstimatedRTT + 4*DevRTT


Postoje tri glavna događaja u vezi sa inicijalnim i ponovnim slanjem podataka:

1. Stizanje podataka odozgo od aplikacije
Nakon nastupanja prvog glavnog događaja, TCP prima podatke od aplikacije, enkapsulira ih u segment i predaje segment IP-u. Primećujemo da svaki segment sadrži redni broj, kao što je ranije objašnjeno. Takođe, vidimo da TCP pokreće tajmer (ukoliko već nije uključen) kada preda segment u IP i nakon toga setuje redni broj sledećeg segmenta, dodajući na postojeći redni broj dužinu segmenta. Interval ovog tajmera je TimeoutInterval, čija je vrednost izračunata na osnovu vrednosti parametara EstimatedRTT i DevRTT, po formuli u odeljku 4.

2. Tajm-aut
Drugi glavni događaj je tajm-aut, na koji TCP reaguje tako što ponovo šalje segment koji ga je izazvao i zatim ponovo pokreće tajmer, kao što se i može videti na slici.

3. Stizanje ACK-a
Treći važan događaj koji TCP pošiljalac mora da obezbedi je pristizanje segmenata potvrde (ACK) od primaoca (ovo je segment koji čija je vrednost 1 u ACK polju, odnosno setovan je). Kada nastupi ovaj događaj, TCP poredi ACK vrednost y sa svojom promenljivom SendBase (SendBase predstavlja redni broj najstarijeg nepotvrđenog bajta, pa je stoga SendBase-1 poslednji bajt kod primaoca za koji se zna da je primljen pravilno). Znamo da TCP koristi kumulativne potvrde pa tako y potvrđuje prijem svih bajtova pre bajta broj y. Ako je y > SendBase, taj ACK potvrđuje samo jedan ili više prethodno nepotvrđenih segmenata i tako se ažurira promenljiva SendBase. Na kraju, ponovo se pokreće tajmer ukoliko ima još nekih nepotvrđenih segmenata.

Kontrola toka

Da bi se eliminisala mogućnost da pošiljalac preplavi primaočevu privremenu memoriju, TCP svojim aplikacijama obezbeđuje mogućnost kontrole toka. Kontrola toka je u stvari usluga usklađivanja brzine – usklađuje brzinu kojom pošiljalac šalje sa brzinom kojom aplikacija čita. TCP pošiljalac može se usporiti i zbog zagušenja unutar IP mreže i ta vrsta kontrole naziva se kontrola zagušenja. Cilj kontrole zagušenja je održavanje opterećenja mreže ispod kapaciteta mreže, tj. regulacija broja paketa u mreži ispod nivoa pri kome performanse mreže počinju naglo da padaju. TCP omogućava kontrolu toka tako što se kod pošiljaoca održava promenljiva zvana prijemni prozor. Ta promenljiva služi da pošiljalac može da nasluti koliko ima mesta u privremenoj memoriji primaoca.
Tokom života TCP konekcije, protokol TCP koji se izvršava na svakom računaru, prolazi kroz različita TCP stanja. Na slicici se vidi uobičajen niz stanja kroz koje prolazi TCP klijent. Početno stanje je Closed, zatim kada pošalje segment SYN prelazi u stanje SYN_SENT. Pošto primi segment ACK od servera, prelazi u stanje ESTABLISHED i tada šalje i prima segmente koji sadrže korisne podatke. Ukoliko želi da zatvori konekciju, šalje segment FIN i prelazi u stanje FIN_WAIT_1 i očekuje od servera potvrdu. Nakon primanja potvrde, ulazi u stanje FIN_WAIT_2 i čeka na segment od servera u kom je FIN bit jednak jedinici. Nakon primljenog FIN segmenta od servera, prelazi u stanje TIME_WAIT, koje zavisi od implementacije. Nakon toga, konekcija je i zvanično zatvorena.




O TCP-u bi verovatno moglo još dosta da se priča, ovo je veći deo mog seminarskog. Uskoro možda i nastavak. Do sledećeg čitanja, pozdrav!