Soket API kabul () işlevi nasıl çalışır?


126

Soket API, TCP / IP ve UDP / IP iletişimleri için fiili standarttır (yani, bildiğimiz ağ kodudur). Bununla birlikte, temel işlevlerinden biri accept()biraz büyülü.

Yarı resmi bir tanımı ödünç almak için:

kabul () sunucu tarafında kullanılır. Uzak istemciden gelen yeni bir TCP bağlantısı oluşturma girişimini kabul eder ve bu bağlantının soket adres çiftiyle ilişkilendirilmiş yeni bir soket oluşturur.

Başka bir deyişle, acceptsunucunun yeni bağlanan istemciyle iletişim kurabileceği yeni bir soket döndürür. Eski soket ( acceptçağrılan) aynı bağlantı noktasında yeni bağlantıları dinleyerek açık kalır.

Nasıl acceptçalışır? Nasıl uygulanıyor? Bu konuda çok fazla kafa karışıklığı var. Birçok kişi kabul ettiğini iddia ediyor yeni bir bağlantı noktası açıyor ve bu bağlantı üzerinden müşteri ile iletişim kuruyorsunuz. Ancak yeni bağlantı noktası açılmadığı için bu kesinlikle doğru değil. Aslında aynı bağlantı noktası üzerinden farklı istemcilerle iletişim kurabilirsiniz, ancak nasıl? Birkaç iş parçacığı recvaynı bağlantı noktasını aradığında , veriler nereye gideceklerini nasıl biliyor?

Sanırım bu, istemcinin adresinin satırları boyunca bir soket tanımlayıcısıyla ilişkilendirilmiş bir şey ve her veri aracılığıyla recvdoğru sokete yönlendiriliyor, ancak emin değilim.

Bu mekanizmanın iç işleyişinin kapsamlı bir açıklamasını almak harika olurdu.


2
böylece her müşteri talebi için sunucu ucunda yepyeni bir soket bağlantısı açılır. Gelen aramaları dinlemek için sunucunun her zaman 80'de açık olması gerekir. Bir çağrı alırsa, aşağıda belirtildiği gibi hemen dört tuple ile YENİ bir soket oluşturur ve bu, istemci ile sunucu arasında bir TCP bağlantısı kurar. Anladığım doğru mu?
beyin fırtınası

1
Bu çok temel bir sorudur ve Geçenlerde bir röportajında bu test edildi: stackoverflow.com/questions/24871827/... Bu konuda herhangi bir yorum varsa, gönderin
beyin fırtınası

@brainstorm Yalnızca HTTP'nin canlı tutma varlığını tamamen görmezden gelirseniz.
Marquis of Lorne

Yanıtlar:


140

Sizin kafa karışıklığınız, bir soketin Sunucu IP'si: Sunucu Portu ile tanımlandığını düşünmekte yatıyor. Gerçekte, soketler bir bilgi dörtlüsü tarafından benzersiz bir şekilde tanımlanır:

Client IP : Client Port ve Server IP : Server Port

Dolayısıyla, Sunucu IP'si ve Sunucu Portu kabul edilen tüm bağlantılarda sabit iken, istemci tarafı bilgileri, her şeyin nereye gittiğini takip etmesine izin veren şeydir.

Bir şeyleri açıklığa kavuşturmak için örnek:

Diyelim ki bir 192.168.1.1:80ve iki istemcimizde bir sunucumuz var 10.0.0.1ve 10.0.0.2.

10.0.0.1yerel bağlantı noktasında bir bağlantı açar 1234ve sunucuya bağlanır. Artık sunucuda aşağıdaki gibi tanımlanan bir soket vardır:

10.0.0.1:1234 - 192.168.1.1:80  

Şimdi 10.0.0.2yerel bağlantı noktasında bir bağlantı açar 5678ve sunucuya bağlanır. Artık sunucunun aşağıdaki şekilde tanımlanan iki soketi vardır:

10.0.0.1:1234 - 192.168.1.1:80  
10.0.0.2:5678 - 192.168.1.1:80

3
Uygulama ayrıntılarını bilmiyorum (muhtemelen platformdan platforma değişir), sadece kavramsal olarak soketlerin tanımladığım dörtlü bilgi ile tanımlandığını biliyorum.
17 26

3
Bununla ilgili herhangi bir referansınız var mı?
qeek

3
Rastgele soru: NAT kullanılıyorsa ve aynı ağdaki iki istemci sunucuya bağlanırken aynı yerel bağlantı noktasını kullanmaya çalışırsa ne olur? Örneğin, 10.0.0.1 ve 10.0.0.2'nin her ikisi de 192.168.0.1 harici IP'ye sahip bir yönlendiriciye bağlıysa, 192.168.1.1'deki sunucu 192.168.0.1'den iki bağlantı görür. Bu durumda, rasgele sayı üretecinin bir tesadüfi tarafından hem 10.0.0.1 hem de 10.0.0.2 aynı yerel bağlantı noktasını seçerse ne olur?
aroth

4
Yönlendiricideki NAT desteği oradaki ayrıntılarla ilgilenir. Ağ trafiği aslında iki bağlantı üzerinden gidiyor - istemciden yönlendiriciye ve yönlendiriciden sunucuya. Yönlendirici, giden bağlantıları 192.168.0.1:1234 ve 192.168.0.1:5678 olmak üzere iki farklı bağlantı noktasında yapar. Gelen trafik daha sonra yönlendirici tarafından doğru istemciye yeniden yönlendirilir.
26

3
Dörtlü tarafından bir soket tanımlanırsa, bir dinleme soketinin dörtlü bilgisi nedir?
Eric Zheng

74

Sadece "17/26" kullanıcısının verdiği yanıta eklemek için

Soket aslında 5 tuple - (kaynak ip, kaynak port, hedef ip, hedef port, protokol) içerir. Burada protokol, TCP veya UDP veya herhangi bir taşıma katmanı protokolü olabilir. Bu protokol, pakette IP datagramındaki 'protokol' alanından tanımlanır.

Böylelikle, aynı istemciye tam olarak aynı 4-tuple üzerinden iletişim kuran sunucu üzerinde farklı uygulamalara sahip olmak ancak protokol alanında farklı uygulamalara sahip olmak mümkündür. Örneğin

Sunucu tarafında Apache konuşuyor (TCP'de server1.com:880-client1:1234) ve World of Warcraft konuşuyor (UDP'de server1.com:880-client1:1234)

Hem istemci hem de sunucu, diğer 4 alan aynı olsa bile her iki durumda da IP paketindeki protokol alanı olarak bunu ele alacaktır.


13

Ne bu öğreniyordu bana şaşkın, terimler olmasıydı socketve portbunlar fiziksel bir şey olduğunu göstermektedir Aslında ağ ayrıntıları soyut için Onlar sadece veri yapıları çekirdek kullanır içinde.

Bu nedenle, veri yapıları farklı istemcilerden bağlantıları ayrı tutabilmek için uygulanır. Nasıl uygulandıklarına gelince , cevap ya a.) Önemli değil, soket API'sinin amacı tam olarak uygulamanın önemli olmaması gerektiğidir veya b.) Sadece bir göz atın. Bir uygulamanın ayrıntılı bir tanımını sunan şiddetle tavsiye edilen Stevens kitaplarının yanı sıra, Linux veya Solaris'teki veya BSD'lerden birinin kaynağına bakın.


Evet, ağ terminolojisinin çoğu sadece belirli bit koleksiyonlarına ve değerlerine ("protokol tanımlayıcı", "yönlendirme", "bağlama", "soket" vb.) Dayalı olarak alınan kararlara adlar atamaktır. Ağ kartınızın donanımının tamamı, bir bit akışı alacak şekilde tasarlanmıştır. Bilgisayarınızdaki programlarla ilgili olarak onlara ne olacağı, sürücü ve işletim sistemi tarafından belirlenir.
İstersek

-1

Diğer adamın dediği gibi, bir soket benzersiz bir şekilde 4'lü bir grupla (İstemci IP'si, İstemci Bağlantı Noktası, Sunucu IP'si, Sunucu Bağlantı Noktası) tanımlanır.

Sunucu IP'sinde çalışan sunucu işlemi, aktif soketlerden oluşan bir veritabanı tutar (yani ne tür bir tablo / liste / ağaç / dizi / sihirli veri yapısı kullandığı umurumda değil) ve Sunucu Portunu dinler. Bir mesaj aldığında (sunucunun TCP / IP yığını aracılığıyla), İstemci IP'sini ve Bağlantı Noktasını veritabanına göre kontrol eder. İstemci IP'si ve İstemci Bağlantı Noktası bir veritabanı girişinde bulunursa, mesaj mevcut bir işleyiciye verilir, aksi takdirde yeni bir veritabanı girişi oluşturulur ve bu soketi işlemek için yeni bir işleyici üretilir.

ARPAnet'in ilk günlerinde, belirli protokoller (biri için FTP) bağlantı istekleri için belirli bir bağlantı noktasını dinler ve bir geçiş bağlantı noktasıyla yanıt verirdi. Bu bağlantı için daha fazla iletişim, geçiş portu üzerinden gidecektir. Bu, paket başına performansı artırmak için yapıldı: bilgisayarlar o günlerde birkaç kat daha yavaştı.


"aktarım portu" kısmını detaylandırır mısınız?
Eli Bendersky

1
Bu, ya bazı TCP öncesi protokollerin bir açıklamasıdır ya da aşırı derecede basitleştirilmiştir. Dinleme soketine bağlanmaya çalışan bir istemci, bağlantıyı kurmak için özel bir paket gönderir (SYN bit seti). Yeni bir soket oluşturan bir paket ile mevcut bir soketi kullanan bir paket arasında açık bir ayrım vardır.
John M

... bağlantı kurmak için özel bir paket gönderir (SYN bit seti). Bu (anladığım kadarıyla) protokol yığının onu 'dinleyiciye (varsa) vermesine neden oluyor, bu yüzden adres / bağlantı noktası / protokol kombinasyonu başına yalnızca bir dinleme bağlantı noktası olabilir. Bunun spesifikasyonda mı yoksa yalnızca uygulama kuralında mı olduğundan emin değilim.
Peter Wone

1
İkinci paragraf, ne TCP katmanında ne de bir sunucu sürecinde olanları doğru bir şekilde tanımlamaz. Sunucu süreçlerinin herhangi bir tür soket veri yapısını korumasına veya gelen IP: bağlantı noktası çiftlerini herhangi bir şeye karşı kontrol etmesine gerek yoktur. Soketler bunun için var. FTP, tüm 'diğer iletişimler' için değil, veriler için ayrı bir bağlantı noktası kullanır ve performans nedenlerinden ötürü değil, protokolü basitleştirmek için yapılan şapkalar kullanır. Performansı hiçbir şekilde artırmazken yeni bir bağlantı noktası kullanmak.
Marquis of Lorne

"bir veritabanı tutar (yani ne tür bir tablo / liste / ağaç / dizi / sihirli veri yapısı kullandığı umurumda değil)" :) Bunu genellikle "Tablo" (veya belki "Grafik" veya "Karar ağacı" olarak adlandırırım. ). "Veritabanı" bana bazı uygulama öneriyor.
masterxilo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.