Protokol Kendali Transmisi

**Protokol Kendali Transmisi** atau ***Transmission Control Protocol*** (***TCP***) adalah suatu protokol yang berada di lapisan transport (baik itu dalam tujuh lapis model referensi OSI atau model DARPA) yang berorientasi sambungan (*connection-oriented*) dan dapat diandalkan (*reliable*). TCP dispesifikasikan dalam RFC 793.

## Sejarah

Saat Vint Cerf dan Bob Kahn pertama menulis spesifikasi atas protokol ini tahun 1973, internet masih merupakan media yang dilarang untuk keperluan komersial. Di bulan May 1974, IEEE memublikasikan makalah berjudul "*Protokol sebagai paket interkoneksi jaringan.*" Sebagai penulis makalah tersebut, Cerf dan Kahn menjabarkan sebuah protokol interkoneksi untuk berbagi layanan dengan memanfaatkan pertukaran-paket antara node jaringan yang terhubung. Komponen pengontrol utama atas model ini disebut sebagai "*Program pengontrol transmisi*" yang
menggabungkan baik tautan koneksi teriorientasi dan layanan datagram antar *host*. Program pengontrol transmisi monolitik ini kemudian dipecah ke dalam arsitektur modular yang terdiri atas *Protokol pengontrol transmisi* pada lapisan koneksi terorientasi dan *Protokol internet* pada lapisan datagram. Model inilah yang kemudian dikenal dengan istilah *TCP/IP*, meski secara formal istilah yang digunakan adalah *Paket protokol internet*.

## Cirikhas TCP
TCP memiliki cirikhas sebagai berikut:
* Berorientasi sambungan (*connection-oriented*): Sebelum data dapat ditransmisikan antara dua host, dua proses yang berjalan pada lapisan aplikasi harus melakukan negosiasi untuk membuat sesi koneksi terlebih dahulu. Koneksi TCP ditutup dengan menggunakan proses terminasi koneksi TCP (TCP connection termination).
* *[[Duplex|Full-duplex]]*: Untuk setiap host TCP, koneksi yang terjadi antara dua host terdiri atas dua buah jalur, yakni jalur keluar dan jalur masuk. Dengan menggunakan teknologi lapisan yang lebih rendah yang mendukung full-duplex, maka data pun dapat secara simultan diterima dan dikirim. Header TCP berisi nomor urut (TCP sequence number) dari data yang ditransmisikan dan sebuah acknowledgment dari data yang masuk.
* Dapat diandalkan (*reliable*): Data yang dikirimkan ke sebuah koneksi TCP akan diurutkan dengan sebuah nomor urut paket dan akan mengharapkan paket *[[ACK|positive acknowledgment]]* dari penerima. Jika tidak ada paket Acknowledgment dari penerima, maka segmen TCP (protocol data unit dalam protokol TCP) akan ditransmisikan ulang. Pada pihak penerima, segmen-segmen duplikat akan diabaikan dan segmen-segmen yang datang tidak sesuai dengan urutannya akan diletakkan di belakang untuk mengurutkan segmen-segmen TCP. Untuk menjamin integritas setiap segmen TCP, TCP mengimplementasikan penghitungan TCP Checksum.
* *Byte stream*: TCP melihat data yang dikirimkan dan diterima melalui dua jalur masuk dan jalur keluar TCP sebagai sebuah *byte stream* yang berdekatan (kontigu). Nomor urut TCP dan nomor acknowlegment dalam setiap header TCP didefinisikan juga dalam bentuk byte. Meski demikian, TCP tidak mengetahui batasan pesan-pesan di dalam byte stream TCP tersebut. Untuk melakukannya, hal ini diserahkan kepada protokol lapisan aplikasi (dalam DARPA Reference Model), yang harus menerjemahkan byte stream TCP ke dalam "bahasa" yang ia pahami.
* Memiliki layanan *flow control*: Untuk mencegah data terlalu banyak dikirimkan pada satu waktu, yang akhirnya membuat "macet" jaringan internetwork IP, TCP mengimplementasikan layanan *flow control* yang dimiliki oleh pihak pengirim yang secara terus menerus memantau dan membatasi jumlah data yang dikirimkan pada satu waktu. Untuk mencegah pihak penerima untuk memperoleh data yang tidak dapat disangganya (*buffer*), TCP juga mengimplementasikan *flow control* dalam pihak penerima, yang mengindikasikan jumlah *buffer* yang masih tersedia dalam pihak penerima.
* Melakukan segmentasi terhadap data yang datang dari lapisan aplikasi (dalam *[[DARPA Reference Model]]*)
* Mengirimkan paket secara "*one-to-one*": hal ini karena memang TCP harus membuat sebuah sirkuit logis antara dua buah protokol lapisan aplikasi agar saling dapat berkomunikasi. TCP tidak menyediakan layanan pengiriman data secara *one-to-many*.

TCP umumnya digunakan ketika protokol lapisan aplikasi membutuhkan layanan transfer data yang bersifat andal, yang layanan tersebut tidak dimiliki oleh protokol lapisan aplikasi tersebut. Contoh dari protokol yang menggunakan TCP adalah HTTP dan FTP.

## Segmen TCP
Segmen-segmen TCP akan dikirimkan sebagai datagram-datagram IP (datagram merupakan satuan protocol data unit pada lapisan ''internetwork''). Sebuah segmen TCP terdiri atas sebuah *header* dan segmen data (*payload*), yang dienkapsulasi dengan menggunakan *header* IP dari protokol IP.

Sebuah segmen dapat berukuran hingga 65495 byte: 216-(ukuran header IP terkecil (20 byte)+ukuran header TCP terkecil (20 byte)). *Datagram* IP tersebut akan dienkapsulasi lagi dengan menggunakan header protokol network interface (lapisan pertama dalam DARPA Reference Model) menjadi frame lapisan Network Interface. Gambar berikut mengilustrasikan data yang dikirimkan ke sebuah host.

Di dalam header IP dari sebuah segmen TCP, *field* **Source IP Address** diatur menjadi alamat *unicast* dari sebuah antarmuka host yang mengirimkan segmen TCP yang bersangkutan. Sementara itu, field **Destination IP Address** juga akan diatur menjadi alamat *unicast* dari sebuah antarmuka host tertentu yang dituju. Hal ini dikarenakan, protokol TCP hanya mendukung transmisi *one-to-one*.

## Header TCP
Ukuran dari header TCP adalah bervariasi, yang terdiri atas beberapa field yang ditunjukkan dalam gambar dan tabel berikut. Ukuran TCP header paling kecil (ketika tidak ada tambahan opsi TCP) adalah 20 byte.

## Port TCP
Port TCP mampu mengindikasikan sebuah lokasi tertentu untuk menyampaikan segmen-segmen TCP yang dikirimkan yang diidentifikasi dengan **TCP Port Number**. Nomor-nomor di bawah angka 1024 merupakan port yang umum digunakan dan ditetapkan oleh [IANaplikasi, sementara port UDP merepresentasikan sebuah antrean pesan UDP untuk protokol lapisan aplikasi. Selain itu, protokol lapisan aplikasi yang menggunakan port TCP dan port UDP dalam nomor yang sama juga tidak harus sama. Sebagai contoh protokol [Extended Filename Server (EFS) menggunakan port TCP dengan nomor 520, dan protokol Routing Information Protocol (RIP) menggunakan port UDP juga dengan nomor 520. Jelas, dua protokol tersebut sangatlah berbeda! Karenanya, untuk menyebutkan sebuah nomor port, sebutkan juga jenis port yang digunakannya, karena hal tersebut mampu membingungkan (ambigu).

Lihat juga Port TCP dan UDP

## TCP Flag
Sebuah segmen TCP dapat memiliki flag (tanda-tanda) khusus yang mengindikasikan segmen yang bersangkutan, seperti yang disebutkan dalam tabel berikut:

### TCP Three-way handshake

Proses pembuatan koneksi TCP disebut juga dengan "**Three-way Handshake**". Tujuan metode ini adalah agar dapat melakukan sinkronisasi terhadap nomor urut dan nomor acknowledgement yang dikirimkan oleh kedua pihak dan saling bertukar ukuran TCP Window. Prosesnya dapat digambarkan sebagai berikut:
* *Host* pertama (yang ingin membuat koneksi) akan mengirimkan sebuah segmen TCP dengan flag SYN diaktifkan kepada *host* kedua (yang hendak diajak untuk berkomunikasi).
* *Host* kedua akan meresponsnya dengan mengirimkan segmen dengan *[[acknowledgment]]* dan juga SYN kepada *host* pertama.
* *Host* pertama selanjutnya akan mulai saling bertukar data dengan host kedua.

TCP menggunakan proses jabat tangan yang sama untuk mengakhiri koneksi yang dibuat. Hal ini menjamin dua *host* yang sedang terkoneksi tersebut telah menyelesaikan proses transmisi data dan semua data yang ditransmisikan telah diterima dengan baik. Itulah sebabnya, mengapa TCP disebut dengan koneksi yang *reliable*..

## Referensi

* W. Richard Stevens. TCP/IP Illustrated, Volume 1: The Protocols. ISBN 0-201-63346-9
* W. Richard Stevens and Gary R. Wright. TCP/IP Illustrated, Volume 2: The Implementation. ISBN 0-201-63354-X
* W. Richard Stevens. TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols. ISBN 0-201-63495-3

## Pranala luar
* RFC 675 - Specification of Internet Transmission Control Program, December 1974 Version
* RFC 793 - TCP v4
* RFC 1122 - includes some error corrections for TCP
* RFC 1323 - TCP-Extensions
* RFC 1379 - Extending TCP for Transactions—Concepts
* RFC 1948 - Defending Against Sequence Number Attacks
* RFC 2018 - TCP Selective Acknowledgment Options
* RFC 2988 - Computing TCP's Retransmission Timer
* RFC 4614 - A Roadmap for TCP Specification Documents
* RFC 5681 - TCP Congestion Control
* Oral history interview with Robert E. Kahn, Charles Babbage Institute, University of Minnesota, Minneapolis. Focuses on Kahn's role in the development of computer networking from 1967 through the early 1980s. Beginning with his work at Bolt Beranek and Newman (BBN), Kahn discusses his involvement as the ARPANET proposal was being written, his decision to become active in its implementation, and his role in the public demonstration of the ARPANET. The interview continues into Kahn's involvement with networking when he moves to IPTO in 1972, where he was responsible for the administrative and technical evolution of the ARPANET, including programs in packet radio, the development of a new network protocol (TCP/IP), and the switch to TCP/IP to connect multiple networks.
* IANA Port Assignments
* John Kristoff's Overview of TCP (Fundamental concepts behind TCP and how it is used to transport data between two endpoints)
* TCP fast retransmit simulation animated: slow start, sliding window, duplicated Ack, congestion window
* TCP, Transmission Control Protocol 
* Checksum example
* Engineer Francesco Buffa's page about Transmission Control Protocol 
* TCP tutorial 
* Linktionary on TCP segments 
* TCP Sliding Window simulation animated (ns2)
* Multipath TCP in Linux kernel