p dan menerima respon. Ping merupakan singkat an

dari Packet InterNet Groper.

Ping menggunakan pesan ICMP echo dan echo reply. 

Ping dapat juga digunakan untuk memastikan installasi IP address di suatu host. Langkah-

langkah yang dapat dilakukan yaitu :

 Ping loopback : test terhadap software TCP/IP

 Ping IP alamatku : test perangkat jaringan di host tersebut

 Ping alamat IP suatu host lain : test apakah jalur sudah benar

 Ping nama dari suatu host : test apakah sistem DNS sudah berjalan.

5.1.2.2 TRACEROUTE

Aplikasi traceroute melacak jalur mana saja yang dilalui untuk menuju ke suatu host tujuan. 

Cara kerja traceroute dengan mengirimkan pesan dengan TTL = 1. Dimana apabila sudah

mencapai suatu target jumlah TTL akan menjadi 0, dan ini akan memberikan pesan ke

pengirim dengan pesan time exceeded, sehingga host akan mengirimkan lagi pesan ICMP

dengan nilai TTL diperbesar. Proses ini dilakukan terus hingga mencapai host yang dituju.

5.2 Internet Group Management Protocol (IGMP)

IGMP digunakan untuk mengecek apakah suatu host dapat bergabung dengan IP Multicast.

Protokol IGMP memberikan fasilitas kepada router untuk melakukan cek kepada host yang

tertarik untuk menggunakan sistem multicast.

Spesifikasi IGMP dapat dilihat pada RFC 1112 dengan update pada RFC 2236.

5.3 Address Resolution Protocol (ARP)

Protokol ARP digunakan untuk merubah protokol pengalamatan pada layer yang lebih atas

(IP Address) menjadi alamat fisik jaringan.

Spesifikasi ARP dapat dilihat di RFC 826.

58

Gambar  5.68 Cara kerja protokol ARP

Cara kerja protokol ARP :

Host Y melakukan broadcast dengan mengirimkan pesan ARP Request, apabila host yang

dituju berada dalam satu jaringan maka host tersebut akan mengirimkan pesat ARP Reply

yang berisikan informasi MAC.

Bila host yang dituju berada dalam jaringan yang berbeda maka yang akan mengirimkan ARP

Reply adalah Router yang memisahkan jaringan tersebut.

5.4 Reverse Address Resolution Protocol (RARP)

Protokol RARP digunakan untuk merubah protokol pengalatan pada layer yang lebih rendah

(Alamat MAC) menjadi alamat IP.

5.5 Bootstrap Protocol (BOOTP)

Bootstrap Protocol (BOOTP) dapat membuat sebuah client / workstation untuk melakukan

initialisasi (proses booting pada komputer) dengan IP Stack yang minimal sehingga

mendapatkan IP Address, alamat Gateway, dan alamat Name server dari sebuah BOOTP

server.

BOOTP spesifikasi bisa dilihat di RFC 951 – bootstrap protocol.

Proses BOOTP antara lain :

1. Client mendeteksi alamat fisik jaringan pada sistemnya sendiri, biasanya berada di

ROM pada interface.

2. BOOTP celint mengirimkan informasi alamat fisik jaringannya ke server dengan

menggunakan protokol UDP pada port 67. 

3. Server menerima pesan dari client dan mencatat informasi alamat fisik client,

kemudian membandingkan dengan data yang ada diserver. Apabila data yang dicari

ada maka server akan memberikan IP address kepada client melalui port 68 protokol

UDP.

4. Ketika client menerima reply dari server, client akan mencatat record alamat IP

kemudian melakukan proses bootstrap.

59

5.6 Dynamic Host Configuration Protocol (DHCP)

DHCP memberikan framework untuk disampaikan kepada client yang berisikan informasi

tentang konfigurasi jaringan. DHCP bekerja berdasarkan protokol BOOTP, dimana

ditambahkan fungsi untuk mengalokasikan penggunaan IP address dan konfigurasi jaringan

lainnya.

Spesifikasi DHCP dapat dilihat pada RFC 2131 – Dynamic Host Configuration Protocol, dan

RFC 2132 – DHCP options and BOOTP vendor extension.

DHCP melakukan transaksi dengan melihat pada jenis pesan yang dikirimkan. Pesan-pesan

tersebut antara lain :

 DHCPDISCOVER : broadcast oleh client untuk menemukan server

 DHCPOFFER : respon dari server karena menerima DHCPDISCOVER dan

menawarkan IP address kepada client

 DHCPREQUEST : pesan dari client untuk mendapatkan informasi jaringan

 DHCPACK : acknowledge dari server

 DHCPNACK : negative acknowledge dari server yang menyatakan waktu sewa dari

client sudah kadaluwarsa

 DHCPDECLINE : pesan dari client yang menyatakan bahwa dia sedang

menggunakan informasi dari server

 DHCPRELEASE : pesan dari client bahwa client sudah tidak menggunakan lagi

informasi dari server

 DHCPINFORM : pesan dari client bahwa dia sudah menggunakan informasi jaringan

secara manual.

5.6.1 Proses alokasi alamat jaringan 

Bagian ini menjelaskan interaksi antara client dan server, dimana client tidak mengetahui

alamat IP nya. Di asumsikan DHCP server memiliki 1 blok alamat jaringan dimana dapat

digunakan pada jaringan tersebut. Setiap server memiliki sebuah database yang berisikan info

IP address dan sewa (leases) penggunaan jaringan pada suatu tempat penyimpanan yang

permanen.

Gambar  5.69 Interaksi DHCP client dan DHCP server

60

Berikut keterangan dari interaksi antara DHCP client dan DHCP server :

1. Client melakukan broadcast DHCPDISCOVER pada jaringan lokal. 

2. Server merespon dengan pesan DHCPOFFER, dimana informasi ini juga

memberikan informasi tentang IP address.

3. DHCP client menerima 1 atau lebih pesan DHCPOFFER dari 1 atau lebih DHCP

server. Client memilih salah satu informasi itu dan mengirimkan pesan

DHCPREQUEST dan informasi jaringan mana yang dipilih.

4. Server menerima pesan DHCPREQUEST tersebut dan membalas dengan

mengirimkan pesan DHCPACK dengan mengirimkan informasi lengkap.

5. Client menerima DHCPACK dan melakukan konfigurasi terhadap interface

jaringannya.

6. Apabila client sudah tidak menginginkan lagi alamat IP tersebut, client akan

mengirimkan pesan DHCPRELEASE.

61

6 Protokol Routing

Salah satu fungsi dari protokol IP adalah membentuk koneksi dari berbagai macam bentuk

interface yang berbeda. Sistem yang melakukan tugas tersebut disebut IP router. Tipe dari

perangkat ini terpasang dua atau lebih bentuk interface dan meneruskan datagram antar

jaringan.

Ketika mengirim data ke tujuan, suatu host akan melewati sebuah router terlebih dahulu.

Kemudian router akan meneruskan data tersebut hingga tujuannya. Data tersebut mengalir

dari router satu ke router yang lain hingga mencapai host tujuannya. Tiap router melakukan

pemilihan jalan untuk menuju ke hop berikutnya. 

Gambar  6.70 Operasi routing sebuah pada IP

Gambar   6 .70 menunjukkan sebuah jaringan dimana host C meneruskan paket data antara

jaringan X dan jaringan Y

Routing table pada tiap perangkat digunakan untuk meneruskan paket data pada jaringan tiap

segmen. 

Protocol routing mempunyai kemampuan untuk membangun informasi dalam routing table

secara dinamik. Apabila terjadi perubahan jaringan routing protokol mampu memperbaharui

informasi routing tersebut.

6.1 Autonomous System

Definisi dari Autonomous System (AS) merupakan bagian dari memahami Routing Protocol.

AS merupakan bagian logical dari Jaringan IP yang besar. AS biasanya dimiliki oleh sebuah

organisasi jaringan. AS di administrasi oleh sebuah managemen resmi. AS dapat

dikoneksikan dengan AS lainnya, baik public maupun private. Ilustrasi tentang AS dapat

dilihat pada Gambar   6 .71.

62

Gambar  6.71 Autonomous System

Beberapa routing protocol digunakan untuk menentukan jalur pada sistem AS. Yang lainnya

digunakan untuk interkoneksi pada suatu set autonoumous system, yaitu :

 Interior Gateway Protocol (IGP) : dengan IGP router dapat saling tukar informasi

routing antar AS. Contoh protokol ini antara lain Open Shortest Path First (OSPF)

dan Routing Information Protocol (RIP).

 External Gateway Protocol (EGP) : dengan EGP router dapat saling tukar hasil akhir

(summary) antar AS. Contoh protokol ini antara lain Border Gateway Protocol (BGP)

6.2 Tipe IP Routing dan Algoritma IP Routing

Algoritma routing digunakan untuk membangun dan mengatur table routing pada perangkat.

Terdapat 2 cara untuk membangun table routing, yaitu :

 Static Routing : routing ini dibangun berdasarkan definisi dari adminstrator.

 Dynamic Routing : algoritma ini dapat membuat perangkat router untuk dapat

menentukan jalur routingnya secara otomatis, dengan cara menjelajah jaringan

tersebut dan bertukar informari routing antar router. Terdapat 3 kategori tentang

algoritma dinamik, yaitu :

o Distance Vector

o Link State 

o Hybrid 

6.2.1 Static Routing

Routing static adalah entri suatu route yang dilakukan oleh seorang administrator untuk 

mengatur jalur dari sebuah paket data. Entri routing table bisa dilakukan dengan program 

yang terdapat pada perangkat tersebut.

63

6.2.2 Distance Vector Routing

Routing ini menggunakan algoritma Bellman-Ford. Dimana tiap router pada jaringan

memiliki informasi jalur mana yang terpendek untuk menghubungi segmen berikutnya.

Kemudian antar router akan saling mengirimkan informasi tersebut, dan akhirnya jalur yang

lebih pendek akan lebih sering dipilih untuk menjadi jalur menuju ke host tujuan.

Protokol yang menggunakan algoritma ini yaitu RIP.

6.2.3 Link State Routing

Routing ini menggunakan teknik link state, dimana artinya tiap router akan mengolek

informasi tentang interface, bandwidth, roundtrip dan sebagainya. Kemudian antar router

akan saling menukar informasi, nilai yang paling efisien yang akan diambil sebagai jalur dan

di entri ke dalam table routing. Informasi state yang ditukarkan disebut Link State

Advertisement (LSA). 

Dengan menggunakan algoritma pengambilan keputusan Shortest Path First (SPF), informasi

LSA tersebut akan diatur sedemikian rupa hingga membentu suatu jalur routing. Ilustrasi SPF

dapat dilihat pada Gambar   6 .72.

Gambar  6.72 Shortest Path First

Routing protokol yang menggunakan algoritma antara lain OSPF.

6.2.4 Hybrid Routing

Routing merupakan gabungan dari Distance Vector dan Link State routing. Contoh

penggunaan algoritma ini adalah EIGRP.

6.3 Routing Information Protocol (RIP)

Routing protokol yang menggunakan algoritma distance vector, yaitu algortima Bellman-

Ford. Pertama kali dikenalkan pada tahun 1969 dan merupakan algoritma routing yang

pertama pada ARPANET.

64

Versi awal dari routing protokol ini dibuat oleh Xerox Parc’s PARC Universal Packet

Internetworking dengan nama Gateway Internet Protocol. Kemudian diganti nama menjadi

Router Information Protocol (RIP) yang merupakan bagian Xerox network Services.

Versi dari RIP yang mendukung teknologi IP dimasukkan dalam BSD system sebagai routed

daemon.

Spesifikasi RIP dapat dilihat di RFC 1058.

RIP yang merupakan routing protokol dengan algoritma distance vector, yang menghitung

jumlah hop (count hop) sebagai routing metric. Jumlah maksimum dari hop yang

diperbolehkan adalah 15 hop. Tiap RIP router saling tukar informasi routing tiap 30 detik,

melalui UDP port 520. Untuk menghindari loop routing, digunakan teknik split horizon with

poison reverse. RIP merupakan routing protocol yang paling mudah untuk di konfigurasi.

RIP memiliki 3 versi yaitu RIPv1, RIPv2, RIPng

 RIPv1 didefinisikan pada RFC 1058, dimana menggunakan classful routing, tidak

menggunakan subnet. Tidak mendukung Variable Length Subnet Mask (VLSM).

 RIPv2 hadir sekitar tahun 1994, dengan memperbaiki kemampuan akan Classless

Inter-Domain Routing. Didefinisikan pada RFC 2453.

 RIPng merupakan protokol RIP untuk IPv6. Didefinisikan pada RFC 2080.

6.4 Open Shortest Path First (OSPF)

OSPF merupakan routing protocol berbasis link state, termasuk dalam interior Gateway

Protocol (IGP). Menggunakan algoritma Dijkstra untuk menghitung shortest path first (SPF).

Menggunakan cost sebagai routing metric. Setelah antar router bertukar informasi maka akan

terbentuk database link state pada masing-masing router.

OSPF mungkin merupakan IGP yang paling banyak digunakan. Menggunakan metode MD5

untuk autentikasi antar router sebelum menerima Link-state Advertisement (LSA). Dari awak

OSPF sudah mendukung CIDR dan VLSM, berbeda dengan RIP. Bahkan untuk OSPFv3

sudah mendukung untuk IPv6.

Router dalam broadcast domain yang sama akan melakukan adjacencies untuk mendeteksi

satu sama lainnya. Pendeteksian dilakukan dengan mendengarkan “Hello Packet”. Hal ini

disebut 2 way state. Router OSPF mengirimkan “Hello Packet” dengan cara unicast dan

multicast. Alamat multicast 224.0.0.5 dan 224.0.0.6 digunakan OSPF, sehingga OSPF tidak

menggunakan TCP atau UDP melainkan IP protocol 89.

6.5 Enhanced Interior Gateway Routing Protocol (EIGRP)

EIGRP merupakan routing protocol yang dibuat CISCO. EIGRP termasuk routing protocol

dengan algoritma hybrid. 

EIGRP menggunakan beberapa terminologi, yaitu :

 Successor : istilah yang digunakan untuk jalur yang digunakan untuk meneruskan

paket data.

 Feasible Successor : istilah yang digunakan untuk jalur yang akan digunakan untuk

meneruskan data apabila successor mengalami kerusakan.

65

 Neighbor table : istilah yang digunakan untuk tabel yang berisi alamat dan interface

untuk mengakses ke router sebelah

 Topology table : istilah yang digunakan untuk tabel yang berisi semua tujuan dari

router sekitarnya.

 Reliable transport protocol : EIGRP dapat menjamin urutan pengiriman data.

Perangkat EIGRP bertukar informasi hello packet untuk memastikan daerah sekitar. Pada

bandwidth yang besar router saling bertukar informasi setiap 5 detik, dan 60 detik pada

bandwidth yang lebih rendah.

6.6 Border Gateway Protocol (BGP)

BGP adalah router untuk jaringan external. BGP digunakan untuk menghidari routing loop

pada jaringan internet. 

Standar BGP menggunakan RFC 1771 yang berisi tentang BGP versi 4.

6.6.1 Konsep dan terminologi BGP

Konsep dan terminologi dapat dilihat pada Gambar   6 .73.

Gambar  6.73 Komponen BGP

 BGP Speaker : Router yang mendukung BGP

 BGP Neighbor (pasangan) : Sepasang router BGP yang saling tukar informasi. Ada 2

jenis tipe tetangga (neighbor) :

o Internal (IBGP) neighbor : pasangan BGP yang menggunakan AS yang sama.

o External (EBGP) neighbor : pasangan BGP yang menggunakan AS yang

berbeda.

 BGP session : sesi dari 2 BGP yang sedang terkoneksi

 Tipe traffik :

o Lokal : trafik lokal ke AS

o Transit : semua trafik yang bukan lokal

66

 Tipe AS :

o Stub : bagian AS yang terkoneksi hanya 1 koneksi dengan AS.

o Multihomed : bagian ini terkoneksi dengan 2 atau lebih AS, tetapi tidak

meneruskan trafik transit.

o Transit : bagian ini terkoneksi dengan 2 atau lebih AS, dan meneruskan paket

lokal dan transit

 Nomer AS : 16 bit nomer yang unik

 AS path : jalur yang dilalui oleh routing dengan nomer AS

 Routing Policy : aturan yang harus dipatuhi tentang bagaimana meneruskan paket.

 Network Layer Reachability Information (NLRI) : digunakan untuk advertise router.

 Routes dan Path : entri tabel routing

6.6.2 Operasional BGP

BGP neighbor, peer, melakukan koneksi sesuai dengan konfigurasi manual pada perangkat

router dan membuat jalur TCP dengan port 179. BGP speaker akan mengirimkan 19 byte

pesan keepalive untuk menjaga konektivitas (dilakukan tiap 60 detik).

Pada waktu BGP berjalan pada dalam sistem AS, melakukan pengolahan informasi routing

IBGP hingga mencapai administrative distance 200. Ketika BGP berjalan diantara sistem AS,

maka akan melakukan pengolahan informasi routing EBGP hingga mencapai administrative

distance 20. BGP router yang mengolah trafik IBGP disebut transit router. Router yang

berada pada sisi luar dari sistem AS dan menggunakan EBGP akan saling tukar informasi

dengan router ISP.

Semakin bertambahnya jaringan akan mengakibatkan jumlah table routing yang semakin

banyak pada router BGP. Untuk mengatasi hal tersebut dapat dilakukan : route reflector (RFC

2796) dan Confederation (RFC 3065).

Router reflector akan mengurangi jumlah koneksi yang dibutuhkan AS. Dengan sebuah

router ( atau dua router untuk redundansi) dapat dijadikan sebagai router reflector (duplikasi

router), sehingga router yang lainnya dapat digunakan sebagai peer.

Confederation digunakan untuk jaringan AS dengan skala besar, dan dapat membuat jalan

potong sehingga internal routing pada AS akan mudah di manaj. Confederation dapat

dijalankan bersamaan dengan router reflector.

6.7 Proses Routing di sistem UNIX

Selain dengan menggunakan mesin Router. Routing protocol juga dapat dijalankan pada

sistem UNIX dengan bantuan beberapa aplikasi antara lain :

 RouteD : mendukung interior routing dengan mengimplementasikan RIP

 GateD : mendukung interior dan eksterior routing dengan mengimplementasikan

OSPF, RIPv2, BGP-4

 Quagga : mendukung interior dan ekterior routing dengan mengimplementasikan

OSPFv3, RIPv1, RIPv2, RIPng, BGP4

67

7 Transport Layer

Pada bab ini akan dijelaskan tentang fungsi dari 2 protokol penting pada layer transport, yaitu

:

 User Datagram Protocol (UDP)

 Transmission Control Protocol (TCP)

7.1 Port dan Socket

7.1.1 Port

Port digunakan untuk melakukan proses komunikasi dengan proses lain pada jaringan

TCP/IP. Port menggunakan nomer 16 bit, digunakan untuk komunikasi host-to-host. Tipe port

ada 2 macam yaitu :

 Well-known : port yang sudah dimiliki oleh server. Contoh : telnet menggunakan port

23. Well-known port memiliki range dari 1 hingga 1023. Port Well-known diatur oleh

Internet Assigned Number Authority (IANA) dan dapat digunakan oleh proses sistem

dengan user tertentu yang mendapatkan akses.

 Ephemeral : client tidak menggunakan port well-known karena untuk berkomunikasi

dengan server, mereka sudah melakukan perjanjian terlebih dahulu untuk

menggunakan port mana. Ephemeral port memiliki range dari 1023 hingga 65535. 

Untuk 1 nomer port tidak bisa digunakan oleh 2 aplikasi yang berbeda dalam waktu yang

bersamaan. 

7.1.2 Socket

Interface socket merupakan bagian dari Application Programming Interface (API) yang

digunakan untuk protokol komunikasi. 

Terminologi yang digunakan :

 Socket merupakan tipe spesial dari file handle, dimana digunakan oleh sistem operasi

untuk mengakses jaringan.

 Alamat soket adalah : <protocol, local address, local process> contoh : <tcp,

193.44.234.3, 12345>

 Pembicaraan (conversation) : link komunikasi antar 2 proses

 Asosiasi (Association)  : kejadian komunikasi antar 2 proses <protocol, local-address,

local-process, foreign-address, foreign-process>

o Contoh : <tcp, 193.44.234.4, 1500, 193.44.234.5, 21>

 Setengah Asosiasi (half-association) : < protocol, local-address, local-process> atau

<protocol, foreign-address, foreign-process>

 Half-association disebut juga transport address.

7.2 User Datagram Protocol (UDP)

UDP merupakan standar protokol dengan STD nomer 6. Spesifikasi UDP dapat dilihat pada

RFC 768 – User Datagram Protocol. 

68

UDP pada dasarnya adalah interface untuk aplikasi IP. Dimana UDP tidak memiliki fungis

reliabilitas data, flow control, dan error-recovery untuk komunikasi IP. UDP memiliki proses

seperti multiplexing/demultiplexing untuk mengirimkan datagram, dari port menuju IP

datagram. Karena itu UDP juga disebut sebagai connectionless-oriented protocol.

Gambar  7.74 Proses Demultiplexing berbasis port pada UDP

7.2.1 Format Datagram UDP

UDP datagram memiliki 16 byte seperti pada Gambar   7 .75.

Gambar  7.75 Format Datagram UDP

Dimana :

 Source Port : port yang digunakan untuk mengirimkan data.

 Destination Port : port yang digunakan untuk tujuan data.

 Length : panjang data paket keseluruhan

 Checksum : 16 bit komplemen-1 dari pseudo-ip-header yang merupakan error check 

dari paket data

Gambar  7.76 Pseudo IP Header – UDP

7.2.2 Aplikasi yang menggunakan UDP

Aplikasi yang menggunkan protokol UDP antara lain :

 Trivial File Transfer Protocol (TFTP)

 Domain Name System (DNS) name server

 Remote Procedure Call (RPC) pada Network File System (NFS)

 Simple Network Management Protocol (SNMP)

 Lighweight Directory Access Protocol (LDAP)

69

7.3 Transmission Control Protocol (TCP)

TCP merupakan standar protokol dengan STD nomer 7. Spesifikasi TCP dapat dilihat pada

RFC 793 – Transmission Control Protocol. 

TCP memberikan fasilitas untuk aplikasi dibandingkan UDP, karena TCP memberikan error

recovery, flow control, dan reliabilitas. TCP biasa disebut juga sebagai protokol berbasis

connection-oriented.

2 Proses komunikasi menggunakan koneksi TCP disebut InterProcess Communication (IPC).

IPC diilustrasikan seperti pada Gambar   7 .77.

Gambar  7.77 IPC

7.3.1 Format Segmen TCP

Format TCP dapat dilihat pada Gambar   7 .78.

Gambar  7.78 Format TCP

Dimana :

 Source Port : 16 bit nomer port. Digunakan untuk menerima reply

 Destination port : 16 bit nomer port tujuan

 Sequence Number : nomwer awal data pada segmen 

 Acknowledge number : apabila ACK diset maka ini menjadi nomer urut data yang 

akan diterima

70

 Data offset : nomer dimana bagian data mulai

 Reserved : untuk kegunaan masa depan, diset 0

 URG : mengaktifkan titik yang darurat pada suatu segmen

 ACK : kolom acknowledge

 PSH : fungsi push

 RST : mereset suatu koneksi

 SYN : untuk mensinkronisasi nomer urutan 

 FIN : batas akhir data

 Window : nomer window untuk proses windowing

 Checksum : nomer yang digunakan untuk mengecek validitas pengirim dan penerima

 Urgent Pointer : menunjuk pada titik yang darurat pada suatu segmen

 Options : digunakna untuk pilihan lain pada datagram

 Padding : digunakan untuk membulatkan data pada bagian options

7.3.2 Interface Pemrograman pada aplikasi TCP

Fungsi yang digunakan pada komunikasi TCP antara lain :

 Open : membuka koneksi dengan memasukkan beberapa parameter antara lain :

o Actif / Pasif

o Informasi soket tujuan 

o Nomer port lokal  

o Nilai timeout

 Send : mengirimkan buffer data ke tujuan

 Receive : Menerima dan mengcopy data kepada buffer milik pengguna

 Close : menutup koneksi

 Status : melihat informasi

 Abort : membatalkan semua kegiatan send atau receive

7.3.3 Aplikasi yang menggunakan TCP

Hampir keseluruhan aplikasi jaringan menggunakan TCP, standar aplikasi yang

menggunakan TCP antara lain :

 Telnet

 File Transfer Protocol (FTP)

 Simple Mail Transfer Protocol (SMTP)

 Hyper-Text Transfer Protocol (HTTP)

71

8 Struktur dan Pemrograman untuk Layer Aplikasi

Layer tertinggi adalah layer aplikasi. Layer ini saling berkomunikasi antar host dan

merupakan interface yang tampak oleh user pada protokol TCP/IP

8.1 Karakteristik dari Aplikasi

Pada layer aplikasi terdapat beberapa karakterisik yang sama yaitu :

 Merupakan aplikasi yang ditulis oleh user (user-written) atau aplikasi sudah

merupakan standar dengan didalamnya sudah terdapat produk TCP/IP. Aplikasi

TCP/IP set yang terdapat antara lain :

o TELNET, digunakan untuk mengakses remote host melalui terminal yang

interaktif

o FTP (File Transfer Protocol) digunakan untuk transfer file antar disk

o SMTP (Simple Mail Transfer Protocol) digunakan sebagai sistem surat di

internet

 Menggunakan sistem transpor UDP atau TCP

 Menggunakan model client-server

8.2 Pemrograman dengan Socket API 

Application Programming Interface (API) dapat digunakan oleh user untuk dapat membuat

suatu aplikasi. Sedangkan untuk fasilitas jaringannya dapat menggunakan API bagian

SOCKET. Dalam bagian ini akan dijelaskan contoh API yang digunakan untuk jaringan.

Pada bab ini dijelaskan bagaimana menggunakan bahasa pemrograman C untuk kepentingan

jaringan pada mesin linux.

Contoh kompilasi dan menjalankan program :

# gcc –o program source.c

# ./program

8.2.1 Struktur dan Penanganan Data 

Sebelum menggunakan pemrograman socket diperlukan suatu variable struktur untuk

menyimpan informasi tentang jaringan. Struktur yang diperlukan antara lain :

 sockaddr

 sockaddr_in

Contoh penggunaannya yaitu :

struct sockaddr {

unsigned short sa_family; // address family, AF_xxx

char sa_data[14]; // 14 bytes of protocol address

};

Dimana, sa_family digunakan untuk penentuan jenis family yang digunakan pada bab ini

menggunakan AF_INET artinya menggunakan family INTERNETWORKING. Sedangkan

untuk sa_data digunakan untuk informasi tujuan dan port yang digunakan.

72

Untuk menggunakan struktur tersebut diperlukan 1 lagi struktur yaitu sockadd_in dimana arti

“in” adalah internet

struct sockaddr_in {

short int sin_family; // Address family

unsigned short int sin_port; // Port number

struct in_addr sin_addr; // Internet address

unsigned char sin_zero[8]; // Same size as struct sockaddr

};

Dengan struktur ini maka programmer akan dengan mudah mengontrol data. Pada bagian

sin_zero digunakan sebagai pelengkap dimana harus diset dengan nilai 0, hal tersebut

dapat digunakan fungsi memset().

Untuk menggunakan alamat IP perlu juga sebuah variabel struktur yaitu struktur  in_addr,

dimana struktur in_addr adalah sebagai berikut :

// Internet address (a structure for historical reasons)

struct in_addr {

unsigned long s_addr; // that’s a 32-bit long, or 4 bytes

};

Sehingga untuk penggunanya dapat dilakukan dengan cara, membuat sebuah variable contoh

ina dan bertipe struct sockaddr_in maka ina.sin_addr.s_addr dapat digunakan sebagai objek

untuk alamat IP.  

8.2.1.1 Perubahan variable

Perubahan awal yang dapat digunakan adalah perubahan dari short (2 byte) menjadi long (4

byte). Kemudian perubahan lainnya adalah perubahan dari host menjadi network. Sehingga

masing-masing perubahan bisa disingkat menjadi 1 huruf yaitu , s, l, n, dan h.

Fungsi yang dapat digunakan untuk perubahan tersebut antara lain :

 htons() : perubahan host ke network dengan sistem short

 htonl() : perubahan host ke network dengan sistem long

 ntohs() : perubahan network ke host dengan sistem short

 ntohl() : perubahan network ke host dengan sistem long

8.2.1.2 Penanganan alamat IP

Ada beberapa cara untuk memasukkan alamat IP kedalam suatu variable pada pemrograman

socket.

Apabila kita sudah memiliki variable struct sockadd_in ina, dan kita memiliki alamat IP

“10.252.102.23”. Maka dengan fungsi inet_addr(), akan dapat merubah alamat IP menjadi

unsigned long. Contoh penggunaan :

ina.sin_addr.s_addr = inet_addr(“10.252.102.23”);

selain itu ada cara yang lainnya, yaitu dengan menggunakan inet_aton :

#include <sys/socket.h>

#include <netinet/in.h>

73

#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

Dan contoh penggunaannya adalah sebagai berikut :

struct sockaddr_in my_addr;

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

inet_aton("10.252.102.53", &(my_addr.sin_addr));

memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

Sehingga apabila kita ingin menampilkan isi variabel tersebut dapat dilakukan dengan fungsi

tambahan inet_ntoa (network to ascii).

printf("%s", inet_ntoa(ina.sin_addr));

Contoh lengkapnya :

char *a1, *a2;

.

.

a1 = inet_ntoa(ina1.sin_addr); // this is 192.168.4.14

a2 = inet_ntoa(ina2.sin_addr); // this is 10.12.110.57

printf("address 1: %s\n",a1);

printf("address 2: %s\n",a2);

akan menghasilkan

address 1: 10.12.110.57

address 2: 10.12.110.57

8.2.2 System Call

System call adalah fungsi-fungsi dalam pemrograman. Fungsi-fungsi tersebut digunakan

untuk menjalankan dan mengakses jaringan.

8.2.2.1 socket() 

Penggunaan :

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

Fungsi ini digunakan untuk inisialisasi dalam penggunaan socket. Dimana domain berisikan

AF_INET, sedangkat type berisikan SOCK_STREAM atau SOCK_DGRAM dan protocol

berisikan angka 0.

SOCK_STREAM digunakan apabila menggunakan protokol TCP dan SOCK_DGRAM

digunakan untuk protokol UDP.

Selain isi diatas, masih banyak lagi lainnya dan bisa dilihat pada manual page.

74

8.2.2.2 bind()

Penggunaan :

#include <sys/types.h>

#include <sys/socket.h>

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

fungsi bind digunakan untuk melakukan asosiasi terhadap alamat IP dan port. Variabel sockfd

didapat dari fungsi socket().

Contoh :

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define MYPORT 3490

main()

{

int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");

memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

// don’t forget your error checking for bind():

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

.

.

.

Apabila ingin menggunakan alamat IP mesin kita, dapat digunakan :

my_addr.sin_port = 0; // choose an unused port at random

my_addr.sin_addr.s_addr = INADDR_ANY; // use my IP address

8.2.2.3 connect()

Penggunaan :

#include <sys/types.h>

#include <sys/socket.h>

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

fungsi connect digunakan untuk mengakses suatu remote host.

Contoh :

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

75

#define DEST_IP "10.12.110.57"

#define DEST_PORT 23

main()

{

int sockfd;

struct sockaddr_in dest_addr; // will hold the destination addr

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

dest_addr.sin_family = AF_INET; // host byte order

dest_addr.sin_port = htons(DEST_PORT); // short, network byte order

dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);

memset(&(dest_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

// don’t forget to error check the connect()!

connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));

.

.

.

8.2.2.4 listen()

Penggunaan :

int listen(int sockfd, int backlog);

Fungsi dari perintah listen digunakan untuk menunggu koneksi dari suatu host.

8.2.2.5 accept()

Penggunaan :

#include <sys/socket.h>

int accept(int sockfd, void *addr, int *addrlen);

Fungsi dari accept digunakan setelah fungsi listen. Dimana socket akan meneruskan ke

variable socket yang baru setelah suatu host menghubungi. Accept akan membentuk socket

baru dan bisa diproses untuk send atau recv.

Contoh :

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#define MYPORT 3490 // the port users will be connecting to

#define BACKLOG 10 // how many pending connections queue will hold

main()

{

int sockfd, new_fd; // listen on sock_fd, new connection on new_fd

struct sockaddr_in my_addr; // my address information

struct sockaddr_in their_addr; // connector’s address information

int sin_size;

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

my_addr.sin_addr.s_addr = INADDR_ANY; // auto-fill with my IP

memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

76

// don’t forget your error checking for these calls:

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

listen(sockfd, BACKLOG);

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);

.

.

.

8.2.2.6 send() dan recv()

Penggunaan :

int send(int sockfd, const void *msg, int len, int flags);

int recv(int sockfd, void *buf, int len, unsigned int flags);

Funsi dari send dan recv adalah untuk pertukaran data. Fungsi send() dan recv() digunakan

untuk data dengan protokol yang berbasis connection-oriented, sedangkan untuk protokol

yang berbasis connectionless-oriented menggunakan sendto() dan recvfrom().

Pointer *msg merupakan isi dari data yang akan dikirim, begitu juga dengan *buf merupakan

pointer yang berisi data yang diterima. Variabel len digunakan sebagai panjang data tersebut.

Contoh :

char *msg = "Beej was here!";

int len, bytes_sent;

.

.

len = strlen(msg);

bytes_sent = send(sockfd, msg, len, 0);

.

.

.

8.2.2.7 sendto() dan recvfrom()

Penggunaan :

int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct 

sockaddr *to, int tolen);

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr 

*from, int *fromlen);

Fungsi dari sendto dan recvfrom adalah untuk pertukaran data dengan protokol DGRAM.

Fungsi tersebut hampir sama dengan fungsi send dan recv dimana terdapat variabel tambahan

yaitu  struct sockaddr *to, dan int toleni. 

8.2.2.8 close() dan shutdown()

Penggunaan :

close(sockfd);

int shutdown(int sockfd, int how);

77

Fungsi close() d a n shutdown() digunakan untuk menutup koneksi setelah melakukan

pertukaran data. Shutdown digunakan apabila diinginkan suatu kondisi tertentu, variabel

tersebut ditambahkan pada variable how. Varibel tersebut mempunya nilai dan arti tertentu

yaitu :

 0 – Setelah ditutup, hanya diperbolehkan menerima

 1 – Setelah ditutup, hanya diperbolehkan mengirim

 2 – Seteleh ditutup, menerima dan mengirim tidak diperbolehkan (sama dengan

close() )

8.2.2.9 getpeername()

Penggunaan :

#include <sys/socket.h>

int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);

Fungsi getpeername() digunakan untuk mengetahui informasi tentang tujuan.

8.2.2.10 gethostname()

Penggunaan :

#include <unistd.h>

int gethostname(char *hostname, size_t size);

Fungsi gethostname() digunakan untuk mengetahui informasi tentang mesin jaringan kita.

8.2.2.11 DNS – Mengirim ke “whitehouse.gov”, Dijawab “198.137.240.92”

Penggunaan :

#include <netdb.h>

struct hostent *gethostbyname(const char *name);

Struktur hostent memiliki objek didalam antara lain :

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]

Dimana :

 h_name – nama resmi dari suatu host

 h_aliases – NULL , nama alternatif dari suatu host

 h_addrtype – type dari alamat, contoh AF_INET

 h_length – panjang dari data alamat IP

 h_addr_list – ZERO, sekumpulan IP dengan nama tersebut

 h_addr – alamat pertama dari h_addr_list

78

Untuk mendapatkan hasil dari struktur hostent digunakan fungsi gethostbyname(). Cara

penggunaan dapat dilihat pada contoh program.

Contoh program :

/*

** getip.c - a hostname lookup demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int main(int argc, char *argv[])

{

struct hostent *h;

if (argc != 2) { // error check the command line

fprintf(stderr,"usage: getip address\n");

exit(1);

}

if ((h=gethostbyname(argv[1])) == NULL) { // get the host info

herror("gethostbyname");

exit(1);

}

printf("Host name : %s\n", h->h_name);

printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));

return 0;

}

8.2.3 Skenario penggunaan pemrograman socket

Pemrograman socket menggunakan sistem client-server, dimana proses client berbicara

dengan proses server dan sebaliknya. Contoh, client dengan aplikasi telnet akan

menghubungi server yang menjalankan aplikasi telnetd.

Gambar  8.79 Client-Server

Diagram alir yang digunakan tampak pada

79

Gambar  8.80 Diagram Alir Program Berbasis Connection-oriented

Gambar  8.81 Diagram Alir Program Berbasis Connectionless-oriented

80

8.2.3.1 Contoh Server Berbasis STREAM

/*

** server.c - a stream socket server demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/wait.h>

#include <signal.h>

#define MYPORT 3490 // the port users will be connecting to

#define BACKLOG 10 // how many pending connections queue will hold

void sigchld_handler(int s)

{

while(wait(NULL) > 0);

}

int main(void)

{

int sockfd, new_fd; // listen on sock_fd, new connection on new_fd

struct sockaddr_in my_addr; // my address information

struct sockaddr_in their_addr; // connector’s address information

int sin_size;

struct sigaction sa;

int yes=1;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {

perror("setsockopt");

exit(1);

}

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP

memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) 

{

perror("bind");

exit(1);

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen");

exit(1);

}

sa.sa_handler = sigchld_handler; // reap all dead processes

sigemptyset(&sa.sa_mask);

sa.sa_flags = SA_RESTART;

if (sigaction(SIGCHLD, &sa, NULL) == -1) {

perror("sigaction");

exit(1);

}

while(1) { // main accept() loop

sin_size = sizeof(struct sockaddr_in);

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, 

&sin_size)) == -1) {

perror("accept");

continue;

}

81

printf("server: got connection from %s\n",

inet_ntoa(their_addr.sin_addr));

if (!fork()) { // this is the child process

close(sockfd); // child doesn’t need the listener

if (send(new_fd, "Hello, world!\n", 14, 0) == -1)

perror("send");

close(new_fd);

exit(0);

}

close(new_fd); // parent doesn’t need this

}

return 0;

}

Untuk mencoba program server tersebut jalankan:

# telnet server 3490

8.2.3.2 Contoh Client Berbasis STREAM

/*

** client.c - a stream socket client demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490 // the port client will be connecting to

#define MAXDATASIZE 100 // max number of bytes we can get at once

int main(int argc, char *argv[])

{

int sockfd, numbytes;

char buf[MAXDATASIZE];

struct hostent *he;

struct sockaddr_in their_addr; // connector’s address information

if (argc != 2) {

fprintf(stderr,"usage: client hostname\n");

exit(1);

}

if ((he=gethostbyname(argv[1])) == NULL) { // get the host info

perror("gethostbyname");

exit(1);

}

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET; // host byte order

their_addr.sin_port = htons(PORT); // short, network byte order

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

memset(&(their_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) 

== -1) {

perror("connect");

exit(1);

}

if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {

perror("recv");

exit(1);

}

82

buf[numbytes] = ’\0’;

printf("Received: %s",buf);

close(sockfd);

return 0;

}

Program ini mencari server dengan port 3490 dan menerima string dari server dan 

menampilkan ke layar.

8.2.3.3 Socket dengan DATAGRAM

Program listener akan bersiap pada sebuah mesin dan akan menunggu paket yang menuju ke

port 4950. Program talker akan mengirim paket menuju ke port tersebut.

Listing program listernet :

/*

** listener.c - a datagram sockets "server" demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define MYPORT 4950 // the port users will be connecting to

#define MAXBUFLEN 100

int main(void)

{

int sockfd;

struct sockaddr_in my_addr; // my address information

struct sockaddr_in their_addr; // connector’s address information

int addr_len, numbytes;

char buf[MAXBUFLEN];

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror("socket");

exit(1);

}

my_addr.sin_family = AF_INET; // host byte order

my_addr.sin_port = htons(MYPORT); // short, network byte order

my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP

memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

if (bind(sockfd, (struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1) 

{

perror("bind");

exit(1);

}

addr_len = sizeof(struct sockaddr);

if ((numbytes=recvfrom(sockfd,buf, MAXBUFLEN-1, 0,(struct sockaddr 

*)&their_addr, &addr_len)) == -1) {

perror("recvfrom");

exit(1);

}

printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));

printf("packet is %d bytes long\n",numbytes);

buf[numbytes] = ’\0’;

printf("packet contains \"%s\"\n",buf);

close(sockfd);

return 0;

83

}

Listing program talker:

/*

** talker.c - a datagram "client" demo

*/

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#define MYPORT 4950 // the port users will be connecting to

int main(int argc, char *argv[])

{

int sockfd;

struct sockaddr_in their_addr; // connector’s address information

struct hostent *he;

int numbytes;

if (argc != 3) {

fprintf(stderr,"usage: talker hostname message\n");

exit(1);

}

if ((he=gethostbyname(argv[1])) == NULL) { // get the host info

perror("gethostbyname");

exit(1);

}

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET; // host byte order

their_addr.sin_port = htons(MYPORT); // short, network byte order

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

memset(&(their_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0,(struct sockaddr 

*)&their_addr, sizeof(struct sockaddr))) == -1) {

perror("sendto");

exit(1);

}

printf("sent %d bytes to %s\n", numbytes,

inet_ntoa(their_addr.sin_addr));

close(sockfd);

return 0;

}

8.2.4 Socket lanjutan

Pada bagian ini dijelaskan tentang penggunaan beberapa fungsi yang dapat mendukung kerja

dari program jaringan menggunakan pemrograman socket.

8.2.4.1 Blocking

Suatu aplikasi server dapat menerima paket data secara bersamaan, untuk itu perlu dilakukan

pelepasan suatu pembatas atau yang disebut non-blocking. Sehingga server bisa menerima

data secara bersamaan. 

84

Pada initialisasi socket(), socket secara awal memiliki nilai awal blocking. Untuk membuat

mejadi bersifat non-blocking dilakukan dengan cara memanggil fungsi fcntl(). Hal ini dapat

dilihat pada contoh berikut :

#include <unistd.h>

#include <fcntl.h>

.

.

sockfd = socket(AF_INET, SOCK_STREAM, 0);

fcntl(sockfd, F_SETFL, O_NONBLOCK);

.

.

8.2.4.2 select() – Synchronous I/O Multiplexing

Dengan fungsi select, aplikasi akan dapat memilah dan memroses data pada waktu yang

bersamaan. Contoh penggunaan select() 

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct 

timeval *timeout);

Untuk memperjelas berikut adalah contoh program dimana akan menunggu dalam 2.5 detik

apakah ada data yang masuk dari inputan keyboard.

/*

** select.c - a select() demo

*/

#include <stdio.h>

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

#define STDIN 0 // file descriptor for standard input

int main(void)

{

struct timeval tv;

fd_set readfds;

tv.tv_sec = 2;

tv.tv_usec = 500000;

FD_ZERO(&readfds);

FD_SET(STDIN, &readfds);

// don’t care about writefds and exceptfds:

select(STDIN+1, &readfds, NULL, NULL, &tv);

if (FD_ISSET(STDIN, &readfds))

printf("A key was pressed!\n");

else

printf("Timed out.\n");

return 0;

}

Contoh penggunaan select() pada alikasi multiperson chat server 

/*

** selectserver.c - a cheezy multiperson chat server

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

85

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define PORT 9034 // port we’re listening on

int main(void)

{

  fd_set master; // master file descriptor list

  fd_set read_fds; // temp file descriptor list for select()

  struct sockaddr_in myaddr; // server address

  struct sockaddr_in remoteaddr; // client address

  int fdmax; // maximum file descriptor number

  int listener; // listening socket descriptor

  int newfd; // newly accept()ed socket descriptor

  char buf[256]; // buffer for client data

  int nbytes;

  int yes=1; // for setsockopt() SO_REUSEADDR, below

  int addrlen;

  int i, j;

  FD_ZERO(&master); // clear the master and temp sets

  FD_ZERO(&read_fds);

  // get the listener

  if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

    perror("socket");

    exit(1);

  }

  // lose the pesky "address already in use" error message

  if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {

    perror("setsockopt");

    exit(1);

  }

  // bind

  myaddr.sin_family = AF_INET;

  myaddr.sin_addr.s_addr = INADDR_ANY;

  myaddr.sin_port = htons(PORT);

  memset(&(myaddr.sin_zero), ’\0’, 8);

  if (bind(listener, (struct sockaddr *)&myaddr, sizeof(myaddr)) == -1) {

    perror("bind");

    exit(1);

  }

  // listen

  if (listen(listener, 10) == -1) {

    perror("listen");

    exit(1);

  }

  // add the listener to the master set

  FD_SET(listener, &master);

  // keep track of the biggest file descriptor

  fdmax = listener; // so far, it’s this one

  // main loop

  for(;;) {

    read_fds = master; // copy it

      if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) {

        perror("select");

        exit(1);

      }

      // run through the existing connections looking for data to read

      for(i = 0; i <= fdmax; i++) {

        if (FD_ISSET(i, &read_fds)) { // we got one!!

          if (i == listener) {

            // handle new connections

            addrlen = sizeof(remoteaddr);

            if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen))

== -1) {

86

              perror("accept");

            } else {

              FD_SET(newfd, &master); // add to master set

              if (newfd > fdmax) { // keep track of the maximum

                fdmax = newfd;

              }

              

              printf("selectserver: new connection from %s on socket %d\n", 

inet_ntoa(remoteaddr.sin_addr), newfd);

            }

          } else {

            // handle data from a client

             if ((nbytes = recv(i, buf, sizeof(buf), 0)) <= 0) {

               // got error or connection closed by client

               if (nbytes == 0) {

                 // connection closed

                 printf("selectserver: socket %d hung up\n", i);

               } else {

                 perror("recv");

               }

               close(i); // bye!

               FD_CLR(i, &master); // remove from master set

             } else {

               // we got some data from a client

               for(j = 0; j <= fdmax; j++) {

                 // send to everyone!

                 if (FD_ISSET(j, &master)) {

                   // except the listener and ourselves

                   if (j != listener && j != i) {

                     if (send(j, buf, nbytes, 0) == -1) {

                       perror("send");

                     }

                   }

                 }

               }

             }

           } // it’s SO UGLY!

         }

       }

     }

     

     return 0;

}

8.3 Remote Procedure Call (RPC)

RPC adalah suatu protokol yang memperbolehkan suatu program komputer yang

memberikan suatu subroutin kepada komputer yang lain untuk menjalankan suatu perintah

tanpa melalui programmner membuat program terlebih dahulu. 

87

9 Protokol Penamaan dan Direktori

Protokol TCP/IP memiliki banyak jenis aplikasi, tetapi semuanya itu merupakan bentuk dari

utilitas jaringan. Semuanya itu menjadi penting dalam suatu perusahaan untuk menggunakan

jaringan. Jaringan ada untuk diakses dan melayani pengguna, baik dari dalam maupun dari

luar. Dibutuhkan server untuk melayani aplikasi, data dan sumber lainnya. Server tersebut

dimungkinkan dapat berjalan di aneka macam perangkat keras, dari berbagai macam vendor

dan juga berbagai macam jenis sistem operasi. Pada bab ini akan dijelaskan metode untuk

pengaksesan suatu sumber dan aplikasi pada jaringan terdistribusi.

9.1 Domain Name System (DNS)

DNS dijelaskan pada standar protocol dengan no STD 13. Dan dijelaskan pada RFC 1034,

dan RFC 1035. 

Pada awal internet, seorang pengguna hanya bisa mengakses internet dengan menggunakan

alamat IP. Sehingga pengguna harus dapat menghafalkan berbagai macam alamat IP seperti

layaknya menghafalkan no telp. Contoh untuk mengakses suatu server, pengguna harus tahu

alamat IP dari server tersebut, dengan cara TELNET 202.154.187.5. Kemudian

dikembangkan suatu sistem penamaan sehingga pengguna cukup mengakses internet dengan

sebuah nama unik, contoh TELNET www. Dimana IP 202.154.187.5 dipetakan dengan nama

www.

Karena perkembangan internet sangat cepat, maka dikembangkan sistem Domain Name

System (DNS). Dimana cukup dengan sebuah host yang melakukan pemetaan suatu nama

terhadap IP, sehingga host lain cukup mengakses host tersebut dan menanyakan suatu nama

dan dibalaskan alamat IP kepada host penanya. Sehingga host penanya tidak perlu memiliki

database pemetaan tersebut.

9.1.1 Hirarki Penamaan

Penamaan suatu domain dibentuk dalam suatu bentuk pohon hirarki. Dimana hal ini

mempermudah untuk pengontrolan suatu nama domain. Contoh : 

small.itso.raleigh.ibm.com

Small merupakan nama dari host, itso.raleigh.ibm.com merupakan nama domain dengan

level terendah, dan merupakan subdomain dari raleigh.ibm.com, dan juga merupakan

subdomain dari ibm.com, dan juga merupakan subdomain dari domain com yang juga

merupakan top-level domain. Hal tersebut terlihat seperti pada Gambar   9 .82.

88

Gambar  9.82 DNS – Hirarki Penamaan

9.1.2 Fully Qualified Domain Names (FQDN)

Ketika menggunakan DNS, pengguna dapat mengakses suatu site hanya dengan bagian kecil

dari suatu domain. Semisal untuk mengakses website resmi kampus dari jaringan LAN

kampus, pengguna cukup mengetikkan www. Padahal nama lengkap dari server tersebut

adalah www.eepis-its.edu. Nama www.eepis-its.edu merupakan FQDN.

9.1.3 Domain generik

Tiga karakter dari top-level domain disebut juga domain generik atau domain organisasional.

Tabel  9 .6 menunjukkan contoh dari Top-Level Domain.

Tabel 9.6 Top-Level Domain

Nama Domain Arti

com Organisasi komersial (company)

edu Institusi edukasi atau pendidikan

gov Institusi pemerintahan

int Organisasi internasional

mil Militer AS

net Pusat layanan jaringan

org Organisasi non-profit

Kode-negara 2 digit kode negara

Dikarenakan internet berawal di Amerika Serikat, kebanyakan top-level domain merupakan

milik dari badan di AS. Namun pada saat ini hanya gov dan mil yang dikhususkan digunakan

di AS. 

89

9.1.4 Domain Negara

Tiap negara memiliki domain sendiri dengan menggunakan 2 karakter huruf yang merupakan

singkatan dari nama negaranya. Karakter yang digunakan sesuai dengan ISO 3166. Contoh:

Indonesia menggunakan domain .id.

9.1.5 Pemetaan Nama Domain ke Alamat IP

Yang mengontrol pemetaan nama adalah nameserver. Nameserver adalah sebuah program

server dimana memegang master atau duplikat dari database pemetaan nama ke alamat IP.

Fungsi nameserver adalah menjawab permintaan dari program client tentang suatu nama

domain. Nama program client disebut name resolver.

9.1.6 Pemetaan Alamat IP ke Nama Domain – pointer query

Untuk pemetaan alamat IP ke nama domain tidak berbentuk hirarki melainkan dalam format

domain in.addr-arpa (ARPA digunakan karena internet berawal dari ARPAnet).

Penggunaan in.addr-arpa adalah pemetaan terbalik dari suatu alamat IP. Contoh: IP dengan

alamat 129.34.139.30, pada database ditulis dengan 30.139.34.129.in-addr.arpa. Kemudian

dicari nama host yang cocok. Sistem ini disebut pointer query.

9.1.7 Pendistribusian Nama Domain

Pengaturan nama suatu domain dapat dilakukan di jaringan lokal, hal ini disebabkan cara

kerja DNS menggunakan sistem zones of authority atau yang biasa disingkat zones. Dimana

dengan sistem zones ini suatu nameserver dapat mendelegasikan suatu nama domain ke

nameserver lainnya yang terhubung melalui internetworking. 

Pada nameserver root, nameserver mendelegasikan suatu domain ke suatu nameserver.

Contoh : domain eepis-its.edu, dimana nameserver .edu di eduacause.net mendelegasikan

nama eepis-its ke nameserver di jaringan kampus PENS. Nama domain eepis-its

didelegasikan ke nameserver ns1.eepis-its.edu (202.154.187.2) dan ns2.eepis-its.edu

(202.154.187.3). Dan pada nameserver ns1 dan ns2 dicatat nama-nama host dari jaringan

eepis-its.edu.

9.1.8 Domain Name Resolution

Proses yang dilakukan pada penanyaan nama domain antara lain :

1. Suatu program menggunakan gethostbyname().

2. Resolver menanyakan ke suatu nameserver

3. Nameserver mengecek apakah ada jawaban di database lokal atau di penyimpanan 

sementara (cache). Apabila tidak diketemukan nameserver akan meneruskan ke 

nameserver lainnya sesuai dengan hirarki nama domain.

4. Program pada pengguna menerima jawaban berupa alamat IP atau pesan error jika 

terjadi kesalahan.

Proses diatas disebut Domain Name Resolution, yang merupakan aplikasi berbasis server-

client. Fungsi client dilakukan oleh resolver secara transparan terhadap pengguna. Sedangkan

fungsi server dilakukan oleh Nameserver.

Pengiriman ini menggunakan jalur UDP dan TCP.

90

9.1.9 Domain name full resolver

Dikatakan full resolver apabila dilakukan DNS resolution dari program pengguna, dan di

query ke suatu nameserver dari program resolver untuk di proses. Sistem full resolver terlihat

pada Gambar   9 .83.

Gambar  9.83 DNS – menggunakan full resolver untuk domain name resolution

9.1.10 Domain name stub resolver

Sebuah program yang dilengkapi dengan subrutin pemrosesan nama domain dan dapat

melakukan query ke nameserver disebut domain name stub resolver. Dimana pada UNIX,

stub resolver dilakukan dengan subrutin gethostbyname() dan gethostbyaddr(). Stub resolver

dapat dilihat pada

Gambar  9.84 DNS – menggunakan stub resolver untuk domain name resolution

9.1.11 Operasi Domain Name Server

Tipe dari nameserver antara lain :

Primary Nameserver menggunakan zones dari disk dan memiliki autorisasi 

terhadap keseluruhan zone

Secondary Nameserver ini memiliki autorisasi terhadap keseluruhan zone tapi data 

zone diambil dari nameserver primary dengan menggunakan proses zones 

91

transfer. 

Caching-only Sebuah nameserver yang tidak memiliki autorisasi dan data zone. Tetapi 

hanya melakukan penerusan query ke suatu nameserver yang sudah dicatat

9.1.12 Resource Record dari Domain Name System

Database dari DNS disebut dengan resource record (RR),  dimana didalamnya dimulai

dengan Start of Authority (SOA), dimana SOA mencatat nama dari domain. Kemudian ada

penunjukan nameserver (NS) yang akan menjawab nama dari domain tersebut. 

Format resource record :

Tabel 9.7 Format Resource Record dari DNS

Nama TTL Class Tipe RData

Dimana :

- Nama : nama dari domain

- TTL : Time-to-live, lama waktu suatu nama akan berada dalam cache. Satuan yang

digunakan detik, contoh 86400 adalah 1 hari.

- Class : mengidentifikasikan nama protokol, contoh IN (sistem Internet)

- Tipe : mengidentifikasi tipe dari resource record

Tabel 9.8 Tipe dari RR

Tipe Nilai Arti

A 1 Alamat host

CNAME 5 Canonical Name, nama alias dari suatu host

HINFO 13 CPU dan OS yang digunakan suatu host, bersifat komentar

MX 15 Mail Exchange untuk suatu domain

NS 2 Nameserver yang memiliki authority untuk suatu domain

PTR 12 Pointer untuk nama domain

SOA 6 Start of Authority

WKS 11 Well-Known Services, memberikan spesifik dari suatu layanan di

jaringan tersebut

- RData : nilainya bergantung dari tipenya, contoh:

o A Alamat IP

o CNAME nama domain

o MX 16 bit prioritas diikuti dengan nama domain

o NS nama host

o PTR nama domain

9.1.13 Transport

Pesan DNS dikirimkan melalui UDP dan TCP

- UDP : port 53

o Digunakan untuk transfer zone antar nameserver, dengan panjang pesan 512 

byte.

- TCP : port 53

o Panjang total frame dari pesan

92

9.1.14 Aplikasi DNS

DNS di implementasikan pada :

host Mendapatkan alamat IP dari suatu nama host atau mendapatkan nama host dari 

suatu alamat IP

nslookup Mencari informasi tentang node jaringan, dan memeriksa isi database dari 

nameserver

dig Mencari informasi yang lebih lengkap dari suatu nama domain. DIG singkatan 

dari Domain Internet Groper

Bind Aplikasi nameserver

9.2 Dynamic Domain Name System (DDNS)

DDNS digunakan pada client yang menggunakan sistem DHCP, dimana DHCP server

mengirimkan pesan kepada nameserver untuk mencatat IP dan nama host. Cara kerja DDNS

dapat dilihat pada Gambar   9 .85.

Gambar  9.85 DDNS

Dimana :

1. Client mendapatkan alamat IP dari DHCP server

2. Client mengirimkan nama host dengan alamat IP menuju DHCP server

3. Mengirim permintaan pembaruan pada saat proses DHCP

4. Mendaftarkan PTR RR alamat IP ke nama host

9.3 Network Information System (NIS)

NIS bukan merupakan standar internet. NIS digunakan untuk berbagi informasi pada

lingkungan unix. Informasi yang dapat dibagi antara lain /etc/passwd, /etc/group dan

/etc/hosts. 

NIS memiliki kelebihan antara lain :

- Memberikan konsistensi ID pengguna dan ID group pada jaringan yang besar

- Mempersingkat waktu untuk mengelola ID pengguna, ID group dan kepemilikan

NFS baik oleh pengguna itu sendiri maupun sistem administrator

Sistem NIS terdiri dari :

NIS master server Mengelola peta atau database dari password pengguna

NIS slave server Cadangan dari NIS master server

NIS client Sistem yang dilayani oleh NIS server

93

10 Eksekusi Jarak Jauh

Salah satu dasar mekanisme jaringan komputer adalah dapat melakukan perintah komputer

secara jarak jauh. Pengguna dapat menjalankan aplikasi programnya pada komputer yang

letaknya terpisah secara jauh. Salah satu aplikasi yang dapat melakukan aksi jarak jauh

adalah TELNET.

10.1 TELNET

Telnet merupakan protokol standar dengan STD nomer 8. Dijelaskan pada RFC 854 –

TELNET protocol spesification dan RFC 855 – TELNET options Spesifications.

TELNET memberikan interface pada suatu program di salah satu host (TELNET client)

untuk mengakses sumber daya yang berada pada host yang lainnya (TELNET server)

sehingga client akan merasakan melakukan kegiatan seperti pada hostnya sendiri. Terlihat

seperti pada Gambar   10 .86.

Gambar  10.86 TELNET – melakukan login jarak jauh dengan TELNET

Sebagai contoh, seorang pengguna menggunakan sebuah workstation pada LAN melakukan

akses ke suatu host yang juga terhubung pada LAN sehingga merasa seperti menggunakan

terminal pada host.

Kebanyakan telnet tidak memberikan fasilitas grafik interface.

10.2 Remote Execution Command protocol (REXEC dan RSH)

Remote EXEcution Command Daemon (REXECD) adalah merupakan server yang

memperbolehkan menjalankan suatu perintah yang dikirimkan oleh suatu host melalui

jaringan TCP/IP, client menggunakan aplikasi REXEC atau menggunakan Remote Shell

Protocol (RSH) untuk mentransfer suatu kegiatan dari host satu ke host yang lainnya.

REXECD merupakan server (atau daemon). Dimana tugasnya menangani perintah dari host

lainnya, kemudian meneruskan perintah tersebut ke virtual machine untuk dilakukan action

perintah. Daemon memberikan login secara otomatis apabila nama user dan password setelah

dimasukkan.

REXEC menggunakan TCP port 512, sedangkan RSH menggunakan Tcp 514. Dijelaskan

seperti pada Gambar   10 .87

94

Gambar  10.87 Prinsip REXEC dan REXECD

10.3 Secure Shell (SSH)

Pada dunia komputer, secure shell atau SSH adalah protokol standar yang membentuk jalur

yang aman pada komunikasi antar komputer. SSH menggunakan teknik enkripsi public key

pada sistem authentikasi pengguna untuk mengakses komputer yang lain. SSH memberikan

sistem enkripsi pada jalur yang digunakan, sehingga memberikan tingkat keamanan data

yang tinggi. 

SSH biasa digunakan untuk melakukan remote login dan menjalankan perintah pada

komputer remote, tetapi SSH juga dapat digunakan sebagai tunnel jaringan, melakukan

penerusan pada port TCP, dan koneksi X11. Selain itu dapat juga digunakan untuk

mentransfer suatu file dengan protokol SFTP atau SCP. SSH server bekerja pada port 22.

Gambar  10.88 Contoh penggunaan SSH

95

10.3.1 Sejarah SSH

Pada tahun 1995, Tatu Ylonen, peneliti dari Helsinki University of Technology, Finlandia,

mendesign suatu protokol keamanan yang bisa mengamankan dari teknik password sniffing.

Keberhasilan SSH menggantikan protokol rlogin, TELNET, dan rsh. Dimana protokol-

protokol tersebut tidak memberikan fasilitas keamanan authentikasi dan kerahasiaan data.

Ylonen mempublikasikan protokol ini secara freeware pada juli 1995. 

Pada Desember 1995, Ylonen mendirikan SSH Communications Security yang digunakan

untuk memasarkan dan mendevelop SSH, dan SSH berkembang menjadi protokol

proprietary.

Pada 1996, SSH-1 mengalami revisi menjadi SSH-2 dengan menggunakan algoritma yang

lebih aman.

Pada tahun 1999, beberapa komunitas menginginkan adanya versi SSH yang berbasis open

source, sehingga dibentuk yang namanya OpenSSH.

10.3.2 Penggunaan SSH

SSH banyak digunakan untuk :

- Dengan SSH client yang digunakan untuk pengontrolan server secara jarak jauh.

- Dengan kombinasi SFTP dapat melakukan transfer file 

- Dengan kombinasi rsync dapat digunakan sebagai mirror, backup 

- Dengan kombinasi SCP digunakan untuk aplikasi rcp dengan kemampuan keamanan 

data

- Penerus Port atau tunneling

10.4 Virtual Network Computing (VNC)

VNC adalah sistem yang digunakan untuk melakukan pembagian sumber untuk desktop, dimana

menggunakan protokol RFB (Remote Frame Buffer) yang digunakan untuk mengatur komputer lain secara

jarak jauh. VNC mengirimkan informasi penekanan tombol keyboard dan klik pada mouse sehingga dapat

mengontrol komputer lain pada jaringan dan menampilkan layar pada komputer pengontrol.

VNC bersifat platform-independent, artinya VNC viewer dapat terhubung dengan VNC server walau

berbeda sistem operasi. Terdapat berbagai macam VNC server-client dan dalam bentuk java. VNC dapat

dikontrol dari beberapa client sekaligus dalam saat yang bersamaan. VNC banyak digunakan dalam hal

remote technical support, akses file dari komputer di rumah ke komputer tempat kerja. 

VNC pertama kali dikembangkan di AT&T, dan bersifat opensource dengan lisensi GPL. 

10.4.1 Cara Kerja VNC

VNC memiliki 2 bagian yaitu, client dan server. Server adalah program yang membagi sumber dan layar

pada komputer, dan Clinet (viewer) adalah program yang melihat dan melakukan interaksi dengan server. 

VNC menggunakan protokol yang sederhana berdasarkan cara kerja graphic yaitu “letakkan kotak pada

posisi x,y yang diberikan”. Server mengirimkan framebuffer sebesar kotak yang ditentukan kepada client.

Sehingga untuk mengirimkan gambar hanya diperlukan untuk bagian yang bergerak saja, tetapi bila terjadi

pergerakkan gambar yang menuntut sepenuh layar, maka gambar yang dikirimkan juga sebesar gambar

sepenuh layar tersebut.

96

VNC menggunakan port 5900 hingga 5906, tiap port mewakili dari port pada layar X-windows (port 5900

hingga 5906 untuk layar 0 hingga 6). Untuk viewer berupa java diimplementasikan pada RealVNC pada

port 5800 hingga 5806. Port tersebut dapat dirubah.

Pada komputer Windows, komputer hanya dapat menggunakan 1 layar tidak seperti Unix. Sehingga hanya

menggunakan port 5900.

Gambar  10.89 VNC di Windows mengakses VNC di MAC dan Linux

10.5 Remote Desktop Protocol (RDP)

RDP adalah protokol multi-channel yang memperbolehkan user untuk terkoneksi dengan Microsoft

Terminal Services. Untuk client dapat dilakukan dari sistem operasi Windows, dan sistem operasi yang

lainnya seperti Linux, FreeBSD, Mac OS X. Pada bagian server aplikasi menggunakan port 3389.

Versi awal dari RDP adalah versi 4.0, dimana digunakan pada Terminal Services pada sistem operasi

Windows NT 4.0 Server, Terminal Server Edition. Pada Windows 2000 menjadi versi 5.0 dengan tambahan

fitur seperti dapat melakukan mencetak pada printer yang terpasang di komputer lokal. Versi 5.1 berada di

Windows XP Proffesional, dimana mampu menampilkan grafik 24-Bit dan suara. Versi 5.2 terdapat di

Windows 2003, dimana memiliki fitur console mode connection. Dan pada windows Vista akan

menggunakan versi 6.0

10.5.1 Fitur

- Mendukung penggunaan warna 24bit

- Enkripsi 128bit

- Mendukung Transport Layer Security

- Menggunakan aplikasi audio tetapi didengarkan di komputer lokal

- File System Redirection

- Printer Redirection

- Port Redirection

- Clipboard dapat digunakan pada komputer lokal atau komputer remote

- Berbagi sumber harddisk dengan komputer remote

97

10.5.2 Contoh Aplikasi

Gambar  10.90 Remote Desktop Connection

98

11 Protokol Transfer File

Protokol TCP/IP memiliki beberapa aplikasi, terutama yang berhubungan dengan memodifikasi file. Ada 2

mekanisme untuk melakukan transfer file, mekanisme yang pertama melakukan pengiriman file dari

komputer lain ke komputer lokal, dan mekanisme yang lain adalah menggunakan mekanisme file sistem,

dimana ada suatu mekanisme yang memperbolehkan suatu pengguna untuk melakukan perubahan terhadap

file yang berada di komputer yang lain.

Contoh protokol yang menggunakan mekanisme pertama adalah FTP dan TFTP, sedangkan yang

menggunakan mekanisme kedua adalah NFS.

11.1 File Transfer Protocol (FTP)

FTP merupakan protokol standar dengan STD nomer 9. Dijelaskan pada RFC 959 – File Transfer Protocol

(FTP) dan diupdate dengan RFC 2228 – FTP security extention.

Melakukan duplikat file dari komputer yang satu dengan komputer yang lain dengan dapat dilakukan 2

arah. Client dapat mengirim file menuju ke server atau dapat meminta suatu file dari server.

Untuk mengakses file di server, pengguna diharuskan untuk mengidentifikasikan dirinya terlebih dahulu.

Dan server akan melakukan proses authentikasi untuk pengguna tersebut. 

FTP menggunakan koneksi berbasis connection-oriented, sehingga dari kedua sisi harus memiliki koneksi

TCP/IP.

11.1.1