Wednesday, March 26, 2014

PROTOKOL UDP


Protokol Transport (TCP/UDP)
TipeTransfer Data
komunikasilogika pada lapisan Transport dapat berbentuk :
● connectionlessatau connection-oriented.
● Reliableatau unreliable: Reliableberartidataditransfer ke tujuannya
dalamsuatu urutan sepertiketikadikirim.Pengirimandata Unreliable
sangat menggantungkan diripada lapisanjaringandi bawahnya, sehingga
tidakdapatmenyakinkanapaah segment data dapatdikirimkansampai
ditujuannyaatautidak.
● Statefulatau stateless.Pengirimandata statefulberarti informasiyang
dimasukkanpada satu request, yang dikirimkandari pengirim ke
penerima,dapat dimodifikasiuntuk requestberikutnya. Sedangkan
pengirimanstatelessberartiinformasidalamsaturequest tidakdapat
dikaitkandengan request lainnya, sehinggatidakdapatdigunakan untuk
request lainnya.
Fungsi
● menyediakankomunikasilogika
antarproses aplikasiyang
berjalanpada host yang
berbeda
● protokoltransport berjalanpada
end systems
● PerbedaandenganLapisan
Network:
• lapisan network : transfer
data antar end-system
• lapisan transport: transfer
data antar proses
● Layanan transport pada
Internet :
• reliable,pengirimandalam
suatu urutandengan model unicast.Contoh:TCP
• unreliable, pengiriman tidakdalamsuatuurutan denganmodel  unicast
atau multicast. Contoh : UDP
● Pada layanan transport, satuan data yangdipertukarkan disebutsebagai
segment(TPDU = Transprot ProtocolDataUnit)
● Layanan transport menyediakan demultiplexinguntukdapat
mengirimkansegment ke proses lapisanaplikasiyang sesuaiberdasar
alamatdan port prosestersebut.
● Selainitujugamelakukanmultiplexing,yangakan mengambildata dari
beberapa prosesaplikasi,dan membungkus data dengan header.
● Multiplexingdan Demultiplexingdidasarkan pada pengirimdan nomor
port serta alamatIPpenerima.
• Terdapatnomor port sumberdan tujuanpadatiapsegment.
Untuk alamatproses, yaitu port, berdasar standarisasidari IANA, dapat
dikelompokkanmenjadi 3, yaitu
• Well-knownport,yaitu0 -1023
• Registered port, yaitu 1024 - 49151
• Dynamic/Privateport, 49152 -65535
Silahkan Anda mencaricontoh untuk masing-masing kategoritersebut!
UDP (User Datagram Protocol)
● Mengapaada UDP?
Tidakperlu adanyasetup koneksi terlebih dahulu (halini dapat
menyebabkan tambahan delay)
sederhana, artinyaantara penerimadan pengirimtidak perlu
menjaga sessionataustatus koneksi
ukuran header segmentsederhana
tidakperlu kontrolkemacetankoneksi, artinyaUDPdapat
mengirimkanpersegment tanpa dipengaruhiolehkesibukan jaringan
● Didefinisikandengan RFC768
● Menerapkan layanan connectionless:
• tidakada handshaking antarapengirim UDP dan penerimanya
• setiap segment UDP ditanganisecara independendengan segment
UDP lainnya
● Kelemahan:
• segment UDP mungkinakan hilang
• paket diterimamungkindalamkeadaan yangtidak urut. Jikapaket yang
diterima tidakurut, paket akandibuang.
● tidakada kontrolkemacetan koneksi(congestioncontrol), artinyaUDP
dapat mengirimkanper segment tanpa dipengaruhiolehkesibukan
jaringan.Secara prinsiplapisantransport harus memberikan congestion
controliniselamatransmisiterjadi.Congestiondapat terjadikarena terlalu
banyakpaket data pada jaringansehinggamembuat unjukkerja jaringan
menjadimenurun. Halinidapatdisebabkan,misalnyakarena adanya
router terlalupenuhbuffernyasehinggamemperlambat.
Checksum UDP
● Untuk membantupengecekankondisipaket segment UDP yangditerima,
pada header UDPterdapat field checksum(16 bit). Checksum dihitung
dariPseudo-header yangdidalamnyaterdapat alamatIP sumber dan
tujuan,plusfieldprotocoldariheaderIP. (untuk calculatorchecksumIpv4
silahkanberkunjungke http://byerley.cs.waikato.ac.nz/~tonym/hec.html)
● Silahkankunjungi: http://www.netfor2.com/udpsum.htm
● Berikutadalahskema untuk pseudo-header :
● Pseudocode untuk penghitunganchecksum UDP dariPseudo-header :
typedef usingend short u16;
typedef unsigned long u32;
u16 short udp_sum_calc(
u16 len_udp,
u16 src_addr[],u16 dest_addr[],
BOOL padding, u16 buff[])
{
u16 prot_udp=17;
u16 padd=0;
u16 word16;
u32 sum;
// Find out if the length of data is even or odd number.
// If odd,
// add a padding byte = 0 at the end of packet
if (padding&1==1){
padd=1;
buff[len_udp]=0;
}
//initialize sum to zero
sum=0;
// make 16 bit words out of every two adjacent 8 bit words
// and calculate the sum of all 16 vit words
for (i=0;i<len_udp+padd;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
sum = sum + (unsigned long)word16;
}
// add the UDP pseudo header which contains
//the IP source and destinationn addresses
for (i=0;i<4;i=i+2){
word16 =((src_addr[i]<<8)&0xFF00)+
(src_addr[i+1]&0xFF);
sum=sum+word16;
}
for (i=0;i<4;i=i+2){
word16 =((dest_addr[i]<<8)&0xFF00)+
(dest_addr[i+1]&0xFF);
sum=sum+word16;
}
// the protocol number and the length of the UDP packet
sum = sum + prot_udp + len_udp;
// keep only the last 16 bits of the 32 bit calculated
//sum and add the carries
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
// Take the one's complement of sum
sum = ~sum;
return ((u16) sum);
}
Parameter untuk fungsi diatas :
u16 buff[]  arrayheader dan dataUDP
u16 len_udp  panjang dari header+dataUDP
BOOL  1 jikamemilikibilangan oktagenap dan 0 jikaganjil
u16 src_addr[4]
u16 dest_addr[4]  alamatIP sumber dan tujuan
       Sebagaicontoh :
• A mengirim segment UDPdengan jumlah 16 bit pseudo-header adalah
1100101011001010.
Maka checksumnyaadalah
0011010100110101
• B menerimadata dariA, menghitung jumlah 16-bit dan
menambahkannya dengannilaifieldchecksum. Jika jumlahnya adalah
1111111111111111, maka tidakada error.
Aplikasi UDP
● Digunakan untuk multimedia streaming,yangsangat memberikan
toleransikehilangansegmentcukup baikdan yangsangat tidaksensitif
terhadap kerusakan atau kehilangansegment
● Contohprotokolaplikasiyangmenggunakan UDP:
• DNS (Domain NameSystem) 53
• SNMP,(Simple Network Management Protocol)  161,162
• TFTP (Trivial File TransferProtocol) 69
• SunRPC port 111.
• dsb. (tolong sebutkancontoh lain!Wajib untuk diketahui! )
● Untuk membuatpengirimanyangreliabledengan protokolUDP, maka
padalapisanprotokol aplikasinya harus menyediakanpenanganan
kesalahantersendiri.
Berikutadalah contoh aplikasi client/serverdengan menggunakan protokol
UDP :
UDPClient.java
import java.net.*;
import java.io.*;
import java.util.*;
public class UDPClient {
public static void main (String args[ ]) {
try{
// buat socket UDP untuk port 2000
DatagramSocket socket = new DatagramSocket(2000);
// buat paket UDP yang berisi buffer 256 byte
DatagramPacket packet =
new DatagramPacket( new byte[256], 256 );
// terima paket – ini adalah operasi terblok
socket.receive(packet);
// tampilkan informasi paket
InetAddress remote_addr = packet.getAddress();
System.out.println ("Pengirim : " +
remote_addr.getHostAddress( ) );
System.out.println ("dari Port: " + packet.getPort());
// tampilkan isi paket
ByteArrayInputStream bin =
new ByteArrayInputStream(packet.getData());
for (int i=0; i < packet.getLength(); i++) {
int data = bin.read();
if (data == -1)
break;
else
System.out.print ( (char) data) ;
}
socket.close( );
}
catch (IOException e) {
System.out.println ("Error - " + e);
}
} //akhir dari main()
} //akhir dari class
UDPServer.java
import java.net.*;
import java.io.*;
import java.util.*;
public class UDPServer {
public static void main (String args[ ]) {
String hostname="localhost";
String message = "Hallo UDP!";
try {
// buat socket UDP, dan cari port yang tersedia
DatagramSocket socket = new DatagramSocket();
System.out.println ("Local port: " +
socket.getLocalPort());
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
//konversi printstream ke array byte
byte [ ] bArray = bOut.toByteArray();
// buat paket datagram dengan ukuran buffer 256 byte
DatagramPacket packet =
new DatagramPacket( bArray, bArray.length );
//buat objek dari class InetAddress
InetAddress remote_addr = InetAddress.getByName(hostname);
//cek alamat IP dari hostname
System.out.println("Hostname has IP address = " +
remote_addr.getHostAddress());
//konfigurasi DataGramPacket
packet.setAddress(remote_addr);
packet.setPort(2000);
//kirim paket UDP
socket.send(packet);
// tampilkan informasi paket
System.out.println ("Dikirim oleh : " +
remote_addr.getHostAddress() );
System.out.println ("Dikirim dari : " + packet.getPort());
}
catch (UnknownHostException ue){
System.out.println("Unknown host "+hostname);
}
catch (IOException e) {
System.out.println ("Error - " + e);
}
}//akhir dari main
}//akhir dari class
Anda dapatmenggunakan berbagai macam program IP Sniffer atau
sejenisnya untuk menangkap lalulintas paket data yang melalui interface
jaringan Anda, sepertiyangsaya gunakan di bawah ini, yaitu menggunakan
programIP Sniffer versi 1.47 yang dibuat olehErwan L (erwal.l@free.fr).
Contoh aplikasi lain yangsudah lama menjaditoolbaku dilingkungan
Unix/Linux adalahTCPdump yangkemudiandigunakan padaprogram
EtherealyangmerupakanUserInterface dariTCPdump tersebut. Berikut
contoh snapshoot nya :
TCP (Transmission Control Protocol)
● Didefinisikandengan RFC:793, 1122, 1323, 2018, 2581
● BerikutbeberapakarakteristikTCP :
• point-to-point
• reliabledan stateful
• pipeline,menerapkan flow control windowsliding untukmengontrol
kemacetan dan aliran datanya
• terdapatbuffer pengirimdan penerima
• full-duplex
• connection-oriented
• aliran data yang dikontrol
Struktur paket segment TCPlebih komplekdaripada UDP :
Pada header TCPtersebut terlihatbahwaTCP menerapkan flowcontrol
sliding window,yaitu pada rcvrwindows size,yangberisijumlahbuffer
(byte)penerima. Berdasar
informasifieldtersebut,
pengirimakan selalu
mempertahankan untuk
tidak mengirim data
dengan ukuranyang
melebihi ukuran yang
tersebut pada field rcvr
windows sizetersebut.
Oleh karena TCPmenerapkan modelkoneksiconnection oriented, maka
ketika setup data sudah terbentuk, antara pengirim danpenerimadapat
saling mempertukarkan data secarafullduplex dengan tetap menjaga
sessionkoneksidiantara penerimadan pengirim(stateful). Untukdapat
melaksanakanmekanisme tersebut, di samping ini adalahcontoh,
bagaimana mekanisme three-way
handshake terjadi pada TCP
dengan menggunakan field
sequencenumberdan
acknowledge number:
Manajemen Koneksi TCP
Pada saat Setup Koneksi
1. clientmengirimkankontrolTCP
SYNke server, dengan
memberikan sequence number
inisial
2. servermenerimaTCP SYN,dan
membalasnyadengan kontrolSYNACK
• ACK yangmenyatakan telahmenerima SYN
• mengalokasikan buffer
• menghasilkansequencenumber untuk ke client
Pada saat Menutup Koneksi
1. clientmengirimkontrolTCP FINke
server
2. servermenerimaFIN, dan membalas
dengan ACK. Menutup koneksidan
mengirimkanFIN keclient.
3. ClientmenerimaFIN dan membalas
ACK
• masukpada masa menunggu
balasanACK terhadapdari server
4. Server menerimaACK dankoneksi
tertutup.
Berikutcontoh sniffing paket TCPdengan menggunakan program IPSniffer
yang sama untuk menangkap paket UDP :
TCP Client LifeCycle
TCP ServerLifecycle
Berikutadalah contoh aplikasi client/serverdengan memanfaatkan protokol
TCP :
TCPServer.java
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPServer {
private final int INFO_PORT=50000;
private String datafromClient;
public TCPServer() {
BufferedReader inFromClient;
DataOutputStream outToClient;
Socket serverSocket;
try {
ServerSocket infoServer = new ServerSocket(INFO_PORT);
while (true) {
serverSocket = infoServer.accept();
System.out.println("Ada client yang terkoneksi!");
inFromClient = new BufferedReader(
new InputStreamReader(serverSocket.getInputStream()));
outToClient = new DataOutputStream(
serverSocket.getOutputStream());
boolean isQUIT = false;
while (!isQUIT) {
datafromClient = inFromClient.readLine();
if (datafromClient.startsWith("QUIT"))
isQUIT = true;
else
outToClient.writeBytes(
datafromClient.replaceAll(" ", ":") + "\n");
}
outToClient.close();
inFromClient.close();
serverSocket.close();
System.out.println("Koneksi client tertutup..");
}
}
catch (IOException ioe){System.out.print("error: " + ioe);}
catch (Exception e) {System.out.print("error: " + e);}
}
/* program utama */
public static void main(String[] args) {
new TCPServer();
}
}
TCPClient.java
import java.net.*;
import java.io.*;
import java.util.*;
public class TCPClient {
private final int INFO_PORT=50000;
private final String TargetHost = "localhost";
public TCPClient() {
try {
BufferedReader inFromUser = new BufferedReader(
new InputStreamReader(System.in));
Socket clientSocket = new Socket(TargetHost, INFO_PORT);
DataOutputStream outToServer = new DataOutputStream(
clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
new InputStreamReader( clientSocket.getInputStream()));
boolean isQuit = false;
while (!isQuit) {
System.out.print("Perintah Anda : ");
String cmd = inFromUser.readLine();
cmd = cmd.toUpperCase();
if (cmd.equals("QUIT")) isQuit = true;
outToServer.writeBytes(cmd + "\n");
String result = inFromServer.readLine();
System.out.println("Dari Server: " + result);
}
outToServer.close();
inFromServer.close();
clientSocket.close();
}
catch(IOException ioe){System.out.println("Error:" + ioe);}
catch (Exception e) {System.out.println("Error:" + e);}
}
/* program utama */
public static void main(String[] args) {
new TCPClient();
}
}

0 comments:

Post a Comment

 
Design by http://4-jie.blogspot.com/ | Bloggerized by Fajri Alhadi