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
● 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