Bisakah paket TCP tiba ke penerima demi bagian?
Misalnya, jika saya mengirim 20 byte menggunakan protokol TCP, dapatkah saya 100% yakin bahwa saya akan menerima tepat 20 byte sekaligus, bukan 10 byte kemudian 10 byte lagi atau lebih?
Dan pertanyaan yang sama untuk protokol UDP.
Saya tahu bahwa UDP tidak dapat diandalkan dan paket tidak dapat tiba sama sekali atau tiba dalam urutan yang berbeda, tetapi bagaimana dengan satu paket? Jika tiba, bisakah saya yakin itu paket lengkap, bukan sepotong?
networking
tcp
udp
iamnp
sumber
sumber
Jawaban:
Iya nih. IP mendukung fragmentasi, meskipun TCP umumnya mencoba menentukan jalur MTU dan menjaga paketnya lebih kecil dari itu untuk alasan kinerja. Fragmentasi meningkatkan tingkat kehilangan datagram serempak. Jika jalur memiliki tingkat kehilangan paket 10%, memecah datagram menjadi dua paket membuat tingkat kehilangan datagram hampir 20%. (Jika salah satu paket hilang, datagram hilang.)
Anda tidak perlu khawatir tentang ini, dan juga lapisan TCP. Lapisan IP merakit kembali paket menjadi seluruh datagram.
Tidak, tapi itu tidak ada hubungannya dengan paket. TCP, pada dasarnya, adalah protokol byte stream yang tidak mempertahankan batas-batas pesan aplikasi.
Hal yang sama berlaku untuk TCP. Paket adalah paket. Perbedaannya adalah bahwa TCP telah mencoba ulang dan menyusun ulang yang dibangun ke dalam protokol sedangkan UDP tidak.
Tidak, tapi itu bukan masalahmu. Protokol UDP menangani perakitan kembali datagram. Itu bagian dari tugasnya. (Pada kenyataannya, protokol IP melakukan ini untuk protokol UDP, jadi UDP melakukannya hanya dengan dilapiskan di atas IP.) Jika datagram terbagi menjadi dua paket, protokol IP akan menyusun kembali untuk protokol UDP, sehingga Anda akan melihat data lengkap.
sumber
Anda tidak dapat memastikan bahwa mereka benar-benar tiba secara fisik sekaligus. Lapisan tautan Data di bawah TCP / UDP mungkin membagi paket Anda jika mereka mau. Terutama jika Anda mengirim data melalui internet atau jaringan apa pun di luar kendali Anda, sulit untuk diprediksi.
Tetapi tidak masalah apakah datanya tiba dalam satu paket atau beberapa paket di penerima. OS harus mengabstraksi penyatuan paket-paket ini, jadi untuk aplikasi Anda, sepertinya semuanya tiba sekaligus. Jadi, kecuali Anda adalah peretas kernel, dalam banyak kasus Anda tidak perlu khawatir jika data ini ditransfer dalam satu atau banyak paket.
Untuk UDP OS juga akan melakukan beberapa abstraksi, sehingga aplikasi yang menerima data tidak harus tahu berapa banyak paket data yang telah dikirimkan. Tetapi perbedaan TCP adalah bahwa tidak ada jaminan untuk data benar-benar tiba. Mungkin juga bahwa data dibagi menjadi beberapa paket, dan beberapa di antaranya tiba dan sebagian tidak. Untuk aplikasi penerima itu tetap saja tampak seperti aliran data, tidak masalah apakah itu lengkap atau tidak.
sumber
Contohnya. Blok karakter yang berdekatan sesuai dengan pengiriman () panggilan:
TCP:
Semua data yang dikirim diterima secara berurutan, tetapi tidak harus dalam potongan yang sama.
UDP:
Data tidak harus dalam urutan yang sama, dan tidak harus diterima sama sekali, tetapi pesan dipertahankan secara keseluruhan.
sumber
Tidak, TCP adalah protokol streaming, ini menyimpan data dalam urutan tetapi tidak mengelompokkannya melalui pesan. Di sisi lain UDP berorientasi pada pesan, tetapi tidak dapat diandalkan. SCTP memiliki yang terbaik dari kedua dunia tetapi tidak dapat digunakan secara alami karena NAT menghancurkan Internet.
sumber
Ada beberapa jaminan bahwa jika Anda mengirim 20 byte di awal aliran TCP, itu tidak akan tiba sebagai dua buah 10 byte. Ini karena TCP stack tidak akan mengirim segmen sekecil itu: ada ukuran MTU minimum. Namun, jika pengiriman ada di mana saja di tengah aliran, semua taruhan dibatalkan. Bisa jadi stack protokol Anda membutuhkan 10 byte data untuk mengisi segmen dan mengirimkannya, dan kemudian sepuluh byte berikutnya pergi ke segmen lain.
Tumpukan protokol Anda memecah data menjadi potongan-potongan dan menempatkannya ke dalam antrian. Ukuran chunk didasarkan pada jalur MTU. Jika Anda melakukan operasi pengiriman, dan masih ada data yang antri menunggu, tumpukan protokol biasanya akan mengintip segmen yang berada di ujung antrian dan melihat apakah ada ruang di segmen itu untuk menambahkan lebih banyak data. Ruangan bisa sekecil satu byte, sehingga bahkan pengiriman dua byte dapat dipecah menjadi dua.
Di sisi lain, segmentasi data berarti bahwa mungkin ada pembacaan parsial. Operasi penerimaan berpotensi bangun dan mendapatkan data ketika sedikitnya satu segmen tiba. Dalam API soket yang diterapkan secara luas, panggilan terima dapat meminta 20 byte, tetapi bisa kembali dengan 10. Tentu saja, lapisan penyangga dapat dibangun di atasnya yang akan memblokir hingga 20 byte diterima, atau koneksi terputus. Di dunia POSIX, API itu bisa menjadi stream I / O standar: Anda bisa
fdopen
deskriptor socket untuk memperolehFILE *
stream, dan Anda bisa menggunakannyafread
untuk mengisi buffer sehingga permintaan penuh dipenuhi dengan sebanyak mungkinread
panggilan yang diperlukan .Datagram UDP membingkai data. Setiap panggilan kirim menghasilkan datagram (tetapi lihat di bawah tentang penyumbatan). Sisi lain menerima datagram lengkap (dan, di API soket, ia harus menentukan buffer yang cukup besar untuk menahannya, atau datagram akan terpotong). Datagram besar terfragmentasi oleh fragmentasi IP, dan dirakit ulang secara transparan ke aplikasi. Jika ada fragmen yang hilang, seluruh datagram hilang; tidak ada cara untuk membaca sebagian data dalam situasi itu.
Ada ekstensi ke antarmuka yang memungkinkan beberapa operasi menentukan datagram tunggal. Di Linux, soket dapat "disumbat" (dicegah mengirim). Sementara itu disumbat, data tertulis dikumpulkan menjadi satu unit. Kemudian ketika soket "terbuka", satu datagram dapat dikirim.
sumber