Linux için Multipath TCP (2022)
(mptcp.dev)- MPTCP, RFC 8684 tabanlı bir TCP uzantısıdır; tek bir bağlantının aynı anda birden fazla ağ arayüzü kullanarak bant genişliği, gecikme ve arıza dayanıklılığını iyileştirmesini sağlar
- Birden fazla yolu paralel kullanan bir yapı olduğu için bant genişliği birleştirme, düşük gecikmeli yolu tercih etme ve yol arızasında başka bir yola yeniden enjeksiyon mümkündür
- Linux'ta
IPPROTO_MPTCPile soket oluşturulur ve normal TCP bağlantısı olan subflow'lar yapılandırılır; karşı uç veya ara cihazlar desteklemiyorsa otomatik olarak tek yollu TCP'ye geri düşer - Yol yönetimi için Linux v5.19 itibarıyla çekirdek içi yöntem ve
mptcpdgibi kullanıcı alanı daemon yöntemi vardır; Linux v6.8 itibarıyla paket zamanlayıcısı isenet.mptcpsysctl ile kontrol edilen tek bir yapıdadır - Linux v6.10 itibarıyla özellikler arasında
socket()desteği, TCP'ye geri düşme, çekirdek/kullanıcı alanı yol yönetimi, TCP soket seçenekleri, MIB,sstanılama ve tracepoint hata ayıklama özellikleri bulunur
MPTCP'nin TCP bağlantı modelini nasıl değiştirdiği
- Multipath TCP (MPTCP), standart TCP'nin bir uzantısıdır ve RFC 8684 içinde tanımlanmıştır
- Tek bir MPTCP bağlantısı, TCP paketlerini göndermek ve almak için aynı anda birden fazla arayüz kullanabilir
- Birden fazla arayüzün bant genişliğini birleştirebilir veya gecikmesi en düşük arayüze öncelik verebilir
- Bir yol kesildiğinde trafiği başka bir yola sorunsuz şekilde yeniden enjekte ederek failover gerçekleştirir
- Normal TCP'nin aynı anda yalnızca tek bir yol kullanmasının aksine, MPTCP 5G ve Wi‑Fi gibi birden fazla yolu subflow olarak birlikte kullanabilir
Başlıca kullanım senaryoları
-
Kesintisiz handover
- Mevcut bağlantıyı koruyarak bir yoldan diğerine geçiş yapılabilir
- Apple, 2013'ten beri akıllı telefonlarda ağırlıklı olarak bu nedenle Multipath TCP kullanıyor
-
En iyi ağın seçimi
- Gecikme, kayıp, maliyet ve bant genişliği gibi koşullara göre kullanılabilir yollar arasından “en iyi” olanı seçer
-
Ağ birleştirme
- Birden fazla yol aynı anda kullanılarak aktarım hızı artırılabilir
- Sabit hat ile mobil ağı birleştirip dosyaları daha hızlı aktarmak buna örnektir
Linux'ta bağlantının kurulma biçimi
- Linux'a özel
IPPROTO_MPTCPprotokolüyle yeni bir soket oluşturulduğunda subflow veya path oluşturulur - Subflow, tek bir arayüz üzerinden veri taşıyan normal bir TCP bağlantısıdır
- Ardından ana makineler arasındaki müzakereyle ek subflow'lar oluşturulabilir
- Altta yatan TCP subflow'un TCP option alanına, karşı ana makinenin MPTCP kullanımını algılayabilmesi için yeni alanlar eklenir
- Bu alanlar arasında karşı tarafa MPTCP kullanımını bildiren
MP_CAPABLEseçeneği de bulunur
- Bu alanlar arasında karşı tarafa MPTCP kullanımını bildiren
- Karşı ana makine veya aradaki middlebox MPTCP'yi desteklemiyorsa, dönen
SYN+ACKpaketinin TCP option alanında MPTCP seçeneği yer almaz- Bu durumda bağlantı normal TCP'ye geri düşer ve tek yol üzerinden devam eder
Path manager ve packet scheduler
- MPTCP içinde Path Manager ve Packet Scheduler, subflow oluşturma, adres duyurusu ve aktarım yolu seçimini ayrı ayrı yönetir
-
Path Manager
- Path Manager, subflow'ların oluşturulmasından silinmesine kadar olan süreci yönetir ve adres duyurusunu da üstlenir
- Genelde istemci tarafı subflow başlatır, sunucu tarafı ise
ADD_ADDRveREMOVE_ADDRseçenekleriyle ek adresleri duyurur - Linux v5.19 itibarıyla iki path manager,
net.mptcp.pm_typesysctl knob ile kontrol edilir- type
0: Çekirdek içi yöntemdir ve tüm bağlantılara aynı kuralları uygular.ip mptcpile ilişkilidir - type
1: Kullanıcı alanı yöntemidir;mptcpdgibi daemon'lar tarafından kontrol edilir ve bağlantı bazında farklı kurallar uygulanabilir
- type
-
Packet Scheduler
- Packet Scheduler, bir sonraki veri paketinin hangi subflow üzerinden gönderileceğini seçer
- Kullanılabilir bant genişliğini en üst düzeye çıkarabilir, yalnızca daha düşük gecikmeli yolları seçebilir veya yapılandırmaya göre başka politikalar uygulayabilir
- Linux v6.8 itibarıyla yalnızca bir paket zamanlayıcısı vardır ve
net.mptcpaltındaki sysctl knob ile kontrol edilir
Linux v6.10 itibarıyla özellikler
- Linux v6.10 itibarıyla MPTCP şu özellikleri sunar
socket()sistem çağrısındaIPPROTO_MPTCPprotokol desteği- Karşı uç veya middlebox MPTCP'yi desteklemediğinde MPTCP'den TCP'ye geri düşme
- Çekirdek içi veya kullanıcı alanı path manager kullanan yol yönetimi
- TCP soketlerinde yaygın olarak kullanılan soket seçenekleri
- MIB sayaçları,
sskomutunun kullandığı diag desteği ve tracepoint içeren hata ayıklama özellikleri
- Ayrıntılı değişiklikler ChangeLog üzerinden görülebilir
İletişim ve ilgili projeler
- İletişim kanalları
- E-posta listesi: mptcp@lists.linux.dev, plain text only
- Archives
- Info
- Abone olmak için mptcp+subscribe@lists.linux.dev adresine boş bir plain text e-postası gönderip gelen challenge e-postasına yanıt vermek gerekir
- IRC: libera.chat üzerindeki #mptcp
- Çevrimiçi Meetings
- Blog
- Fediverse
- E-posta listesi: mptcp@lists.linux.dev, plain text only
- MPTCP topluluğu üyelerinin sürdürdüğü projeler
- MPTCP ile ilgili iyileştirmeler içeren projeler
- iproute2:
ip mptcpkomutu için - Network Manager: v1.40'tan itibaren MPTCP özellikleri içerir
- Multipath TCP applications: popüler TCP uygulamalarına yönelik MPTCP güncellemelerini koordine eden proje
- iproute2:
1 yorum
Hacker News yorumları
MPTCP’yi 2013’te zaten duymuştum
O dönemde mobil uygulamaların ağ değişikliklerine pek dayanıklı olmadığını düşününce, UX’te büyük bir iyileşme sağlayıp hızla benimseneceğini sanmıştım
Ama son 10 yılda neredeyse hiç traction kazanamadı; kernel seçeneğinin ancak şimdi ortaya çıkması epey moral bozucu. Bu arada herkes HTTP çağrılarını birden fazla yeniden deneme işleyicisiyle sardı, mobil işletim sistemleri de ağ bağlantısını o kadar soyutladı ki TCP’den çok zeromq kullanıyormuş hissine yaklaştı
Örnek için bkz. https://blog.apnic.net/2021/12/08/efficient-multipath-transp...
FreeBSD’ye yük dengeleyici olmadan dağıttığımda güncel yamalar yoktu; olsa bile özel ağ IP’sinin alternatif rota olarak duyurulmasını engellemek ciddi iş gerektirirdi
Linux’ta yük dengeleyici arkasındayken stream’i doğru yere göndermek çok karmaşıktı, yük dengeleyici de bunu yapmaya çalışmıyordu
İki stream’i birlikte işlemek yüksek işlem hacimli yola büyük karmaşıklık eklemek demek, bu yüzden riski yüksek; değiştirmek için yeniden başlatma da gerekiyor
Tüm bunları yapsanız bile fayda çoğunlukla yalnızca iOS kullanıcılarına gidiyor; onlar da zaten daha iyi ağlar kullanma eğiliminde
https://en.wikipedia.org/wiki/Stream_Control_Transmission_Pr...
Sonunda geliştirme zamanından tasarruf etmek için PepLink’in SpeedFusion’ını kullandık, ama lisans maliyeti pahalıydı. Gelecekte 2 hücresel ağ ve 50 ms altı failover için ücretsiz bir çözüm çıkmasını umuyorum
Çok yollu UDP + OpenVPN de muhtemelen pratik bir çözüm olabilir
IPv4 adres alanının yalnızca 32 bit olması mı, yoksa TCP’nin bağlantı tuple’ında kaynak/hedef IP adreslerini kullanması mı daha üzücü, bilmiyorum
Zaman makinem olsa Cerf ve Kahn’a geri dönüp ikisini de değiştirtmek isterdim
İki tarafın IP adresleri ve portları, yani 4 alanla bağlantı izlemek zorunda olan yapıyı mı kastediyorsun?
MPTCP kullanan projelere, örneğin OpenWrt türevi bir projeye link olmaması üzücü
GSOC’ta 2 yıl boyunca öğrencilere mentorluk edip OpenWrt’ye MPTCP yaması eklemiştim
https://blog.freifunk.net/2017/05/29/gsoc-2017-add-mptcp-sup...
Yakın zamanda tam fiber hat alamayan ama 5G ile 150~400 Mbps gören bir mülk satın aldım. 2 adet 5G hattı kullanıp MPTCP ile trafiği bir VPS’ye tünelleyerek hatları birleştirmeyi düşünüyorum
https://github.com/home-assistant/operating-system/pull/3248
http://www.openmptcprouter.com/
Web sunucuları ve mobil cihazlarda desteklenmesi en önemli şey gibi geliyor
Şeffaf bir alternatif rota varsa uygulamanın açıkça seçmesi neden gerekli, anlamıyorum
Kernel’in tüm TCP bağlantıları için bunu şeffaf biçimde işlemesi, rota birleştirme veya link tercihi gibi küresel kararları daha iyi vermesini sağlamaz mı?
Upstream öncesindeki eski multipath TCP uygulaması, uygulama için tamamen şeffaf olacak şekilde tasarlanmıştı; protokolün amacına da bunun daha uygun olduğunu düşünüyorum
Elbette birçok durumda MPTCP uygulama yönergeleri alırsa daha iyi olabilir, ama örneğin LTE bağlantısında bir alt akış oluşturup otomatik failover’a hazır tutan, ancak o alt akıştan veri göndermeyen standart bir sistem yaklaşımı bile vakaların %95’i için yeterli olurdu
[1] https://lore.kernel.org/all/alpine.OSX.2.21.1707181728570.11...
Örneğin bağlantı anında istemci IP’sini whitelist ile karşılaştıran ve sonrasında değişmeyeceğini varsayan bir uygulamayı düşünebilirsiniz
Benim için MPTCP'nin tek pratik kullanım alanı mobil ağ ile Wi‑Fi'yi birlikte kullanarak hızı artırmak. iOS ve WeChat ikisi de bunu destekliyor
Ancak mobil ağ kota bazlı olduğu için hep kapalı tutuyorum. Bu yüzden kişisel olarak MPTCP benim için işe yaramaz
Wi‑Fi sinyalinin hâlâ göründüğü ama düzgün bağlanılamadığı durum. MPTCP varsa hücresel bağlantıya failover yapılıyor
Linux ağ yığını ve sürücülerini destekleme, hata ayıklama ve düzeltme işi yapıyorum; bunun bu kadar az benimsenmiş olması şaşırtıcı
SCTP gibi düz TCP'nin yerini almaya çalışan şeylerde olduğu gibi, MPTCP de bazı uygulama geliştiricilerinin kullanmaya devam ettiği bir niş teknoloji olarak kalıyor, dünyanın geri kalanı ise unutuyor gibi görünüyor
MPTCP ile QUIC arasındaki yapısal farkları açıklayan ve yazarların önerdiği MPQUIC protokolünü de tanıtan bir kaynak buldum
QUIC, uygulama akışlarını tek bir UDP akışı üzerinde çoklar; MPTCP ise tek bir akışı birden fazla TCP alt akışına böler. MPQUIC bu iki özelliği birleştirerek uygulama akışlarını birden fazla UDP alt akışı üzerinde çoklar
[1]: "Multipath QUIC: A Deployable Multipath Transport Protocol" https://www.researchgate.net/publication/327122884_Multipath...
Şimdi bu protokollerin üretim ortamında nasıl karşılaştırıldığını merak ediyorum. İkisini de kullanmış olan var mı?
https://lwn.net/Articles/964377/
İkisi de aynı hedefe ulaşmaya çalışıyor. Teknik olarak çok benzer davranışlar üretilebilir. MPTCP Linux çekirdeğinde uygulanmış durumda, QUIC ise kullanıcı alanı tarafında
Apple da destekliyor ve Siri'de kullanıyor
https://developer.apple.com/documentation/foundation/urlsess...
2011'de VoIP uygulamamızın oldukça sağlam çalıştığını görünce şaşırmıştım :D
Aradaki cihazlardan biri bile desteklemiyorsa dönen SYN+ACK paketinin TCP seçenekleri alanında MPTCP seçeneğinin bulunmaması kulağa epey sınırlayıcı geliyor
Aradaki cihazlar için tek gereksinim MPTCP seçeneğini olduğu gibi iletmek mi?
Ya doğru şekilde geçmesini ya da güvenli biçimde tek yollu TCP'ye geri düşmesini sağladık
Genel olarak aradaki cihaz bilinmeyen seçenekleri değiştirmeden geçiriyor ve gördüğü TCP sıra uzayının kesintisiz olması gerektiğini dayatmıyorsa MPTCP o cihazın içinden geçerek çalışabilir
İlginizi çekerse ilgili iki makale var
[1] https://www.usenix.org/conference/nsdi12/technical-sessions/...
[2] https://www.researchgate.net/publication/229002024_Is_it_sti...
Güvenlik ve gizlilik ayarlarında işe yarayabilir
Örneğin Çin'in Great Firewall'unu düşünürsek, trafik birden fazla uplink kanalına bölünebildiğinde güvenlik duvarının bunu yeniden birleştirip kural uygulaması zorlaşmaz mı?