TCP: Pelengkap IP


Internet Protocol (IP) adalah protokol yang tidak reliable. Jika terjadi kesalahan saat mengirim pesan, ia akan mengabaikan packet dan mengembalikan error ICMP saja. Untuk itu, TCP terlahir pada layer transport sebagai protokol yang dapat di-“andal”-kan (reliable). TCP adalah protokol yang rumit, yang terdiri atas sekumpulan software untuk menyediakan layanan komunikasi. Kali ini aku akan mempelajari bagian yang bisa dilihat dengan mata kepala sendiri dari TCP yaitu TCP Protocol Data Unit (PDU). TCP PDU adalah bagian yang dikirim sebagai packet. Berikut ini adalah contohnya:

xx xx 04 11 00 50 68 91   34 ad 00 00 00 00 70 02
40 00 a9 63 00 00 02 04   05 b4 01 01 04 02

Dua byte pertama menunjukkan informasi source port (dalam contoh adalah, 0x0411 atau port 1041) dan dua byte berikutnya menunjukkan informasi destination port (dalam contoh adalah 0x0050 atau port 80). TCP memanfaatkan port untuk membentuk komunikasi yang reliable. Kombinasi antara alamat IP dan nomor port disebut socket. Beberapa port yang berbeda di sebuah host dapat mengakses sebuah destination port yang sama, berkat penggunaan multiplexing. Sebagai contoh, sebuah server web yang membuka port 80 dapat melayani banyak pengunjung tanpa harus membuka port baru yang berbeda untuk setiap pengunjung.

Empat byte berikutnya adalah nilai sequence number. Nilai 0x689134AD disini dihasilkan secara acak. Jika seseorang dalam jaringan dapat menebak dan melanjutkan sequence number, maka ia dapat saja membajak komunikasi TCP kita (oleh sebab itu nilai sequence number diawali dengan angka acak). Empat byte setelah ini adalah acknowledgment number, yang nilainya adalah nilai sequence number untuk packet berikutnya (pada SYN, ini adalah nilai sequence number ditambah dengan 1).

Nilai acknowledgment number pada contoh adalah 0 karena ini adalah sebuah TCP open (awal dari komunikasi/SYN). Berikut ini adalah contoh jawaban dari host tujuan:

xx xx 00 50 04 11 93 cf  35 e5 68 91 34 ae 70 12
83 2c 9c 71 00 00 02 04  05 b4 01 01 01 04 02

Kali ini source port adalah port 80 dan destination adalah port 1041. Disini, host tujuan memiliki nilai sequence number (atau initial sequence number) tersendiri, yaitu 0x93cf35e5. Sementara nilai acknowledgment numbernya adalah 0x689134ae. Ini menunjukkan ia merespon packet yang aku kirim sebelumnya yang memiliki sequence number 0x689134ad.

Kembali ke TCP yang aku kirim pertama kali, empat byte setelah acknowledgment number memiliki nilai 0x7002, atau dalam binary berupa 0111 0000 0000 0010. Empat bit pertama menunjukkan ukuran header dalam satuan 32-bit (4 byte). Nilai disini adalah 0111 (atau 7 desimal) sehingga ukuran header adalah 7 x 4 byte = 28 byte. Empat bit berikutnya harus bernilai 0 (reserved). Setelah itu, setiap bit menunjukkan informasi flag berikut secara berurutan: CWR, ECE, URG, ACK, PSH, RST, SYN, FIN. Pada contoh, bit SYN bernilai 1, menunjukkan bahwa ini adalah awal dari koneksi. Sementara itu, pada contoh packet yang dikirim oleh server web, flag ACK dan SYN bernilai 1.

Dua byte setelah itu adalah ukuran window (range sequence number yang valid untuk diterima). Setelah itu ada dua byte checksum, dan dua byte urgent pointer. Nilai urgent pointer hanya dipakai jika flag URG bernilai 1. Setelah itu ada 8 byte options atau lebih (selalu kelipatan 8) atau tidak ada sama sekali. Setiap options diawali dengan sebuah byte yang disebut option number (nilai 1 untuk NOP, nilai 2 untuk maximum segment size, dsb), kemudian sebuah byte yang menunjukkan jumlah byte untuk option tersebut, lalu diikuti dengan nilai option jika ada.

Untuk membuat sebuah koneksi dari client ke server, TCP menggunakan three-way handshake. Client akan mengirim packet dengan flag SYN bernilai 1 ke server dan nilai sequence number yang acak, misalnya 0x689134ad. Lalu, server akan merespon dengan mengirim packet dengan flag SYN bernilai 1 dan ACK bernilai 1. Selain itu, packet ini juga harus memiliki acknowledgment number yang sesuai, misalnya pada contoh, 0x689134ae. Packet dari server sendiri memiliki sequence number yang acak, misalnya 0x93cf35e5. Berikutnya, client akan merespon dengan mengirim packet dengan flag ACK bernilai 1 ke server. Berdasarkan pada contoh, packet ini memiliki sequence number 0x689134ae dan acknowledgment number 0x93cf35e6. Koneksi baru terbentuk setelah proses handshake ini. Jika digambarkan, mungkin proses handshake akan terlihat seperti ini:

CLIENT                                   SERVER
  | SYN (SEQ=0x689134ad, ACK=0)  ----->   |
  |                                       |
  |                                       |
  | <------   SYN, ACK (SEQ=0x93cf35e5,   |       
  |                     ACK=0x689134ae)   |   
  |                                       |   
  |                                       |   
  | ACK (SEQ=0x689134ae,  ------------>   |
  |      ACK=0x93cf35e6)                  |

Setelah ini, proses transfer data dapat dilakukan. Misalnya, seperti pada proses berikut (nilai sequence number disini tidak ada hubungannya dengan yang sebelumnya):

CLIENT                                   SERVER
  |                                       |
  | ACK, PUSH (SEQ=0x38affe14,  ------->  |
  |            ACK=0x114c618c)            |
  |                                       |
  |                                       |
  | <--------- ACK (SEQ=0x114c618c,       |
  |                 ACK=0x38affff3)       |
  |                                       |
  |     DATA                              |
  | <--------- ACK (SEQ=0x114c618c,       |   
  |                 ACK=0x38affff3)       |   
  |                                       |   
  | ACK (SEQ=0x38affff3, ---------------> |
  |      ACK=0x114c66f0)                  |
  |                                       |
  |                                       |
  |     DATA                              |
  | <---------- ACK (SEQ=0x114c66f0,      |   
  |                  ACK=0x38affff3)      |   
  |                                       |   
  | ACK (SEQ=0x38affff3, ---------------> |
  |      ACK=0x114c6c54)                  |
  |                                       |
  |     DATA                              |
  | <---------- ACK (SEQ=0x114c6c54,      |
  |                  ACK=0x38affff3)      |

Koneksi TCP secara normal akan berakhir saat salah satu pihak mengirim packet dengan flag FIN aktif yang meminta penerima agar menutup koneksi. Si penerima akan merespon dengan ACK dan FIN ke pengirim agar sang pengirim juga ikut menutup koneksi.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: