Berapa ukuran paket maksimum untuk koneksi TCP atau bagaimana saya bisa mendapatkan ukuran paket maksimum?
Berapa ukuran paket maksimum untuk koneksi TCP atau bagaimana saya bisa mendapatkan ukuran paket maksimum?
Jawaban:
Batasan absolut pada ukuran paket TCP adalah 64K (65535 byte), tetapi dalam praktiknya ini jauh lebih besar dari ukuran paket apa pun yang akan Anda lihat, karena lapisan bawah (misalnya ethernet) memiliki ukuran paket yang lebih rendah.
MTU (Maximum Transmission Unit) untuk Ethernet, misalnya, adalah 1500 byte. Beberapa jenis jaringan (seperti Token Ring) memiliki MTU yang lebih besar, dan beberapa jenis memiliki MTU yang lebih kecil, tetapi nilainya tetap untuk setiap teknologi fisik.
Ini adalah pertanyaan yang sangat bagus dan saya sering mengalami hal ini di tempat kerja. Ada banyak jawaban "benar secara teknis" seperti 65k dan 1500. Saya telah melakukan banyak pekerjaan menulis antarmuka jaringan dan menggunakan 65k adalah konyol, dan 1500 juga dapat membawa Anda ke masalah besar. Pekerjaan saya berjalan pada banyak perangkat keras / platform / router yang berbeda, dan jujur saja tempat saya mulai adalah 1400 byte. Jika Anda MEMBUTUHKAN lebih dari 1400 Anda dapat mulai naik, Anda mungkin bisa pergi ke 1450 dan kadang-kadang ke 1480'ish? Jika Anda membutuhkan lebih dari itu maka tentu saja Anda perlu membaginya menjadi 2 paket, di mana ada beberapa cara yang jelas untuk dilakukan ..
Masalahnya adalah bahwa Anda sedang berbicara tentang membuat paket data dan menuliskannya melalui TCP, tapi tentu saja ada data header yang ditempelkan dan sebagainya, sehingga Anda memiliki "bagasi" yang menempatkan Anda ke 1500 atau lebih .. dan juga Banyak perangkat keras memiliki batas yang lebih rendah.
Jika Anda "mendorongnya", Anda bisa mendapatkan beberapa hal aneh yang terjadi. Data terpotong, jelas, atau data yang dijatuhkan jarang saya lihat. Data yang rusak juga jarang tetapi pasti memang terjadi.
send()
jika itu nyaman.
1480'ish
seharusnya 1460
. Header IP dan header TCP masing-masing membutuhkan setidaknya 20 byte (kecuali jika digunakan header opsional) dan dengan demikian maks untuk Ethernet (non-Jumbo frame) 1500 - 20 -20 = 1460
.
Pada tingkat aplikasi, aplikasi menggunakan TCP sebagai protokol berorientasi aliran. TCP pada gilirannya memiliki segmen dan abstrak rincian bekerja dengan paket IP yang tidak dapat diandalkan.
Penawaran TCP dengan segmen bukan paket. Setiap segmen TCP memiliki nomor urut yang terkandung di dalam header TCP. Data aktual yang dikirim dalam segmen TCP adalah variabel.
Ada nilai getsockopt yang didukung pada beberapa OS yang Anda dapat menggunakan disebut TCP_MAXSEG yang mengambil ukuran segmen TCP maksimum (MSS). Ini tidak didukung pada semua OS.
Saya tidak yakin persis apa yang Anda coba lakukan tetapi jika Anda ingin mengurangi ukuran buffer yang digunakan Anda juga bisa melihat ke dalam: SO_SNDBUF dan SO_RCVBUF.
Menurut http://en.wikipedia.org/wiki/Maximum_segment_size , ukuran terbesar default untuk paket IPV4 pada jaringan adalah 536 oktet (ukuran byte 8 bit). Lihat RFC 879
Tidak ada paket di TCP API.
Sudah ada paket dalam protokol yang mendasarinya, seperti ketika TCP dilakukan melalui IP, yang Anda tidak tertarik, karena mereka tidak ada hubungannya dengan pengguna kecuali untuk optimasi kinerja yang sangat halus yang Anda mungkin tidak tertarik (sesuai dengan formulasi pertanyaan).
Jika Anda bertanya berapa jumlah maksimum byte yang Anda dapat send()
dalam satu panggilan API, maka ini tergantung pada implementasi dan pengaturan. Anda biasanya akan memanggil kirim () untuk potongan hingga beberapa kilobyte, dan selalu siap untuk sistem untuk menolak untuk menerimanya secara total atau sebagian, dalam hal ini Anda harus mengelola pemisahan secara manual menjadi potongan-potongan kecil untuk memasukkan data Anda ke dalam TCP send () API.
Secara umum, ini akan tergantung pada antarmuka yang digunakan koneksi. Anda mungkin dapat menggunakan ioctl () untuk mendapatkan MTU, dan jika itu ethernet, Anda biasanya bisa mendapatkan ukuran paket maksimum dengan mengurangi ukuran header perangkat keras dari itu, yaitu 14 untuk ethernet tanpa VLAN.
Ini hanya terjadi jika MTU setidaknya sebesar itu di jaringan. TCP dapat menggunakan jalur penemuan MTU untuk mengurangi MTU efektif Anda.
Pertanyaannya adalah, mengapa kamu peduli?
Jika Anda menggunakan mesin Linux, "ifconfig eth0 mtu 9000 up" adalah perintah untuk mengatur MTU untuk sebuah antarmuka. Namun, saya harus mengatakan, MTU besar memiliki beberapa kelemahan jika transmisi jaringan tidak begitu stabil, dan mungkin menggunakan lebih banyak memori ruang kernel.
Tampaknya sebagian besar situs web di internet menggunakan 1460 byte untuk nilai MTU. Kadang-kadang 1452 dan jika Anda menggunakan VPN itu akan turun lebih banyak untuk header IPSec.
Ukuran jendela standar bervariasi sedikit hingga maksimal 65535 byte. Saya menggunakan http://tcpcheck.com untuk melihat nilai IP sumber saya sendiri dan untuk memeriksa apa yang digunakan vendor Internet lainnya.
Salah satu solusinya adalah dengan mengatur opsi socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) ke nilai yang "aman" dengan jaringan yang mendasarinya (mis. Set ke 1400 agar aman di ethernet) lalu gunakan buffer besar dalam panggilan sistem kirim. Dengan cara ini akan ada lebih sedikit panggilan sistem yang mahal. Kernel akan membagi data agar sesuai dengan MSS.
Dengan cara ini Anda dapat menghindari data terpotong dan aplikasi Anda tidak perlu khawatir tentang buffer kecil.
Ukuran paket untuk pengaturan TCP dalam protokol IP (Ip4). Untuk bidang ini (TL), 16 bit dialokasikan, sehingga ukuran maksimal paket adalah 65535 byte: Detail protokol IP