Deddihp’s Blog

March 13, 2010

Boot from Network via PXE (Eng. Version)

Filed under: Medium Linux — deddihp @ 3:25 pm
Tags: , , , ,

Boot from Network via PXE (Eng. Version)

–THE IDEA–

  1. using root_fs for i386 we have made before to be able booted from network.
  2. root_fs can be booted from Network with Boot From Network facility in BIOS.
  3. We will use PXE Technology.

–UNDERSTANDING PXE–
PXE is … you can read it at http://en.wikipedia.org/wiki/Preboot_Execution_Environment.

There are several BIOS that have been supported by PXE, but there are not. If you don’t have any BIOS that is supported by PXE, you need some standard boot device such as USB FD, CF, HARDDISK etc) and it have to be configured first with gPXE, so it can handle PXE process.
Some application we need to boot with PXE :

  1. DHCP
  2. TFTP
  3. SYSLINUX
  4. gPXE (Optional)

–How Does it work ?–

  1. If you set your system to boot from Network, system will send broadcast message with DHCP protocol. DHCP Server will give it an IP Address dan PXE configuration to it.
  2. The system will start to download the configuration files for preparing booting process via tftp.
  3. The system is ready to boot and ready to use.

Setting BIOS to boot from network

Set BIOS

Set BIOS

later the system which is booted from network will be called PXEClient

–CONFIGURE gPXE–
as we mentioned above, if you don’t have any BIOS that is supported by PXE, you need some standard boot device that is configured with gPXE.
Below we will discuss about how to use gPXE.

  1. Install gPXE, you can get the source from http://etherboot.org/wiki/index.php
  2. We will use USB FD as standard boot device, so we need to copy the gpxe.usb to our device (ex: /dev/sda1). You can find gpxe.usb file in “./bin” directory at gpxe folder.
    • Copy:
    • dd if=bin/gpxe.usb of=/dev/sda1
  3. Your USB FD is ready to use.

–CONFIGURE DHCP–
We need DHCP Server to assign IP Address and send early configuration file to our PXEClient. We can adjust our dhcp configuration in /etc/dhcpd.conf.
DHCP Configuration:
Assume:

  1. IP Address PXEClient : 192.168.0.254/24
  2. MACAddress : 00:0D:48:36:0C:E4
  3. DHCP Server : 192.168.0.1/24
  4. TFTP Server : 192.168.0.1/24
  5. Konfigurasi file : pxelinux.0

File dhcpd.conf:

    allow booting;
    allow bootp;

           # Standard configuration directives...
               subnet 192.168.0.0 netmask 255.255.255.0 {
               option domain-name "mydomain";
               option subnet-mask 255.255.255.0;
               option broadcast-address 192.168.0.255;
               option domain-name-servers 192.168.0.1;
               option routers 192.168.0.1;

    # Group the PXE bootable hosts together
           group {
        # PXE-specific configuration directives...
        option dhcp-class-identifier "PXEClient";
                   next-server 192.168.0.1;
                   filename "/pxelinux.0";

        # You need an entry like this for every host
        # unless you're using dynamic addresses
        host hostname {
            hardware ethernet 00:0D:48:36:0C:E4;
            fixed-address 192.168.0.254;
               }
       }

–CONFIGURE TFTP–
We use TFTP as transfer file protocol to download neede files.

  1. install tftp,
  2. you should check the default directory of downloadable file via tftp (/var/lib/tftpboot)
  3. Activate tftp via inetd

–CONFIGURE SYSLINUX–
Syslinux is a Linux Operating System boot loader which operates off an MS-DOS/Windows FAT Filesystem. You can check with “man syslinux”.
Intended to boot with PXE we need PXELINUX as a derivatif of syslinux.
Files needed to boot with pxe:

  • pxelinux.0

we can get it from directory:

  • /usr/lib/syslinux/pxelinux.0

-STEP BY STEP-
—Preparing The Files—
Please prepare the files we needed in default directory of tftp (/var/lib/tftpboot)
All of the files would be :

  1. /var/lib/tftpboot/pxelinux.0
  2. /var/lib/tftpboot/bzImage
  3. /var/lib/tftpboot/root_fs_i386.gz
  4. /var/lib/tftpboot/pxelinux.cfg/01-00-0d-48-36-0c-e4
  5. /var/lib/tftpboot/pxelinux.cfg/C0A800FE
  6. /var/lib/tftpboot/pxelinux.cfg/C0A800
  7. /var/lib/tftpboot/pxelinux.cfg/C0A800
  8. /var/lib/tftpboot/pxelinux.cfg/C0A80
  9. /var/lib/tftpboot/pxelinux.cfg/C0A8
  10. /var/lib/tftpboot/pxelinux.cfg/C0A
  11. /var/lib/tftpboot/pxelinux.cfg/C0
  12. /var/lib/tftpboot/pxelinux.cfg/C
  13. /var/lib/tftpboot/pxelinux.cfg/default

You can see at point 4 to 13 are how syslinux read the configuration file. I have taken the article below from http://syslinux.zytor.com/wiki/index.php/PXELINUX:

  1. First, it will search for the config file using the hardware type (using its ARP type code) and address, all in lower case hexadecimal with dash separators; for example, for an Ethernet (ARP type 1) with address 00:0d:48:36:0c:e4 it would search for the filename 01-00-0d-48-36-0c-e4.
  2. Next, it will search for the config file using its own IP address in upper case hexadecimal, e.g. 192.168.0.254 -> C0A800FE (you can use the included progam gethostip to compute the hexadecimal IP address for any host). If that file is not found, it will remove one hex digit and try again. Ultimately, it will try looking for a file named default (in lower case). As an example, if the boot file name is /mybootdir/pxelinux.0, the Ethernet MAC address is `00:0d:48:36:0c:e4` and the IP address 192.168.0.254, it will try the files above (point 4 to 13).

The Example of Configuration for boot loader at 01-00-0d-48-36-0c-e4 file name:

  • prompt 1
  • default linux
  • timeout 1
  • label linux
  • kernel bzImage
  • append initrd=root_fs_i386.gz root=/dev/ram0 ramdisk_size=30000 noapic acpi=off

I often use the following configuration:
Files :

  1. /var/lib/tftpboot/pxelinux.0
  2. /var/lib/tftpboot/bzImage
  3. /var/lib/tftpboot/root_fs_i386.gz
  4. /var/lib/tftpboot/pxelinux.cfg/01-00-0d-48-36-0c-e4

–Execute DHCP Server–
Start dhcp server with the following command:

  • dhcpd

Or you can execute it in foreground use :

  • dhcpd -d

–Execute tftp server–
Start tftp server with the following command :

  • inetd

PXEClient ready to boot from Network.

Google Tech Talk

Hope this help.

March 12, 2010

Boot From Network via PXE

Filed under: Linux — deddihp @ 8:43 am
Tags: , , ,

Boot from Network via PXE

–IDE–

  1. Menggunakan root_fs for i386 dari bahasan sebelumnya agar dapat di boot dari network.
  2. root_fs dapat diboot dari network dengan memilih fasilitas Boot From Network pada BIOS.
  3. Teknologi yang digunakan adalah PXE (Pre-Execution Environment).

–MEMAHAMI PXE–
PXE atau biasa dibaca dengan PiXiE adalah ……… bisa didapat di http://en.wikipedia.org/wiki/Preboot_Execution_Environment

Pada beberapa BIOS sudah didukung dengan teknologi PXE, namun ada beberapa versi BIOS yang tidak didukung dengan fasilitas Boot from Network. Pada kasus versi BIOS tanpa fasilitas Boot from Network kita memerlukan boot device standard (seperti USB FD, CF, HARD DISK dll) yang sudah di configurasikan untuk dapat Boot dari Network dan Aplikasi yang digunakan adalah gPXE.
Untuk boot dari PXE kita memerlukan beberapa aplikasi pendukung, seperti :

  1. DHCP
  2. TFTP
  3. SYSLINUX
  4. gPXE

–How does it work ?–

  1. Dengan fasilitas Boot From Network pada BIOS, system akan mem-broadcast paket lewat protocol DHCP. DHCP server akan memberikan IP Address dan konfigurasi PXE pada system. Pada tahap ini system sudah mempunyai IP Address dan siap untuk proses selanjutnya.
  2. System men-download file2 yang diperlukan untuk keperluan booting. File2 tersebut di download via tftp. Pada tahap ini konfigurasi, root_fs dan kernel sudah didownload dari server.
  3. System siap untuk boot dengan menggunakan root_fs dan kernel yang sudah didownload. System siap untuk digunakan.

Setting BIOS to boot from network.

Set BIOS

Set BIOS

Selanjutnya system yang di-Boot dengan menggunakan teknologi PXE akan kita sebut PXEClient.

–CONFIGURE gPXE–
Seperti yang sudah dibahas diatas, pada versi BIOS tanpa fasilitas Boot From Network kita membutuhkan boot device untuk dapat Boot menggunakan PXE. Berikut ini kita akan membahas bagaimana menggunakan gPXE.

  1. Install gPXE, source gPXE bisa didapat di http://etherboot.org/wiki/index.php
  2. Pada kasus ini kita akan menggunakan USB FD sebagai boot device. Maka yang perlu kita lakukan adalah meng-copykan isi gpxe.usb pada direktori “./bin” di folder gpxe.
    • dd if=bin/gpxe.usb of=/dev/sda1
  3. USB FD anda siap digunakan sebagai boot device PXE.

–CONFIGURE DHCP–
Kita memerlukan DHCP Server untuk memberikan IP Address dan mengirimkan configurasi file awal. Konfigurasi DHCP Server dapat kita sesuaikan dengan meng-edit file /etc/dhcpd.conf
Konfigurasi dhcpd.conf:
Asumsikan:

  1. IP Address PXEClient : 192.168.0.254/24
  2. MACAddress : 00:0D:48:36:0C:E4
  3. DHCP Server : 192.168.0.1/24
  4. TFTP Server : 192.168.0.1/24
  5. Konfigurasi file : pxelinux.0

File dhcpd.conf:

    allow booting;
    allow bootp;

           # Standard configuration directives...
    subnet 192.168.0.0 netmask 255.255.255.0 {
               option domain-name "mydomain";
               option subnet-mask 255.255.255.0;
               option broadcast-address 192.168.0.255;
               option domain-name-servers 192.168.0.1;
               option routers 192.168.0.1;

    # Group the PXE bootable hosts together
           group {
        # PXE-specific configuration directives...
        option dhcp-class-identifier "PXEClient";
                   next-server 192.168.0.1;
                   filename "/pxelinux.0";

        # You need an entry like this for every host
        # unless you're using dynamic addresses
        host hostname {
            hardware ethernet 00:0D:48:36:0C:E4;
            fixed-address 192.168.0.254;
               }
       }

–CONFIGURE TFTP–
TFTP digunakan sebagai protocol transfer file untuk mendownload file2 yang diperlukan untuk melakukan Booting.

  1. Install tftp, paling mudah via apt-get atau synaptic.
  2. cek direktori default file2 yang bisa didownload via tftp (biasanya /var/lib/tftpboot)
  3. Aktifkan tftp via inetd

–CONFIGURE SYSLINUX–
Syslinux adalah boot loader pada Operating system Linux yang berjalan pada MS-DOS/Windows FAT filesystem. Tujuannya adalah mempermudah proses instalasi linux untuk pertama kali atau untuk tujuan2 lainnya.
Untuk boot menggunakan PXE kita memerlukan PXELINUX yang juga adalah turunan dari SYSLINUX dan memang ditujukan untuk boot Linux dari jaringan berdasarkan spesifikasi dari PXE.

File yang diperlukan untuk boot pxe adalah :

  • pxelinux.0

yang bisa kita dapatkan di direktori

  • /usr/lib/syslinux/pxelinux.0

tentu saja setelah kita install syslinux.

–STEP BY STEP–

—Preparing The Files—

Siapkan file2 yang akan digunakan pada direktori default tftp (biasanya pada /var/lib/tftpboot).
File2 tersebut adalah

  1. /var/lib/tftpboot/pxelinux.0
  2. /var/lib/tftpboot/bzImage
  3. /var/lib/tftpboot/root_fs_i386.gz
  4. /var/lib/tftpboot/pxelinux.cfg/01-00-0d-48-36-0c-e4
  5. /var/lib/tftpboot/pxelinux.cfg/C0A800FE
  6. /var/lib/tftpboot/pxelinux.cfg/C0A800F
  7. /var/lib/tftpboot/pxelinux.cfg/C0A800
  8. /var/lib/tftpboot/pxelinux.cfg/C0A80
  9. /var/lib/tftpboot/pxelinux.cfg/C0A8
  10. /var/lib/tftpboot/pxelinux.cfg/C0A
  11. /var/lib/tftpboot/pxelinux.cfg/C0
  12. /var/lib/tftpboot/pxelinux.cfg/C
  13. /var/lib/tftpboot/pxelinux.cfg/default

Untuk poin 4 s/d 13 adalah kebutuhan dari syslinux untuk mengenali systemnya, dapat dilihat pada http://syslinux.zytor.com/wiki/index.php/PXELINUX. Kita dapat membedakan configurasi boot loader nya berdasarkan IP Address, Mac, atau di boot secara difault. Runutan PXE mencari konfigurasi boot loader :

  1. Konfigurasi yang dicari oleh PXE pertama kali adalah berdasarkan MAC Address. Contoh apabila MACAddress kita adalah 00:0D:48:36:0C:E4, maka konfigurasi boot loader dapat kita simpan pada file 01-00-0d-48-36-0c-e4. Apabila tidak ditemukan konfigurasi dengan MAC Address tertentu, PXE akan mencari konfigurasi berdasarkan IP Address.
  2. Berdasarkan IP Address dengan format HEXADECIMAL, apabila IP Address yang kita berikan adalah 192.168.0.254 format HEXADECIMAL nya akan menjadi C0A800FE, jadi PXE akan mencari file C0A800FE, apabila tidak ditemukan PXE men-shift C0A800FE ke kiri sebanyak 4 bit (C0A800F) dan begitu seterusnya. Artinya runutan pencarian PXE akan menjadi :
    • C0A800FE -(jika tidak ada)- C0A800F -(jika tidak ada)- C0A800 dst.
  3. Jika file2 diatas tidak ditemukan, PXE akan membaca file default sebagai konfigurasi bootloader nya.

contoh konfigurasi file yang saya gunakan di file 01-00-0d-48-36-0c-e4 :

  • prompt 1
  • default linux
  • timeout 1
  • label linux
  • kernel bzImage
  • append initrd=root_fs_i386.gz root=/dev/ram0 ramdisk_size=30000 noapic acpi=off

Contoh File2 yang saya gunakan adalah :
File :

  1. /var/lib/tftpboot/pxelinux.0
  2. /var/lib/tftpboot/bzImage
  3. /var/lib/tftpboot/root_fs_i386.gz
  4. /var/lib/tftpboot/pxelinux.cfg/01-00-0d-48-36-0c-e4

—Menjalankan DHCP Server—
Jalankan dhcp server dengan command :

  • dhcpd

atau jika ingin berjalan pada mode foreground :

  • dhcpd -d

—Menjalankan tftp server—
Jalankan tftp server dengan command (Sesuaikan dengan PC dan settingan anda):

  • inetd

System anda siap untuk boot dari network.

Google Tech Talk about PXE

Semoga berguna………

Problem while compiling old perl (perl5.003_07)

Filed under: Problems — deddihp @ 3:58 am

Hello,

I have a problem while compiling old perl. The following message is :

  • make: *** No rule to make target `<built-in>’, needed by `miniperlmain.o’. Stop.

and then I do googling to find the solution. I found it on this link http://www.gossamer-threads.com/lists/perl/porters/225634

The solution is just type the following command :

  • perl -i~ -nle ‘print unless /<(built-in|command line)>/’ makefile x2p/makefile

They say “It’s simply something unexpected being output by some tool and then being written to the Makefile.”

it solved the problems, Thanks.


March 11, 2010

How To Build Medium root_fs for i386/x86 (Eng.)

Filed under: Medium Linux — deddihp @ 8:44 am

THE IDEA
Make medium linux for testing and some interests purposes such as:

  1. linux that was built is small enough to be inserted into the flash disk or another block device.
  2. Can be booted from a laptop, PC, or other x86 standard devices.
  3. Software can be installed for testing purposes, such as iptables, ebtables, brctl (bridge controller), vlan, pppoe server / client, pptp server / client, web server, database, nfs, etc..
  4. Easy to configure, either to configure libraries or kernels.

DESIGN SYSTEM
We can build this root_fs based on common Distro root_fs structure, for example this root_fs is built based on the Debian distro, with some modifications in the files, in the library or a binary executable or configuration settings etc. in other words, do not used that not important to build root_fs, and put the files the important one. 🙂

Make a loop device
Command to create a loop device

  • dd if=/dev/zero of=root_fs_i386 bs=1k count=30,000

the point is: create a file with root_fs_i386 contents of /dev/zero (empty) with a block size of 1kb (1kilo Bytes), then copy with the amount of `count * bs BYTES (1kb * 30,000 = 30 MB)

root_fs_i386 files will be generated with file size 30MB (30,720,000 KB)

format root_fs_i386 with reiserfs filesystem:

  • mkreiserfs -q -f root_fs_i386

root_fs_i386 mount loop to an empty directory, then copy the contents of root_fs we made into a loop device.

  • mount -o loop root_fs_i386 /mnt/disk
  • cp -dpR myroot_fs/* /mnt/disk/

Checking whether our root_fs is right with chroot:

  • chroot /mnt/disk

After OK, the unmounted

  • umount /mnt/disk

Compress root_fs

  • gzip root_fs_i386

root_fs_i386.gz is generated

The root_fs that is created here is medium-sized (about 18M inserted into the loop device with 30M size). It is rather large if we call it mini root_fs, so we should say it medium root_fs.

Block Device Interface that we want to be used is the USB Flash Disk and CF (Compact Flash / Block Devices used in the Embedded System). USB FD and CF have limitations, they should not be written too often, because the FD USB and CF has a maximum age of how many times they can be written, so if the age had reached the limit, the CF can not be used again. Therefore, we have to make a system that doesn’t write CF too often.

Solution of those problems is fairly easy, we simply load an existing root_fs on CF into the ramdisk. we can make ramdisk_size per block for 30M at booting process with GRUB or through PXE, such as the example below:

  • append initrd = root_fs_i386.gz root=/dev/ram0 ramdisk_size=30000

THE KERNEL

We cannot use a common kernel, we need to configure kernel also, so the kernel can load the root_fs till system login prompt appears.

Fundamental difference of this root_fs is the absence of a kernel module which we usually find in /lib/modules on linux distributions. That means the kernel works must be handled by 1 kernel file (bzImage). That makes the kernel size we used slightly swollen. We also need to include some basic configurations such as filesystems (ext2, ext3, reiserfs, etc.), ethernet, etc into the kernel image.

KERNEL CONFIGURATION
To configure the kernel itself is a bit confusing. But as mentioned above, we do not have the kernel module, so with this condition, we have to bundle it in one file kernel image.
Example:

  • To boot, we clearly need a filesystem module so that the system knows the file system in root_fs we use, and then we have to configure the kernel to load our filesystem.
  • For iptables capability we need Netfilter, for NAT tables we need CONNTRACK family, so in the KERNEL CONFIG, Netfilter Core section must be loaded.

I already configure the kernel, so it is already support filesystem, iptables, ppp issue.

FORMAT filesystem on a USB or CF FD
We must first determine what file system will be used. Like the example below.
Reiserfs format FileSystem

assume FD USB or CF at /dev/sda1 (check with the command fdisk -l)

  • /sbin/mkreiserfs -q -f /dev/sda1

Booting
to boot we clearly need a boot loader. We can use GRUB, LILO, or the other according to our wishes. If you use GRUB, follow the example below:
to install grub on a USB FD or CF we can use command below:
we assume CF or USB FD is at /dev/sda1, then we need to mount it first

  • mount /dev/sda1 /mnt/disk
    /usr/sbin/grub-install –no-floppy –root-directory=/mnt/disk /dev/sdb

then we can see in /mnt/disk/ the “boot” directory.
Open the file “device.map” using a text editor in /mnt/disk/boot/grub directory, then replace the device with the appropriate devices. Example
device.map file:

  • (hd0) /dev/sda
    (hd1) /dev/sdd

Open a text editor using the menu.lst in the /mnt/disk/boot/grub/menu.lst directory ..
About the Contents, adjust it to your conditions:

  • timeout 1
    title test_root_fs
    kernel (hd0, 0)/bzImage
    initrd (hd0, 0)/root_fs_i386.gzroot=/dev/ram0 ramdisk_size=30000

COPY KERNEL IMAGE AND ROOT_FS
Copy kernel and root fs image to CF mount point (/mnt/disk)

  • cp root_fs_i386.gz bzImage /mnt/disk

Ready to Rumble … ..

root_fs image, kernel configuration and can be found at http://sourceforge.net/projects/root-fs-i386/

Example Implementation of this root_fs_i386:
I use it to boot on a VIA board with 4 ethernet ports.

Board VIA
Board VIA

Board VIA
Board VIA

or you can build it also :

IPERF Server booted from PXE
IPERF Server booted from PXE

Switch with VLAN included

March 9, 2010

RealTime Steganography in Video Streaming (rtstegvideo) part.2

Filed under: About rtstegvideo — deddihp @ 10:08 am
Tags: , , ,

PENDEKATAN TEKNOLOGI pada rtstegvideo

Untuk menentukan pendekatan yang sesuai dalam membuat aplikasi rtstegvideo, kita perlu memperjelas fungsi rtstegvideo secara detail.

Fungsi rtstegvideo :

  1. rtstegvideo dapat berperan sebagai video stream server dan video stream client.
  2. paket video stream yang dikirim oleh rtstegvideo bisa diterima oleh video stream client apapun, begitu pun sebaliknya.
  3. rtstegvideo harus dapat mendefinisikan codec standar seperti video stream yang lain.
    • Kesimpulan no 1,2,3:
      • Dari poin 1, 2 dan 3, dapat disimpulkan kita perlu memilih library yang cocok untuk membuat aplikasi video streaming. Library yang bisa kita pakai dan teruji kehandalannya adalah ffmpeg untuk di linux.
  4. rtstegvideo harus dapat meng-embed-kan data rahasia ke file compressed video. rtstegvideo menggunakan file *.mpg (MPEG-1), sebagai video samplenya.
    • Kesimpulan no.4:
      • Dari poin 4, dapat kita simpulkan bahwa pengoperasian algoritma DCT untuk meng-embed-kan data adalah pada paket data nya, bukan pada “image” nya. Hal ini dikarenakan compressed video bersifat lossy jadi dikhawatirkan data yang telah di embedkan pada image akan hilang atau rusak terkena kompresi video standar nya.
      • operasi DCT pada image di video terkompresi juga akan mempengaruhi kualitas gambar yang diterima. Untuk itu kita perlu mengetahui tentang mekanisme VIDEO TAG pada file video standard.
  5. data embed yang disupport adalah binary(*.mp3, *.jpg, *.bmp dll) dan text.
    • Kesimpulan no.5 :
      • Operasi steganografi pada rtstegvideo harus bersifat lossless.
  6. data yang di embed sama dengan data yang di extract (lossless).
  7. operasi embed dilakukan pada video streaming teknologi yang memerlukan data dikirimkan secara terus menerus (sekuensial) dengan rentang waktu yang konstan.
    • Kesimpulan no.7:
      • algoritma yang digunakan harus se efisien mungkin supaya tidak terlalu membebani prosesor, karena proses video streaming sudah banyak menyedot aktifitas prosesor ditambah lagi dengan proses embed. Isu ini juga berhubungan dengan banyaknya data yang dikirim. Data embed dapat dikirim bagian per bagian dengan ditumpangkan pada paket data yang dikirim saat itu.

–Memahami format Video MPEG-1–

Standar video MPEG-1 dikembangkan oleh MPEG (Moving Picture Experts Group) yang dibangun tahun 1988. MPEG-1 merupakan sebuah coding yang menggabungkan sinyal audio-visual dengan bitrate sekitar 1,5 Mbit/s. Video MPEG-1 mengeksploitasi metode kompresi perceptual yang secara signifikan mengurangi data rate tanpa ada pengurangan kualitas yang terlalu besar.
Pada MPEG-1, sebelum proses encoding dilakukan, terlebih dahulu dilakukan konversi color space dari komponen RGB ke YCbCr (persamaan 2.1, 2.2, 2.3). Setelah dilakukan color space conversion,karena HVS (Human Visual System) sensitif terhadap komponen Y, maka komponen Y tersebut diencode dengan full resolution. Tapi, karena  HVS lebih tidak sensitif ke komponen CbCr,maka dilakukan proses subsampling komponen tersebut.

MPEG-1 mempunyai beberapa tipe frame, yaitu I-Frame, P-Frame, dan B-Frame.

  • I-Frame
    • I-frame merupakan singkatan dari Intra-frame, disebut begitu karena I-frame dapat didecode secara independen dari frame-frame yang lain. I-frame kadang-kadang juga disebut dengan I-picture atau keyframe. Jarak antara dua I-frame dikenal dengan GOP (group of pictures) size. Biasanya MPEG-1 menggunakan GOP size sebesar 15-18
  • P-Frame
    • P-frame merupakan singkatan dari Predicted-frame, terkadang juga disebut sebagai forward-predicted frame atau inter-frame (B-frame juga inter-frame). P-frame ada untuk meningkatkan kompresi dengan mengeksploitasi temporal redundancy sebuah video. P-frame hanya menyimpan difference sebuah gambar dari frame (I-frame atau P-frame) lalu segera memprosesnya (frame yang jadi referensi disebut anchor frame). Difference antara P-frame dan anchor frame dihitung menggunakan MV (motion vector) dari setiap macroblok
  • B-Frame
    • B-frame berasal dari istilah bidirectional-frame, terkadang juga disebut sebagai backwards-predicted frames atau B-picture. B-frame mirip dengan P-frame hanya B-frame dapat membuat prediksi menggunakan dua anchor frame (frame sebelum dan sesudah). Sebuah video dapat digambarkan sebagai berikut.

Apabila dilihat dari bentuk paketnya :

Stream video MPEG-1 dapat dilihat pada gambar di bawah ini :

MPEG-1 Structure
MPEG-1 Structure

Untuk detailnya dapat dilihat pada gambar berikut :

MPEG-1 Structure
MPEG-1 Structure

Setiap data dan headernya dikenali dari kode identifikasinya yang berupa start_code[10,11,15]. Seperti ditunjukkan pada gambar 2-3, data gambar terletak setelah Picture header. Picture header terletak setelah GOP header, dan GOP header terletak setelah Sequence header. Sebuah video stream akan diakhiri oleh Sequence end code. Header-header tersebut dikenali dari Stream ID-nya. Untuk setiap stream, terdiri dari 32-bit start code.

32-bit start code

byte 0 byte 1 byte 2 byte 3
0000 0000 0000 0000 0000 0001

Start code prefix

Stream ID

Beberapa Stream ID yang Umum Digunakan

Stream ID Used for
0x00 Picture_Start_Code
0x01-0xAF Slice_Min_Start
0xB3 Seq_Start_Code
0xB8 GOP_Start_Code
0xB7 Seq_End_Code

RealTime Steganography in Video Streaming (rtstegvideo) part.1

Filed under: About rtstegvideo — deddihp @ 6:49 am
Tags: , , ,

Author: me and my wife (Saidah Nurul Laili)

About rtstegvideo

rtstegvideo adalah aplikasi yang mempunyai fungsi sebagai video server dan client dengan teknologi steganografi didalamnya.

IDE
Idenya adalah, bagaimana jika kita membuat suatu sistem video stream server dilengkapi dengan teknologi steganography (menyembunyikan data) dengan codec standar dan dengan protocol stream standar juga, dan dapat diterima oleh aplikasi video client standar juga tentunya. Yang artinya pada saat client menerima paket data video dari server, client tidak akan merasakan sesuatu yang aneh terhadap video yang dilihat. Namun apabila client memiliki device untuk membuka data2 yang disembunyikan di paket video tersebut, si client bisa mengambil data tersembunyi dari paket video tersebut.

Atau bisa dibayangkan seperti ini : 🙂

anggap kita adalah agen rahasia yang tersebar di seluruh dunia, pada suatu ketika markas besar ingin memberikan perintah rahasia kepada semua agennya. Untuk menghemat biaya operational akhirnya markas besar menumpangkan data2 rahasia nya ke dalam paket data video salah satu channel televisi digital misalnya. Jadi si agen2 yang tersebar itu bisa dengan mudah men-download data2 rahasianya lewat televisi digital tersebut dengan device tertentu, sementara masyarakat yang lain tetap bisa menontonnya dengan nyaman. hehe sory agak lebay 😀

Sebelum melangkah lebih jauh mari kita bahas teknologi, video streaming dan steganografi dulu

–Teknologi Video Streaming–

Video streaming dapat diartikan sebagai pengiriman video satu arah dimana video akan langsung ditampilkan begitu sampai ke penerima. Dengan adanya video streaming pengguna dapat langsung melihat video tanpa harus menunggu keseluruhan data video sampai. Data video yang sampai tersebut tidak disimpan secara permanen. Pada sisi penerima data akan disimpan terlebih dahulu di buffer selama beberapa saat sebelum ditampilkan.

Sistem video streaming terdiri dari sebuah encoder, distribution server, dan sebuah client yang menerima data. Distribution server menyimpan video yang telah diencode dan mendistribusikannya sesuai permintaan client. Proses encoding dan distribusi dilakukan secara real-time. Transport protocol yang digunakan pada video streaming adalah TCP, UDP, RTP dan RTSP. Untuk transfer data yang reliable digunakan protokol TCP. UDP menyediakan layanan yang un-reliable transport.

Video Streaming Architecture

Video Streaming Architecture

— STEGANOGRAFI

Steganografi merupakan suatu teknik menyembunyikan pesan pada suatu pembawa sedemikian hingga keberadaan pesan tersebut tidak terdeteksi. Steganografi berasal dari bahasa Yunani yang berarti “tulisan tersembunyi”.Tujuan dari steganografi adalah menyembunyikan data pada suatu media. Media maupun pesan atau data yang disembunyikan dapat berupa gambar dijital, suara, video, dan media lainnya. Jika pada media yang telah disisipi pesan rahasia tersebut terlihat mencurigakan, maka tujuan dari steganografi tersebut tidak tercapai.

Teknik steganografi sudah dikenal sejak jaman Yunani dan Romawi kuno. Misalnya dengan mencukur kepala budak, lalu pesan rahasia ditulis pada kulit kepalanya. Setelah rambut budah tersebut tumbuh, budah tersebut dikirim untuk menyempaikan pesan rahasia tersebut.

Ada beberapa kriteria yang harus diperhatikan dalam penyembunyian data, yaitu :

  1. Fidelity
    • Setelah disisipi dengan data, media penampung harus terlihat baik. Pengamat tidak mengetahui terdapatnya data rahasia pada media penampung.
  2. Robustness
    • Data yang disembunyikan harus tahan (robust) terhadap berbagai operasi manipulasi yang dilakukan pada media penampung.
  3. Recovery
    • Data yang disembunyikan harus dapat diekstrasi kembali.

Terdapat beberapa teknik yang biasa digunakan untuk menyembunyikan data. Teknik yang paling sering digunakan adalah dengan memodifikasi LSB (least significant bit. Penyembunyian data dilakukan dengan mengganti bit-bit media penampung dengan bit-bit data yang hendak disembunyikan. Metode lain yang lebih rumit adalah DCT (discrete cosine transform).

Informasi tentang steganografi juga bisa didapat di beberapa situs seperti :

sudah dibaca ?

Intinya adalah, steganografi dalam dunia komputer adalah proses penyembunyian data digital ke dalam suatu wadah tertentu (bisa pada gambar, video, file dokumen dll), tentunya wadah nya harus lebih besar daripada data yang mau disembunyikan. Nah pada kasus ini data2 tersebut di sembunyikan di dalam paket2 data video untuk di kirim ke berbagai client melalui jaringan komputer.

Steganografi sendiri dibagi menjadi dua berdasarkan hasilnya ada yang Lossy dan Lossless. Lossy berarti data yang diembed ada kemungkinan berbeda dengan data yang diekstrak.
Lossless berarti kebalikan daripada Lossy, data yang di ekstrak harus dijamin kesamaannya dengan data yang di embed.

rtstegvideo bertujuan untuk mengembed – kan data tanpa ada yang hilang (lossless) jadi kita pilih algoritma yang digunakan di rtstegvideo adalah DCT (Discrete Cosine Transform ).

secuil dari code rtstegvideo untuk bagian algoritma DCT dapat dilihat di src/DCTOp.cpp.

==============================================

/*
* This Code is written by Deddi Hariprawira ( deddihp@gmail.com, deddihp@yahoo.com )
*/

#include "DCTOp.h"

CDCTAlgo::CDCTAlgo(void)//int *input, int *output, uint8_t type)
{
    /*	if ( type == DCT_OP )
    ext_dct(input, output);
    else if ( type == IDCT_OP )
    ext_idct(input, output);
    */
}

CDCTAlgo::~CDCTAlgo(void)
{
}

void CDCTAlgo::ext_dct(uint8_t *matrix, int *dctres)
{
    double dct[64];
    int x, y, k, n;

    for ( n = 0; n < 8; n++ )
    for ( k = 0; k < 8; k++ )
    {
        dct[n * 8 + k] = 0;
        for ( y = 0; y <= 7; y++ )
        {
            for ( x = 0; x <= 7; x++ )
            {
                dct[n * 8 + k] += (double)matrix[y * 8 + x] * cos(((( 180 * (2*x+1)*k)/16)/rad)) * (cos(((180*(2*y+1)*n)/16)/rad));
            }
        }
        double zk, zn;
        zk = ( k == 0 ) ? sqrt(2)/2:1;
        zn = ( n == 0 ) ? sqrt(2)/2:1;
        dct[n * 8 + k] = dct[n * 8 + k] * (zk*zn)/4;
        dctres[n * 8 + k] = (int)extnd_round(dct[n * 8 + k]);
    }
}

void CDCTAlgo::ext_idct(int *dct, uint8_t *idctres)
{
    double inv[64];
    int x, y,n ,k;
    double zk, zn;

    for ( y = 0; y < 8; y++ )
    for ( x = 0; x < 8; x++ )
    {
        inv[y * 8 + x] = 0;
        for ( n = 0; n <= 7; n++ )
        {
            for ( k = 0; k <= 7; k++ )
           {
                 zk = ( k == 0 ) ? sqrt(2)/2:1;
                 zn = ( n == 0 ) ? sqrt(2)/2:1;
                 inv[y * 8 + x] += (dct[n * 8 + k] * cos(((( 180 * (2*x+1)*k)/16)/rad)) *
                 (cos(((180*(2*y+1)*n)/16)/rad)) ) * (zk);
            }
             inv[y * 8 + x] = inv[y * 8 + x] * zn;
        }
        inv[y * 8 + x] = inv[y * 8 + x] / 4;
        if ( inv[y * 8 + x] > 255 )
            inv[y * 8 + x] = 255;
        idctres[y * 8 + x] = (uint8_t)extnd_round(inv[y * 8 + x]);
    }
}

==============================================

snapshot of rtstegvideo application

Semoga sedikit berguna.

bersambung di posting berikutnya… 🙂 link code -> https://sourceforge.net/projects/rtstegvideo/

March 7, 2010

How To Build Medium root_fs for i386/x86

Filed under: Linux — deddihp @ 12:12 am
Tags: , ,

How To Build Medium root_fs for i386/x86

IDE
Membuat medium linux untuk keperluan testing dan beberapa kepentingan seperti :

  1. linux yang dibuild cukup kecil untuk dapat dimasukkan ke dalam flash disk atau block device sejenisnya.
  2. Dapat di boot oleh laptop, PC, x86 device standar lainnya.
  3. Dapat diinstall software untuk keperluan testing, seperti iptables, ebtables, brctl (bridge controller), vlan, pppoe server/client, pptp server/client, web server, database, nfs dll.
  4. Mudah dikonfigurasi, baik konfigur library maupun kernelnya.

DESIGN SYSTEM
Kita bisa membuat root_fs dengan merunut pada struktur root_fs beberapa Distro, untuk contoh disini menggunakan distro Debian, dengan beberapa modifikasi di file2 pada bagian library atau binary executable atau setting2 configurasi dll, atau dengan kata lain buang yang dirasa tidak penting untuk jadi root_fs, dan menyisakan file2 yang bersifat “kalo itu tidak dimasukin tidak akan bisa jalan”. 🙂

Membuat loop device
Command untuk membuat loop device

  • dd if=/dev/zero of=root_fs_i386 bs=1k count=30000

maksudnya adalah: buat file root_fs_i386 dengan isi /dev/zero (kosong) dengan block size sebesar 1kB (1kilo Bytes), copy sebesar count*bs BYTES (30000 * 1kB = 30 MB)

akan dihasilkan file root_fs_i386 sebesar 30MB (30720000 KB)

kemudian format root_fs_i386 dengan reiserfs filesystem :

  • mkreiserfs -f root_fs_i386

Mount loop root_fs_i386 ke suatu direktori, kemudian kopikan isi root_fs yang akan di buat ke dalam loop device tersebut.

  • mount -o loop root_fs_i386 /mnt/disk
  • cp -dpR myroot_fs/* /mnt/disk/

Check apakah root_fs kita benar dengan chroot :

  • chroot /mnt/disk

Setelah OK, di unmount

  • umount /mnt/disk

Compress root_fs

  • gzip root_fs_i386

akan dihasilkan root_fs_i386.gz

Untuk root_fs yang dibuat disini berukuran medium (sekitar 18M dimasukkan ke dalam loop device sebesar 30M). Memang agak besar kalau kita sebut mini root_fs, jadi supaya lebih pas kita bilang saja medium root_fs.

Interface Block Device yang kita inginkan adalah pada USB Flash Disk dan CFdi VIA menggunakan CF (Compact Flash/Block Device yang digunakan pada Embedded System). USB FD maupun CF punya keterbatasan tidak boleh terlalu sering di tulis, karena USB FD maupun CF punya umur maksimum berapa kali dia dapat ditulis, jadi kalo umurnya sudah sampai batas, CF tersebut akan tidak bisa dipakai lagi. Maka dari itu, sedapat mungkin kita bikin system yang memungkinkan CF tidak terlalu sering ditulis.

Solusi dari Masalah di atas cukup mudah, kita cukup load root_fs yang ada di CF ke dalam ramdisk. kita bisa membuat ramdisk_size per blok sebesar 30M pada saat BOOT lewat GRUB ato PXE, seperti contoh di bawah ini:

  • append initrd=root_fs_i386.gz root=/dev/ram0 ramdisk_size=30000

KERNEL

Kernel yang digunakan juga tidak bisa kernel yang digunakan secara default pada Debian ato Distro2 besar lainnya. Kita perlu config kernel lagi, supaya root_fs dapat di load ke system dengan selamat sampe muncul login prompt.

Perbedaan yang mendasar dari root_fs ini adalah tidak adanya kernel module yang biasanya kita jumpai di /lib/modules di Distro linux. Itu artinya kernel harus dibuild lengkap di dalam 1 file kernel (bzImage). Itu membuat kernel size yang digunakan agak membengkak. Jadi kita perlu menyertakan konfigurasi2 dasar seperti filesystem (ext2, ext3, reiserfs dll), config ethernet dll ke dalam kernel image, karena biasanya kernel yang ada di Distro besar menyertakan konfig filesystem ke dalam kernel module mereka, bukan pada kernel imagenya. Itu artinya kalo kita paksakan memakai default kernel Distro besar, kemungkinan besar akan KERNEL PANIC.

KERNEL CONFIGURATION
Untuk konfigurasi kernel sendiri memang agak membingungkan. Tapi seperti yang diutarakan di atas, kita tidak mempunyai kernel module, jadi module2 yang sekiranya digunakan untuk keperluan kita, harus kita bundle di dalam 1 file kernel image.
Contoh:

  • Untuk booting kita jelas perlu filesystem module supaya system kenal dengan filesystem yang ada di root_fs kita, jadi di KERNEL CONFIG bagian File System, FileSystem yang kita gunakan harus di load.
  • Untuk iptables kita perlu NETFILTER ato untuk NAT tables kita perlu CONNTRACK family, jadi di KERNEL CONFIG bagian Core Netfilter harus di load.

Untuk kernel yang digunakan di sini sudah support Filesystem, iptables, ppp dll. Silakan di coba sendiri.

FORMAT FILESYSTEM pada USB FD atau CF
Kita harus menentukan terlebih dahulu filesystem apa yang akan kita gunakan. Seperti contoh di bawah ini.
Format REISERFS FILESYSTEM
asumsikan CF ato USB FD ada di /dev/sdb1 (cek dengan command fdisk -l)

  • /sbin/mkreiserfs -q -f /dev/sdb1

BOOTING
untuk booting kita jelas memerlukan boot loader. Kita bisa menggunakan GRUB, LILO atau yang lain sesuai keinginan kita. Kalau kita menggunakan GRUB, ikuti cara2 dibawah ini:
untuk install grub di CF ato USB FD kita bisa pake command di bawah ini :
asumsikan CF ato USB FD di /dev/sdb1, maka kita perlu mount dulu

  • mount /dev/sdb1 /mnt/disk
  • /usr/sbin/grub-install –no-floppy –root-directory=/mnt/disk /dev/sdb > /dev/null

kemudian kita bisa lihat di /mnt/disk/ terdapat directory baru yaitu “boot”.
Buka dengan menggunakan text editor file device.map pada direktori /mnt/disk/boot/grub, kemudian ganti device dengan device yang sesuai. Contoh
file device.map:

  • (hd0) /dev/sda
  • (hd1) /dev/sdd

Buka dengan menggunakan text editor menu.lst di direktori /mnt/disk/boot/grub/menu.lst..
Isinya (sesuaikan dengan kondisi anda) :

  • timeout 1
  • title test_root_fs
    kernel (hd0,0)/bzimage
    initrd (hd0,0)/root_fs_i386.gz root=/dev/ram0 ramdisk_size=30000

COPY KERNEL IMAGE DAN ROOT_FS
Copy kernel image dan root fs ke CF mount point (/mnt/disk)

  • cp bzImage root_fs_i386.gz /mnt/disk

READY TO RUMBLE…..

image root_fs, konfigurasi dan kernel bisa didapatkan di http://sourceforge.net/projects/root-fs-i386/

Contoh Implementasi root_fs_i386 ini saya gunakan untuk booting pada board VIA dengan 4 port ethernet.

Board VIA
Board VIA

Board VIA
Board VIA

Dengan board 4 port kita bisa membuat mesin dengan fungsi sebagai berikut :

Switch with VLAN included

IPERF Server booted from PXE
IPERF Server booted from PXE

PPPoE Client

kita juga bisa membuat macam device, seperti mini-router, proxy server, pptp server, pppoe server dll.
akan kita bahas di posting selanjutnya.. 😀

March 6, 2010

my projects

Filed under: published projects — deddihp @ 1:57 pm

https://sourceforge.net/projects/rtstegvideo/
https://sourceforge.net/projects/rtpersonalid/

https://sourceforge.net/projects/simplepacman/

https://sourceforge.net/projects/simplesnake/

https://sourceforge.net/projects/root-fs-i386/

About UDP Protocol 2 ( Implementasi )

Filed under: About Socket — deddihp @ 1:32 pm
Tags: ,

Understanding JAVA Socket API UDP

Di bawah ini kita akan membuat aplikasi sederhana dengan menggunakan protokol UDP. Datagramserver akan menunggu secara terus menerus datagram paket yang akan dikirim oleh datagramclient. Datagramserver akan menggunakan port 1234 dalam melakukan koneksinya, datagramserver akan menerima string “latihan” dari datagramclient dan kemudian akan mencetaknya ke standard output ( monitor ). Untuk membangun socket application menggunakan protocol UDP, kita akan menggunakan class DatagramSocket.


Deklarasikan header untuk datagram socket dan packet

import java.net.DatagramPacket;

import java.net.DatagramSocket;

Deklarasikan class DataGramServer

public class DataGramServer

{

  private final static int BUFSIZE = 20;

                public static void main(String args[]) {

Membuat object DatagramSocket dengan port 1234

DatagramSocket ds = new DatagramSocket(1234);

Membuat object buffer dan DatagramPacket.

        byte buffer[] = new byte[BUFSIZE];

        DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

Datagramserver siap menerima paket yang dikirim datagram client dan mencetaknya ke standard output ( monitor ).

              ds.receive(dp);

  String str = new String(dp.getData());

  System.out.println(str);

Sinyal error Exception

catch (Exception e) {

      e.printStackTrace();

file : DataGramServer.java

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class DataGramServer

{

              private final static int BUFSIZE = 20;

  public static void main(String args[]) {

    try

                {

      DatagramSocket ds = new DatagramSocket(1234);

      while (true)

                  {

        byte buffer[] = new byte[BUFSIZE];

        DatagramPacket dp = new DatagramPacket(buffer, buffer.length);

         ds.receive(dp);

         String str = new String(dp.getData());

         System.out.println(str);

      }

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

compile DataGramServer.java

                            #javac DataGramServer.java

jalankan DataGramServer.class

                            #java DataGramServer

Dengan menjalankan command netstat kita akan menghasilkan status dibawah ini:

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address           Foreign Address         State

udp        0      0                             0.0.0.0:32769          0.0.0.0:*

udp        0      0                             0.0.0.0:161              0.0.0.0:*

udp        0      0                             0.0.0.0:1234            0.0.0.0:*

udp        0      0                             0.0.0.0:5353            0.0.0.0:*

Hasil keluaran netstat diatas diambil dengan perintah “netstat -avun” dengan sistem operasi Linux.

pada baris ketiga adalah status yang dihasilkan oleh DataGramServer.

DataGramServer akan mencetak string “latihan” ke standard output apabila DataGramClient telah mengirim string “latihan”.

DatagramClient.java

Deklarasi header

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

Deklarasi class DataGramClient

public class DataGramClient {

  public static void main(String args[]) {

set variable ia dengan hostname “127.0.0.1”

InetAddress ia = InetAddress.getByName("127.0.0.1");

Membuat object DatagramSocket

DatagramSocket ds = new DatagramSocket();

set buffer dengan string “latihan”. Membuat object DatagramPacket dengan port 1234

byte buffer[] = "latihan".getBytes();

DatagramPacket dp = new DatagramPacket(buffer, buffer.length, ia, 1234);

Send the datagram packet

Mengirim datagram packet ke server

ds.send(dp);

Sinyal error Exception

catch (Exception e) {

      e.printStackTrace();

    }

file : DataGramClient.java

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

public class DataGramClient

{

  public static void main(String args[])

{

    try

   {

      InetAddress ia = InetAddress.getByName("127.0.0.1");

      DatagramSocket ds = new DatagramSocket();

      byte buffer[] = "latihan".getBytes();

      DatagramPacket dp = new DatagramPacket(buffer, buffer.length, ia, 1234);

      // Send the datagram packet

      ds.send(dp);

    } catch (Exception e) {

      e.printStackTrace();

    }

  }

}

compile DataGramClient.java

                            #javac DataGramClient.java

jalankan DataGramClient.class

                            #java DataGramClient

Perlu diingat, aplikasi socket dengan menggunakan protocol UDP bersifat connectionless sehingga aplikasi client (DataGramClient) tidak akan memberikan pesan error apabila service yang coba dihubungkan tidak tersedia. Dengan kata lain, aplikasi client akan tetap mengirim paket dengan ada atau tidaknya service yang dituju. Apabila service yang dituju tidak ada, maka paket akan hilang.

About UDP Protocol 1

Filed under: About Socket — deddihp @ 1:30 pm
Tags: ,

Konsep UDP

UDP ( User Datagram Protocol ) adalah transport layer yang tidak andal ( unreliable ), connectionless dan merupakan kebalikan dari transport layer TCP. Dengan menggunakan UDP, setiap aplikasi socket dapat mengirimkan paket – paket yang berupa datagram. Istilah datagram diperuntukkan terhadap paket dengan koneksi yang tidak andal ( unreliable service ). Koneksi yang andal selalu memberikan keterangan apabila pengiriman data gagal, sedangkan koneksi yang tidak andal tidak akan mengirimkan keterangan meski pengiriman data gagal.

UDP tidak menjamin kevalidan data saat data sampai ke si penerima. Datagram yang sampai mempunyai kemungkinan tidak sampai, rusak, duplikasi atau hilang tanpa diketahui penyebabnya. Penggunaan UDP lebih tepat diperuntukkan untuk data – data kecil dengan jumlah banyak. Dengan perilaku UDP yang tidak berusaha untuk mengecek apakah data yang dikirim telah sampai atau tidak membuat UDP lebih cepat dan lebih efisien. Aplikasi – aplikasi yang bersifat real time seringkali menggunakan UDP sebagai protokolnya, hal tersebut dikarenakan paket yang hilang lebih bisa ditolerir daripada paket yang datang terlambat ( contoh aplikasi realtime: Video Streaming ). Tidak seperti TCP, UDP juga menyediakan jenis paket broadcast (mengirim paket ke local network) dan multicast (mengirim paket ke semua subscriber).

Dalam UDP, client tidak membangun koneksi dengan server, melainkan client hanya mengirim paket data ke server tanpa mengecek apakah server tersebut telah siap atau tidak. Sama halnya dengan server tidak menerima koneksi dengan fungsi accept, namun server hanya menjalankan perintah untuk menerima data, server akan terus menunggu sampai data diterima.

Perbedaan antara UDP dan TCP adalah :

  1. UDP adalah “datagram-oriented”, sedangkan TCP adalah “session-oriented”. Datagram adalah paket informasi self-contained. UDP berhubungan dengan datagram atau paket individu yang dikirim dari client ke server dan atau sebaliknya.
  2. UDP adalah connection-less. Client tidak membangun koneksi ke server sebelum mengirim data, client hanya mengirim data secara langsung.
  3. UDP adalah protokol yang tidak andal, dalam artian :
    • Paket dapat hilang. UDP tidak dapat mendeteksinya, sehingga pada program aplikasi client – server, metode transmisi ulang dikarenakan data rusak atau hilang harus dilakukan pada level aplikasi. Biasanya aplikasi menunggu hingga timeout habis, dan kemudian mencoba lagi.
    • Paket dapat mengalami kerusakan. Paket UDP berisi checksum semua data dalam paket. Checksum ini memungkinkan UDP mendeteksi kapan suatu paket mengalami kerusakan. Jika hal ini terjadi, maka paket tersebut dikeluarkan, dan sebagaimana biasa aplikasilah yang mendeteksi hal ini dan melakukan transmisi ulang seperlunya.
    • Karena UDP adalah datagram-oriented dan pada level protokol setiap paket berdiri sendiri, maka UDP tidak memiliki konsep paket sesuai urutan, yang selanjutnya berarti tidak memerlukan nomor urut pada paket tersebut.
    • Karena UDP tidak memerlukan mekanisme kontrol yang rumit, maka UDP dapat dianggap lebih mudah dan lebih kecil ( dalam hal baris data dan memori ) untuk diimplementasikan. Namun hal tersebut juga membuat UDP tidak cocok untuk sejumlah besar data.

Port in UDP

Tidak ada perbedaan fungsi yang signifikan antara port di UDP dan TCP. Seperti halnya TCP, port dalam UDP menggunakan 16-bit integer, port – port yang bisa digunakan adalah antara 1 sampai 65535. Port – port yang digunakan dibagi menjadi 3 bagian yaitu well-known port ( antara 1 – 1023), registered port ( 1024 – 49151 ) dan ephemeral port ( 49152 – 65535 ).

Contoh aplikasi – aplikasi yang menggunakan well-known port dan TCP sebagai transport layernya adalah : the Domain Name System (DNS), streaming media applications such as IPTV, Voice over IP (VoIP), Trivial File Transfer Protocol (TFTP) and online games.

Next Page »

Blog at WordPress.com.