Sliding Window implementation
-
Before installing project make sure the following prerequisites have been met.
-
Directory structure of this project
-
Install and running the project
We’ll download the code from its repository on GitHub.
-
How sendfile and recvfile works
-
Answer for questions in specification
-
See men behind the project and other people that contribute to this project
What things you need to install the software and how to install them
Installed :
GNU Make
(https://www.gnu.org/software/make/)g++
(https://gcc.gnu.org/)
.
├── Makefile
├── README.md
├── data
└── src
This project is intended to run on Linux/Mac workspace.
git clone https://github.com/rayandrews/sliding-window.git
cd sliding-window
make
- For Receiving File:
./recvile <filename> <windowsize> <buffersize> <port>
- For Sending File:
./sendfile <filename> <windowsize> <buffersize> <destination_ip> <destination_port>
-
Sendfile
- Ketika program sendfile dijalankan, input dari user akan diterima dan program akan membentuk suatu koneksi baru.
- Setelah itu, program akan membaca file inputan user dan memulai pengiriman file secara byte per byte.
- Program akan mengeksekusi fungsi send_data, yang dilakukan fungsi ini pertama kali adalah mengisi send buffer dengan data dari file.
- Setelah send buffer berisi, program mengambil data dari buffer dan menambahkan header-header yang diperlukan seperti sequence number, checksum, SOH, STX, ETX, dan data.
- Program akan mengirimkan byte yang diizinkan oleh kapasitas advertise window ke socket dengan ip tujuan dan port tujuan.
- Program menunggu ack dari receiver yang berisi next sequence.
- Setelah ack diterima akan dilakukan error-checking dengan checksum, jika tidak terjadi error, maka program akan membaca isi ack dan mengirimkan data dari buffer dengan sequence berikutnya. Jika terjadi error, maka akan ack ditolak.
- Jika terjadi timeout sebelum ack diterima, maka program akan mengirim ulang packet yang belum mendapat ack.
- Jika advertise window bernilai nol, maka akan diset menjadi satu untuk mengizinkan periodical probes.
- Setelah semua data berhasil ditransmisikan, akan dikirimkan sebuah paket yang menandakan akhir dari transmisi.
-
Recvfile
- Ketika program recvfile dijalankan, akan dibuat koneksi baru dari inputan user.
- Program akan mengeksekusi fungsi recv_data yang menunggu transmisi dari semua alamat.
- Ketika packet diterima, dilakukan pengecekan apakah packet EOT. Jika iya, maka program telah selesai dan jika tidak, maka program akan melanjutkan pembacaan.
- Packet yang diterima akan disimpan dalam buffer receiver.
- Program akan mengirimkan ack ke pengirim yang memiliki sequence number berikutnya dari packet yang dikirim.
- Program mengambil data dari buffer receiver dan menghapus buffer tersebut serta menuliskan data tersebut ke dalam file.
-
Jika advertised window yang dikirim bernilai 0, maka menunjukkan bahwa buffer receiver telah penuh. Cara menanganinya adalah dengan menyimpan frame yang akan dikirim dan menunggu hingga buffer receiver mampu menampung frame baru yang akan dikirimkan sender.
-
TCP Header
Source Port (16 bits) | Destination Port (2 bits) | |||
Sequence Number (32 bits) | ||||
Acknowledgment Number (32 bits) | ||||
Data offset | Reserved | TCP Flag | Window Size (16 bits) | |
(4 bits) | (3 bits) | (9 bits) | ||
Checksum (16 bits) | Urgent Pointer (16 bits) | |||
Options (0 or 32 bits optional) |
- Source Port: Port sender
- Destination Port: Port receiver
- Sequence Number: Sequence number dari oktet data pertama di dalam segment (kecuali terdapat SYN). Jika terdapat SYN, dan sequence number merupakan initial sequence number (ISN), maka oktet data pertama adalah ISN+1.
- Acknowledgment Number: Merupakan segment yang dibutuhkan oleh segmen TCP dengan flag ACK diset bernilai 1, dan mengindikasi oktet dalam byte yang diharapkan diterima oleh pengirim dari pengirim di pengiriman berikutnya.
- Data Offset: 4 bit yang menunjukkan size dari TCP Header dalam 32 bit words. Mengindikasi di offset berapa data dimulai dan panjang dari TCP Header merupakan kelipatan 32 bit.
- Reserved: Untuk keperluan ke depannya dan harus diset dengan nilai nol.
- TCP Flags: Mengandung 9 flag dengan ukuran 1 bit
- NS : ECN-nonce concealment protection (merupakan flag eksperimental)
- CWR : diset jika menerima packet yang mempunyai ECE flag dan sudah memiliki congestion control mechanism.
- ECE : ECN Capable jika SYN bernilai 1, apabila bernilai 0 mengindikasi terjadinya kemacetan di network.
- URG : mengindikasi diperlukannya field urgent
- ACK : mengindikasi diperlukannya acknowledgment, semua packet setelah initial packet dengan SYN flag membutuhkan flag ini
- PSH : push buffered data ke aplikasi penerima
- RST : mereset koneksi
- SYN : untuk menandakan paket pertama yang dikirim dan diterima
- FIN : menandakan paket terakhir yang dikirim sender
- Window Size : Berisi size dari receive window
- Checksum : Berisi 16 bit yang digenerate dari kumpulan field diatas dan digunakan untuk error-checking
- Urgent Pointer : Bila URG flag diset, maka field ini berisi offset dari sequence number yang menunjuk ke last byte dari urgent data
- Options : Size dari option ditentukan oleh data offset dan memiliki hingga 3 buah field yaitu Option-Kind, Option-Data, dan Option-Length
- Jonathan Christopher [13515001] - nathanchrs
- Packet, Send_connection, sendfile, socket
- Winarto [13515061] - yowinarto
- AckPacket, Recv_connection, Checksum, Utils
- Ray Andrew [13515073] - rayandrews
- AckPakcet, Recv_connection, Logger, recvfile