Penggunaan program dimulai dengan menjalankan comand :
./sendfile <filename> <windowsize> <buffersize> <destination_ip> <destination_port>
pada terminal yang ingin digunakan sebagai pengirim. Keterangan:
- Tag filename diisi dengan nama file yang akan dikirim,
- Tag windowsize diisi dengan windowsize yang diinginkan,
- Tag buffersize diisi dengan besar buffer yang ingin dikirim,
- Tag destination_ip diisi dengan ip dari penerima file, dan
- Tag destination_port diisi dengan port yang digunakan oleh penerima untuk membangun koneksi dengan pengirim.
Setelah itu, membuka terminal lain yang ingin digunakan sebagai penerima dan menjalankan command
./recvfile <filename> <windowsize> <buffersize> <port>
Keterangan:
- Tag filename diisi dengan nama file yang akan dikirim,
- Tag windowsize diisi dengan windowsize yang diinginkan,
- Tag buffersize diisi dengan besar buffer yang ingin dikirim, dan
- Tag destination_port diisi dengan port yang digunakan oleh penerima untuk membangun koneksi dengan pengirim.
Sliding window protocol adalah salah suatu protokol control flow untuk melakukan transmisi data berbasis packet dan menjamin transmisi yang reliable. Secara konsep, setiap transmisi yang dilakukan dilengkapi dengan consecutive sequence number yang unik. Penerima akan menggunakan sequence number tersebut untuk mengurutkan paket yang diterima dan menolak paket yang duplikat serta mengidentifikasi paket yang hilang. Setelah suatu paket diterima oleh penerima, maka penerima akan mengembalikan suatu acknowledgement kepada pengirim. Tujuan dari pengiriman acknowledgement adalah memberi tahu pengirim bahwa paket sudah diterima dan penerima siap untuk menerima paket berikutnya.
Karakteristik dari protokol ini adalah paket dapat dikirimkan lebih dari satu. Jumlah paket yang dapat dikirim dalam satu kali pengiriman dianalogikan sebagai window size. Paket-paket yang berada dalam suatu window akan dikirimkan secara bersamaan. Paket-paket dalam window memiliki arti bahwa mereka sudah dikirim tetapi belum menerima ACK. Paket-paket yang berada sebelum window menandakan bahwa paket tersebut sudah terkirim dan sudah ACK. Paket-paket setelah window belum dikirim dan belum ACK. Ketika suatu paket menerima ACK, maka paket tersebut akan dikeluarkan dari window. Fenomena tersebut yang disebut sebagai sliding window, yaitu window seakan-akan bergeser dan menyesuaikan paket mana yang akan dikirim selanjutnya.
Cara kerja sliding window pada program:
- Pengirim dan penerima melakukan koneksi ke socket UDP.
- Pengirim membaca file dan memasukannya ke dalam file buffer (menggunakan fungsi
readToByte()). - Pengirim mulai melakukan copy sedikit demi sedikit data dari file buffer ke dalam buffer. Pemindahan data sebesar data yang akan dikirim. Terdapat variabel
currentSeqnumyang berfungsi sebagai penunjuk mulainya window pada buffer. Pada awal pengiriman, currentSeqNum diinisiasi dengan 0. - Pengirim mengirimkan pesan dengan fungsi
sendto(). - Pada sisi penerima, penerima mendengar (listen) pada port yang sudah didefinisikan dengan menggunakan
while(1). Pengirim akan menerima sejumlah paket. - Paket akan dicek headernya, bila headernya sama dengan -1, maka pengiriman file sudah selesai dan proses mendengar selesai.
- Paket-paket yang diterima akan dicek akan error dengan fungsi
isCheckSumEqual(). - Jika paket memiliki checksum yang valid, maka data dalam paket akan dicopy ke dalam buffer penerima. Setelah dicopy ke dalam buffer, maka penerima akan membuat paket ACK terhadap paket tersebut. NextSequenceNumber yang diisi pada ACK adalah sequence number pada paket yang diterima ditambah 1. AWS akan diisi dengan selisih dari buffersize dengan currentSeqNum dari window penerima. Jika hasil selisih lebih besar dari window size, maka AWS diisi dengan window size. Jika tidak, maka akan diisi dengan selisih tersebut.
- Di sisi pengirim, setelah pengirim selesai mengirim semua paket, maka pengirim akan mendengarkan (listen) untuk menerima ACK. Setiap ACK yang diterima akan dicek apakah checksumnya valid. Jika checksum valid, maka akan dilihat nextSequenceNumber. Setelah itu, currentSeqnum akan di-update dengan nextSequenceNumber.
- Proses diulang dari langkah ketiga. Ketika proses pengiriman selesai, program pengirim akan mengirimkan suatu paket dengan header -1. Jika buffer pada penerima penuh, maka akan dilakukan proses write dari buffer ke file buffer penerima, lalu buffer dikosongkan.
- Setelah proses pengiriman paket selesai, maka penerima akan melakukan proses write ke file yang dilakukan dengan fungsi
writeToFile().
13515081 Aldrich Valentino Halim : koneksi socket UDP, debugging makefile, fungsi sendfile, fungsi recvfrom, debugging sliding window, readme
13515084 Bethea Zia Davida : checksum, struktur data paket, struktur data ack, readme, debugging sliding window
13515120 Azis Adi Kuncoro : readToByte, writeToFile, debugging koneksi socket UDP, pembuatan makefile, fungsi sendfile, fungsi recvfrom, debugging sliding window
1. Apa yang terjadi jika advertised window yang dikirim bernilai 0? Apa cara untuk menangani hal tersebut?
Ketika advertised window yang dikirim bernilai 0, client tidak dapat menerima data lagi dan transmisi dihentikan sampai bisa memproses informasi dalam buffer yang diterima. Cara untuk menangani hal tersebut adalah :
- Mengubah mode pengirim yang aktif untuk mengirim packet menjadi sleep untuk beberapa saat, lalu mencoba untuk mengirim packet lagi
- Apabila penerima mendapat info advertised window yang bernilai 0, maka penerima akan melakukan pending pengiriman acknowledgment hingga advertised window bernilai lebih besar dari 0, setelah itu penerima baru mengirim ack berikutnya.
2. Sebutkan field data yang terdapat TCP Header serta ukurannya, ilustrasikan, dan jelaskan kegunaan dari masing-masing field data tersebut!
TCP Header terdiri dari:
Kegunaan dari Source Port Number adalah untuk mengetahui port dari pengirim data.
Kegunaan dari Destination Port Number adalah untuk mengetahui port dari penerima data.
Kegunaan dari Sequence Number adalah untuk menandai urutan dari data yang diterima, sehingga ketika nanti pecahan-pecahan data digabungkan, penerima tahu bagaimana urutannya.
Kegunaan dari Acknowledgement Number adalah memberitahukan sequence number dari data yang baru saja dikirim ataupun diterima.
Kegunaan dari Data Offset adalah untuk menyimpan ukuran dari TCP header dalam kelipatan 4 bytes.
Kegunaan dari Reserved Data adalah menyelaraskan total ukuran header menjadi kelipatan 4 bytes.
Kegunaan dari ECN adalah ekstensi control flags untuk mengatur data flow pada suatu kondisi yang spesifik.
Kegunaan dari Control Bits sama dengan ECN yaitu mengatur data flow pada suatu kondisi yang spesifik
Kegunaan dari Windows Size adalah untuk meregulasi berapa banyak data yang dikirim kepada receiver sebelum meminta acknowledgement sebagai timbal baliknya.
Kegunaan dari Checksum adalah untuk mendeteksi adanya data yang error atau corrupt.
Urgent Pointer bisa digunakan sebagai Data Offset untuk menandai subset dari sebuah data sebagai suatu prioritas untuk diproses.
Kegunaan dari Optional Data adalah mendukung untuk acknowledgement khusus dan algoritma window scaling.