TCP bağlantısı için maksimum paket boyutu nedir veya maksimum paket boyutunu nasıl alabilirim?
TCP bağlantısı için maksimum paket boyutu nedir veya maksimum paket boyutunu nasıl alabilirim?
Yanıtlar:
TCP paket boyutu üzerindeki mutlak sınırlama 64K'dır (65535 bayt), ancak pratik olarak bu, göreceğiniz herhangi bir paketin boyutundan çok daha büyüktür, çünkü alt katmanların (örn. Ethernet) daha düşük paket boyutları vardır.
Örneğin, Ethernet için MTU (Maksimum İletim Birimi) 1500 bayttır. Bazı ağ türlerinde (Token Ring gibi) daha büyük MTU'lar vardır ve bazı türlerde daha küçük MTU'lar vardır, ancak değerler her fiziksel teknoloji için sabittir.
Bu mükemmel bir soru ve aslında işte bu kadar çok koşuyorum. 65k ve 1500 gibi bir çok "teknik olarak doğru" cevap var. Ağ arayüzleri yazmak ve 65k kullanmak aptalca bir sürü iş yaptım ve 1500 sizi de büyük belaya sokabilir. İşim birçok farklı donanım / platform / yönlendirici üzerinde çalışıyor ve dürüst olmak gerekirse başladığım yer 1400 bayt. Eğer 1400'den fazlasına İHTİYACINIZ VARSA, yukarı çıkmaya başlayabilirsiniz, muhtemelen 1450'ye ve bazen 1480'e gidebilirsiniz? Bundan daha fazlasına ihtiyacınız varsa, elbette 2 pakete bölünmeniz gerekir, bunun birkaç belirgin yolu vardır.
Sorun şu ki, bir veri paketi oluşturma ve TCP üzerinden yazma hakkında konuşuyorsunuz, ancak elbette taranan başlık verileri var ve böylece, sizi 1500 veya daha fazlasına koyan "bagajınız" var. çok sayıda donanımın alt sınırları vardır.
Eğer "iterseniz", gerçekten tuhaf şeyler olabilir. Açıkçası kesilmiş veriler, ya da nadiren gördüğüm veriler düştü. Bozulmuş veriler de nadiren de olsa kesinlikle olur.
send()
Eğer uygunsa bir tane 2G yazamamanın bir nedeni yoktur .
1480'ish
olmalıdır 1460
. IP üstbilgisi ve TCP üstbilgisi (isteğe bağlı üstbilgi alanları kullanılmadığı sürece) en az 20 bayt alır ve bu nedenle (Jumbo olmayan çerçeve) Ethernet için maks 1500 - 20 -20 = 1460
.
Uygulama düzeyinde, uygulama akış yönelimli bir protokol olarak TCP kullanır. TCP de segmentlere sahiptir ve güvenilir olmayan IP paketleriyle çalışmanın ayrıntılarını soyutlar.
TCP, paketler yerine segmentlerle ilgilenir. Her TCP segmenti, bir TCP üstbilgisinin içinde bulunan bir sıra numarasına sahiptir. TCP segmentinde gönderilen gerçek veriler değişkendir.
İçin bir değer yoktur getsockopt maksimum TCP bölüm boyutunu (MSS) alır Eğer TCP_MAXSEG denilen kullanabileceğinizi bazı OS üzerinde desteklenir. Yine de tüm işletim sistemlerinde desteklenmez.
Tam olarak ne yapmaya çalıştığınızdan emin değilim ama kullanılan tampon boyutunu küçültmek istiyorsanız ayrıca şunları da inceleyebilirsiniz: SO_SNDBUF ve SO_RCVBUF.
Http://en.wikipedia.org/wiki/Maximum_segment_size'ye göre , bir ağdaki IPV4 paketi için varsayılan en büyük boyut 536 oktettir (8 bitlik bayt). Bkz RFC 879
TCP API'sinde paket yok.
Altta yatan protokollerde genellikle TCP üzerinden IP yapıldığında olduğu gibi ilgilenmediğiniz paketler vardır, çünkü muhtemelen ilgilenmediğiniz çok hassas performans optimizasyonları dışında kullanıcıyla hiçbir ilgisi yoktur ( sorunun formülasyonu).
Bir send()
API çağrısında maksimum bayt sayısının ne olduğunu sorarsanız , bu uygulamaya ve ayarlara bağlıdır. Genellikle birkaç kilobayta kadar olan parçalar için send () öğesini çağırırsınız ve sistemin tamamen veya kısmen kabul etmeyi reddetmesine her zaman hazır olursunuz, bu durumda verilerinizi içine beslemek için manuel olarak daha küçük parçalara bölünmeyi yönetmeniz gerekir. TCP gönderme () API'sı.
Genellikle bu, bağlantının kullandığı arabirime bağlı olacaktır. MTU'yu almak için muhtemelen bir ioctl () kullanabilirsiniz ve eğer ethernet ise, genellikle VLAN içermeyen ethernet için 14 olan donanım başlığının boyutunu çıkararak maksimum paket boyutunu elde edebilirsiniz.
Bu, MTU'nun ağ boyunca en azından bu kadar büyük olması durumunda geçerlidir. TCP, etkili MTU'nuzu azaltmak için MTU bulma yolunu kullanabilir.
Soru, neden umursuyorsun?
Görünüşe göre internette çoğu web sitesi MTU değeri için 1460 bayt kullanıyor. Bazen 1452 olur ve bir VPN kullanıyorsanız, IPSec başlıkları için daha da fazla düşer.
Varsayılan pencere boyutu en fazla 65535 bayta kadar değişir. Kendi kaynak IP değerlerime bakmak ve diğer İnternet sağlayıcılarının ne kullandığını kontrol etmek için http://tcpcheck.com adresini kullanıyorum.
Bir çözüm, TCP_MAXSEG soket seçeneğini ( http://linux.die.net/man/7/tcp ), temel ağ ile "güvenli" bir değere ayarlamak olabilir (örn. Ethernet üzerinde güvenli olmak için 1400 olarak ayarlanmış) ve sistem çağrısında büyük bir arabellek kullanın. Bu şekilde pahalı olan daha az sistem çağrısı olabilir. Çekirdek verileri MSS ile eşleşecek şekilde böler.
Bu şekilde kesilmiş verileri önleyebilirsiniz ve uygulamanızın küçük arabellekler hakkında endişelenmesine gerek kalmaz.
IP protokolünde bir TCP ayarı için paket boyutu (Ip4). Bu alan (TL) için 16 bit ayrılmıştır, buna göre maksimum paket boyutu 65535 bayttır: IP protokolü ayrıntıları