Secara pribadi saya bahkan tidak merasa perlu ACK. Lebih cepat jika kita hanya mengirim NACK (n) untuk paket yang hilang alih-alih mengirim ACK untuk setiap paket yang diterima. Jadi kapan / situasi mana yang akan digunakan ACK di NACK dan sebaliknya?
protocol-theory
nFu9DT
sumber
sumber
Jawaban:
Alasan ACK adalah bahwa NACK tidak cukup. Katakanlah saya mengirimkan aliran data segmen X (misalkan 10 untuk kesederhanaan).
Anda berada di koneksi yang buruk, dan hanya menerima segmen 1, 2, 4, dan 5. Komputer Anda mengirimkan NACK untuk segmen 3, tetapi tidak menyadari harus ada segmen 6-10 dan tidak NACK itu.
Jadi, saya mengirim ulang segmen 3, tetapi kemudian komputer saya salah percaya bahwa data berhasil dikirim.
ACK memberikan jaminan bahwa segmen telah tiba di tujuan.
Jika Anda ingin aplikasi menangani urutan data dan transmisi ulang, Anda dapat memilih untuk menggunakan protokol seperti UDP (misalnya, seperti halnya TFTP).
sumber
Semuanya bermuara pada distribusi probabilitas kerugian dan pola lalu lintas.
Ambil contoh tautan nirkabel biasa, dengan tingkat kehilangan 10-30% stabil. Jika Anda menerima setiap frame yang diterima (seperti 802.11abg), Anda akan dengan cepat mendeteksi kapan sebuah frame telah hilang, sehingga Anda tidak akan kehilangan waktu untuk menunggu timeout.
Jika Anda ke NAK, Anda akan menjadi tergantung pada pola lalu lintas: - Jika Anda mengirim satu paket permintaan dan mengharapkan jawaban, dan permintaan itu hilang, Anda harus memiliki batas waktu yang kedaluwarsa jika Anda tidak mendapatkan menjawab. - Jika Anda hanya mengirim aliran paket ke penerima yang sebagian besar bisu, maka dapat diterima untuk hanya menerima NAK ketika penerima menerima paket berikutnya. Tapi ini berarti bahwa penerima harus menyusun ulang paket dan bahwa pengirim harus melacak tumpukan pesan yang telah dikirim.
(coba tebak solusi yang dipilih 802.11n? keduanya. Receiver mengirimkan bitmap panjang variabel dari frame yang telah diterimanya)
Sekarang ambil jaringan internet yang khas: Anda memiliki hampir 0% paket loss, sampai sesuatu yang buruk terjadi, dan Anda memiliki hampir 100% packet loss untuk waktu tertentu mengikuti beberapa undang-undang distribusi eksponensial, dari gangguan 200 ms menjadi satu menit dan satu setengah.
Mengakses setiap paket akan tampak sia-sia dalam jaringan yang tidak merugi, sampai Anda mempertimbangkan kasus ketika tautan terputus: Anda tidak akan menerima ACK atau NACK untuk kemungkinan waktu yang diperpanjang, dan penerima biasanya tidak akan mengirim apa pun hingga tautan dipulihkan.
Jika Anda menggunakan ACK, pengirim akan berhenti mengirim dan menyimpan simpanannya hingga tautan dipulihkan. Jika Anda menggunakan NACK sebagai gantinya, maka penerima pada akhirnya dapat memberi tahu Anda bahwa ia belum menerima paket yang jatuh dari simpanan pengirim sejak lama, dan koneksi pada dasarnya tidak dapat dipulihkan.
sumber
ACK berguna dalam sliding window protocols, mereka memungkinkan Transmitter A mengetahui bahwa data yang dikirim telah diterima oleh remote B. Transmitter A kemudian dapat melanjutkan untuk mengirim data berikutnya - sampai jendela transmitnya penuh (data dikirim ke jarak jauh tetapi belum diakui).
ACK dapat dianggap lebih penting daripada NAK. NAK hanya memungkinkan pemulihan yang lebih cepat , dalam kasus di mana paket / blok yang dikirim oleh A tidak diterima oleh B, dan B mendeteksi dengan beberapa cara bahwa paket / blok hilang.
Sangat layak untuk merancang protokol yang mendukung transfer dan kontrol aliran yang andal hanya dengan ACK, tanpa NAK (dengan transmisi ulang oleh Transmitter jika Transmitter tidak menerima ACK, mekanisme transmisi ulang yang diperlukan dalam kasus apa pun).
sumber
Satu hal terpenting yang ingin saya tambahkan di sini, di TCP, kami TIDAK mengirim ACK untuk SETIAP PAKET YANG DITERIMA.
Namun, ACK dikirim hanya untuk PAKET TERAKHIR YANG DITERIMA.
Tolong koreksi saya jika saya salah.
sumber