TCP Yarı Açık Bağlantı ve TCP Yarı kapalı bağlantı arasındaki farkın ne olduğunu tam olarak ne olduğunu söyleyebilir miyim anlamaya çalışıyorum?
TCP Yarı Açık Bağlantı ve TCP Yarı kapalı bağlantı arasındaki farkın ne olduğunu tam olarak ne olduğunu söyleyebilir miyim anlamaya çalışıyorum?
Yanıtlar:
Bu direk yarı kapalı bağlantılarda genişler. Yarı açık bağlantılar için KContreau'nun doğru açıklamasına bakın.
Her TCP bağlantısı, birbirinden bağımsız olarak kapatılan iki yarı bağlantıdan oluşur. Eğer bir uç bir FIN gönderirse, diğer uç sadece gönderilecek veriye sahip olduğu FIN gönderme ucunu işaret eden FIN'i (FIN + ACK-ing yerine) ACK yapmakta serbesttir. Bu nedenle, her iki uç da ESTABLISHED dışında sabit bir veri aktarımı durumunda (yani alıcı uç için) ve gönderen uç için CLOSE_WAIT ile sonuçlanır. Böyle bir bağlantının yarı kapalı olduğu söylenir ve TCP aslında bu senaryoları desteklemek üzere tasarlanmıştır, bu nedenle yarı kapalı bağlantılar bir TCP özelliğidir.
RFC 793 sadece "yarı kapalı" teriminden bahsetmeden ham mekanizmayı tanımlarken, RFC 1122 bu konu ile ilgili 4.2.2.13. Kimin bu özelliğe ihtiyacı olduğunu merak edebilirsiniz. TCP tasarımcıları ayrıca Unix sistemi için TCP / IP'yi uyguladılar ve her Unix kullanıcısı gibi G / Ç yönlendirmesini sevdiler. W. Stevens'a göre (TCP / IP gösterilmiştir, Bölüm 18.5) G / Ç yönlendirme TCP akışlarına duyulan istek, özelliği tanıtmak için motivasyondu. FIN ack'in EOF rolünü almasını veya EOF olarak çevrilmesini sağlar. Bu temelde uygulama katmanında geçici olarak istek / yanıt stili etkileşimi oluşturmanıza izin veren bir özelliktir, burada FIN "istek sonu" sinyalini verir.
Diğer çocuklar yarı açık ve yarı kapalı bağlantıları gerçekte neyi tarif etmenin oldukça iyi bir iş yaptı vardır , ancak yarı açık bağlantı fikri de sık sık bir SORUN olmanın bir tanesi bağlamında aranır.
İnternette, "yarı açık" veya "yarı kapalı" terminolojisinin neyi temsil etmesi gerektiği konusunda tartışmalar vardır, ancak endişelendiğim kadarıyla, terminoloji sadece anlamsaldır. Bazıları "yarı açık" bağlantıların bir "sorun" olduğunu, "yarı kapalı" ise dosya indirme yarı kapalı bir durumda bitmeden gönderme akışını kapatarak gönderme akışınızı kapatmanızı sağlayan bir tasarım özelliğidir ( açıklandığı gibi).
Ancak, diğer ... "sorun" ile ilgili olarak: bir TCP bağlantısı açmak için 3 yönlü ve kapatmak için 4 yönlü bir tokalaşma gerekir.
TCP'nin güvenlik açığı, istemciye gönderilen son FIN paketinin yönlendiriciler / ağlar tarafından potansiyel olarak düşürülebilmesi nedeniyle, gerçek niyet bağlantıyı tamamen kapatmak olduğunda yarı açık bir bağlantıya neden olabilir. Bu ve benzer yaklaşımlar, çok fazla bant genişliği gerektirmedikleri, ancak sunucu uygulamasına bağlı olarak potansiyel olarak değerli kolları, soketleri ve iplikleri yiyebilecekleri için popüler Hizmet Reddi saldırılarıdır, ancak gerçek dünyada da olabilirler. kalitesiz kablosuz taşıyıcılarımız sayesinde artan frekansta.
İşletim sistemleri, belirli bir zamanda işletim sisteminde bulunabilecek yarı açık / kapalı bağlantı sayısını sınırlayarak ve bağlantıların bir ağda kalabileceği en uzun süreleri tanıtarak yarı açık DDoS saldırılarına karşı mücadele etmeye çalışmıştır. yarı açık / kapalı durum. Son olarak, kişisel olarak kontrol ettim, ancak Windows'ta zaman sınırı oldukça yüksekti (hatırlıyorsam 2 gün).
Bu durum, tam olarak uygulandığında ölü / zombi bağlantılarını algılamaya yönelik bir protokol düzeyinde (uygulama seviyesinin aksine) bir çözüm olarak tasarlanan TCP keep-alives'in isteğe bağlı doğasıyla daha da kötüleşir. Ancak, TCP tasarlandığında, bant genişliği şimdi olduğundan çok daha değerliydi ve TCP için zorunlu canlı tutma zamanlayıcılarının çok "konuşkan" olacağına dair endişeler vardı. Bu nedenle canlı tutma isteğe bağlıdır, genellikle kullanılmaz ve RFC1122'ye göre yönlendiriciler tarafından aktarılacağı garanti edilmez. Yani ... senaryoyu algılamak / işlemek amacıyla TCP katmanında canlı tutma özelliğini etkinleştirseniz bile, trafiğiniz dünyayı dolaştıkça bazı yönlendiricilerin canlı tutma paketlerini bıraktığını görebilirsiniz ... test etmek için potansiyel olarak başka nadir bir senaryo.
Yarı Açık bağlantılar, özellikle TCP tabanlı sunucular yazan kodlayıcılar için biraz mühendislik zorluğu oluşturur, çünkü istemeden rastgele, yüksek yük zamanlarında ve genellikle üretim sunucularında görünebilirler ... Alfa / Beta test aşamalarında fark edilmesi zor. Deneyimlerime göre, günde 2,5 milyon bağlantıyı işleyen sunucularda belki 40.000 bağlantıda 1 olduğunu gördüm, ancak bu sayılar trafik koşullarınıza ve sunucunuz ile istemci arasındaki internetin her ayağının trafik koşullarına bağlı olarak değişecektir. .
Bir mühendis olarak, nadiren ve yalnızca canlı, dağıtılmış sunucularda ortaya çıkan sorunları izlemek zor olabilir, bu nedenle sunucunuzun ne zaman tepki vereceğini analiz etmek için TCP sunucu kodu yazarken bu nadir bağlantı durumunu simüle etmeye çalışmak önemlidir. bu durumla yüzleşti. TCP sunucunuz örneğin statik bir işçi-iş parçacığı kullanıyorsa, örneğin üretime dağıtırken bunların tümünü zombi bağlantıları tarafından tüketilmiş bulabilirsiniz. Bağlantılar çok fazla çalışma belleği gerektiriyorsa, sonuç bellek sızıntısına benzer görünebilir. vs vs.
% 100 uygulanabilir canlı çözüm olmadan TCP, yarı açık / kapalı bağlantıların nasıl ele alınacağını belirlemek için kullanıcı katmanına bırakır, bu nedenle kodunuzun algılamak, zaman aşımı ve temizleme için bir plan / mekanizmaya sahip olması gerekir. Bu durum ortaya çıktığında kaynakları toplayın ... yani ... bunun icat ettiğiniz bir protokol olduğunu varsayarsak, programcıların genellikle kullandığı birçok (kötü) açık standarttan biri değildir. Elbette sadece TCP üzerinden çalışan HTTP gibi protokollerden bahsediyorum. Bu protokoller, bu programcının görüşüne göre aşırı abartılıyor.
TCP'nin zayıf yönlerini ve HTTP / Web trafiğini iletme konusundaki talihsiz popülaritesini kabul eden akıllı şirketler, bir yedek aramaya çalıştılar. Örneğin, Google, HTTP'yi UDP üzerinden ileten QUIC adlı bir protokolü denedi. TSCP adı verilen açık bir protokol de var. Ancak bu protokollerin hiçbiri geniş çapta kabul görmemiştir.
Kural olarak, sadece kendi UDP tabanlı protokolüm hakkında konuşmak için tüm sunucularımı inşa ediyorum. UDP, düşündüğünüzden daha zor ve her zaman daha hızlı, daha akıllı, daha düşük gecikme süresi, daha düşük tıkanıklık için ayarladığımı hissediyorum ... ama en azından artık yarı açık bağlantılarla uğraşmak zorunda değilim; )
TCP bir bağlantı kurduğunda, gerçekleşen bir el sıkışma olduğundan garantili kabul edilir:
Bu noktada bağlantı kurulur ve veri akmaya başlar. Buna karşılık, bir UDP paketi garanti edilmez ve sadece oraya ulaştığı umuduyla gönderilir.
http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment
Resmi olarak, RFC'lere göre, yarı açık bir TCP bağlantısı, kurulan bağlantının bir tarafının çöktüğü ve bağlantının sona erdiğine dair bildirim göndermediği zamandır. Bu günümüzde yaygın kullanım değildir.
Gayri resmi olarak, eğer kurulma sürecinde bir bağlantı olan bir embriyonik bağlantıya işaret edebilirse.
Yarı kapalı bu gayri resmi tanımın tam tersidir. Ortada, bilgisayarların kurulan bağlantıyı yıktığı bir durumdur.
TCP Bağlantı Sonlandırmasının en iyi açıklaması
TCP 3-yollu El Sıkışma Sürecinde, İletim Kontrol Protokolü'nde (TCP) SYN bit segmentlerini kullanarak istemci ve sunucu arasında nasıl bağlantı kurulduğunu inceledik. Bu yazıda İstemci ve Sunucu arasındaki TCP bağlantısının nasıl yapılacağı üzerinde çalışacağız. Burada ayrıca FIN bitinin 1 olarak ayarlandığı sunucuya bit segmentleri göndermemiz gerekecek.
TCP'de mekanizma nasıl çalışır:
Step 1 (FIN From Client) – Suppose that the client application decides it wants to close the connection. (Note that the server could also choose to close the connection). This causes the client send a TCP segment with the FIN bit set to 1 to server and to enter the FIN_WAIT_1 state. While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment (ACK).
Step 2 (ACK From Server) – When Server received FIN bit segment from Sender (Client), Server Immediately send acknowledgement (ACK) segment to the Sender (Client).
Step 3 (Client waiting) – While in the FIN_WAIT_1 state, the client waits for a TCP segment from the server with an acknowledgment. When it receives this segment, the client enters the FIN_WAIT_2 state. While in the FIN_WAIT_2 state, the client waits for another segment from the server with the FIN bit set to 1.
Step 4 (FIN from Server) – Server sends FIN bit segment to the Sender(Client) after some time when Server send the ACK segment (because of some closing process in the Server).
Step 5 (ACK from Client) – When Client receive FIN bit segment from the Server, the client acknowledges the server’s segment and enters the TIME_WAIT state. The TIME_WAIT state lets the client resend the final acknowledgment in case the ACK is lost.The time spent by client in the TIME_WAIT state is depend on their implementation, but their typical values are 30 seconds, 1 minute, and 2 minutes. After the wait, the connection formally closes and all resources on the client side (including port numbers and buffer data) are released.
hakkında daha fazla bilgi: https://www.geeksforgeeks.org/tcp-connection-termination/
Yarı kapalı bağlantı, sunucunun bir ucu ve İstemci bağlantıyı sonlandırmak istediğinde kurulan bir işlemdir. TCP, bağlantıya yönelik bir işlemdir, bu nedenle her soket belirli bir uygulama için açılır. TCP'de uygulamayı sonlandırma baskısı yoktur. Böylece bağlantıya yönelik işlem, bekleme sinyalleri ile sonlandırmayı uzatır. TCP'de yarı kapalı olarak adlandırılır (bağlantı)