pengakuan oleh TCP tidak menjamin bahwa data telah dikirimkan


11

Di RFC 793 ada bagian tentang pengakuan segmen TCP:

Ketika TCP mentransmisikan segmen yang berisi data, ia menempatkan salinan pada antrian pengiriman ulang dan memulai timer; ketika pengakuan untuk data itu diterima, segmen dihapus dari antrian. Jika pengakuan tidak diterima sebelum timer habis, segmen dikirim ulang.

Pengakuan oleh TCP tidak menjamin bahwa data telah dikirim ke pengguna akhir , tetapi hanya bahwa penerima TCP telah mengambil tanggung jawab untuk melakukannya.

Sekarang, ini menarik. Di NOC kami, kami sering memecahkan masalah konektivitas antara jaringan kami dan jaringan klien eksternal dan setiap kali kami mengendus lalu lintas pada firewall dan melihat SYN dan ACK bit dikirim dan diterima di kedua arah, kami menganggap bahwa konektivitas dibuat dan masalah tidak ada lakukan dengan jaringan.

Tapi sekarang RFC ini membuat saya berpikir - apa lagi yang harus saya periksa (tanpa mengatur Wireshark) jika koneksi TCP dibuat tetapi pengguna masih mengalami masalah konektivitas?


5
Apa arti kalimat ini hanyalah makna bahasa Inggris dari kalimat: fakta bahwa driver jaringan menerima data (dan mengakui penerimaan) tidak menjamin bahwa pengguna akhir menerima data. Mungkin ada bug di server web, misalnya. Berkenaan dengan pertanyaan penutup Anda: satu-satunya cara untuk mengetahui apakah pengguna akhir menerima data, adalah menelepon mereka dan menanyakannya.
Jörg W Mittag

Jawaban:


24

Bagian dari RFC ini adalah tentang menyerahkan tanggung jawab ke sistem operasi atau apa pun tahap proses selanjutnya. Ini pada dasarnya berkaitan dengan pemisahan lapisan.

Pengakuan oleh TCP tidak menjamin bahwa data telah dikirim ke pengguna akhir, tetapi hanya bahwa penerima TCP telah mengambil tanggung jawab untuk melakukannya.

Saya selalu memikirkannya seperti ini:

  • OS dapat macet antara pengiriman ACK dan data yang mencapai proses klien ("klien" di sini berarti klien dari OS, bukan "klien jaringan")
  • Proses klien bisa buggy atau crash, atau hanya lebih lambat dari yang diperkirakan untuk menyelesaikan untuk berurusan dengan data yang masuk, atau memang hanya membacanya dalam keadaan yang tidak jelas
  • Jika klien mengirim data dan seterusnya, mungkin ke file disk, file tersebut mungkin belum ditulis atau memerah
  • Jika klien mengirim data dan seterusnya oleh TCP, sisi jauh TCP mungkin tidak mengirimkan data, menerima ACK, atau proses jauh berhasil mengkonsumsi data

Semua yang dikatakannya adalah bahwa ini adalah pengakuan lapisan 3 ("Saya mendengar byte Anda") bukan pengakuan lapisan yang lebih tinggi . Pertimbangkan misalnya perbedaan antara ACK TCP, SMTP 250 OKsetelah gateway email next-hop menerima pesan, pesan penerimaan pesan (misalnya per RFC 3798 ), piksel pelacakan yang dibuka pesan, catatan terima kasih dari PA, dan sebuah jawaban yang mengatakan "Ya, aku akan melakukannya."

Contoh konkret lainnya adalah printer:

  • Itu harus ACK data awal sebelum tahu apa akhir itu berisi (mungkin file Postscript dimulai dengan pustaka yang disertakan lebih besar dari jendela transmisi TCP)
  • Mungkin berisi permintaan status ("apakah Anda memiliki kertas?", Yang jelas dapat dieksekusi)
  • Mungkin berisi perintah cetak ("tolong cetak ini", yang mungkin gagal, jika kehabisan kertas)

Saya akan menyarankan bahwa jika pengguna melihat dan mengirim ACK tetapi masih mengalami masalah konektivitas, itu adalah urutan besarnya kemungkinan bahwa ada masalah kemacetan, OS, atau aplikasi daripada apa pun yang terkait dengan jaringan.

Untuk mendiagnosis saya sarankan mencari transmisi ulang, daripada ACK secara khusus.


Butir lain: bahkan jika proses klien berjalan dengan baik, itu mungkin belum membaca data.
Barmar

1
Proses klien (jika merasa malas atau sesat) mungkin tidak pernah memanggil recv()soket, dalam hal ini data yang diterima akan tetap berada di buffer-terima soket TCP tanpa batas.
Jeremy Friesner

Terima kasih keduanya, memperbaruinya untuk menyarankan proses klien bisa lambat, bermasalah, berubah-ubah.
jonathanjo

Anda tidak dapat mengandalkan ACK untuk memastikan bahwa aplikasi memproses input Anda, Anda harus menerapkan lapisan aplikasi ACK atau Periksa. Untuk menempatkan ini dalam konteks lain. Untuk jaringan kontrol industri yang menggunakan TSN dengan IP Stack di sisi klien, TCP ACK tidak cukup untuk menjamin bahwa variabel proses terkunci. Artinya, Anda tidak dapat mengandalkan TCP ACK untuk menempatkan sistem dalam keadaan aman atau dapat diservis, Anda harus memiliki pengakuan dari layanan lapisan aplikasi bahwa aman untuk memasukkan tangan Anda ke dalam mesin.
Crasic

10

Dari perspektif RFC, "pengguna akhir" adalah aplikasi. Tidak ada jaminan bahwa aplikasi mendapatkan data, hanya saja proses TCP menerimanya.

Dari perspektif NOC Anda, jaringan berfungsi dan data mencapai host akhir. Agaknya, hanya itu yang Anda pedulikan.


0

Anda bisa melihatnya dengan cara ini.

Anda adalah M.Smith dan Anda ingin mengirim surat ke M.Toto (orang adalah lapisan aplikasi).

Untuk mengirim surat, Anda pergi ke kantor pos setempat A yang akan mengirim surat ke M.Toto kantor pos lokal B (kantor pos adalah lapisan TCP).

Semuanya dapat berjalan dengan baik di antara Anda, kantor pos A dan kantor pos B - B akan mengirim ACK ke kantor pos A. Tetapi tidak ada yang menjamin bahwa surat itu akan sampai ke M.Toto. Apa pun bisa terjadi antara kantor pos B dan M.Toto.

Pada dasarnya itulah yang dikatakan RFC.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.