Bu, kuruluşumdaki yazılım mühendislerinden biri tarafından sorulan bir soruydu. En geniş tanımla ilgileniyorum.
Bu, kuruluşumdaki yazılım mühendislerinden biri tarafından sorulan bir soruydu. En geniş tanımla ilgileniyorum.
Yanıtlar:
TCP soketi, belirli bir TCP bağlantısı veya dinleme durumu bağlamında IP adresi ve bağlantı noktası tarafından tanımlanan bir uç nokta örneğidir .
Bağlantı noktası, bir hizmet uç noktasını tanımlayan bir sanallaştırma tanımlayıcısıdır (hizmet örneği uç noktasından, yani oturum tanımlayıcısından farklı olarak).
TCP soketi bir bağlantı değildir , belirli bir bağlantının uç noktasıdır.
Bir hizmet uç noktasına eşzamanlı bağlantılar olabilir , çünkü bağlantı hem yerel hem de uzak uç noktaları tarafından tanımlanır ve trafiğin belirli bir hizmet örneğine yönlendirilmesine izin verir.
Belirli bir adres / port kombinasyonu için yalnızca bir dinleyici soketi olabilir .
Bu beni, içten dışa bildiğimi düşündüğüm bazı şeyleri yeniden incelemeye zorlayan ilginç bir soruydu. "Soket" gibi bir adın kendinden açıklayıcı olacağını düşünürdünüz: Açıkça bir ağ kablosunu taktığınız uç noktanın görüntülerini uyandırmak için seçildi, güçlü fonksiyonel paralellikler vardı. Bununla birlikte, ağ başlangıcında "soket" kelimesi o kadar çok bagaj taşır ki dikkatli bir yeniden inceleme gereklidir.
Mümkün olan en geniş anlamda, bir liman bir giriş veya çıkış noktasıdır. Bir ağ bağlamında kullanılmasa da, Fransızca porte kelimesi kelimenin tam anlamıyla kapı veya ağ geçidi anlamına gelir ve bu da bağlantı noktalarının veri veya büyük çelik kaplar gönderip taşımanızın ulaşım uç noktaları olduğunu vurgulamaktadır.
Bu tartışmanın amacı doğrultusunda, düşünmeyi TCP-IP ağlarının bağlamıyla sınırlayacağım. OSI modeli çok iyi, ancak hiçbir zaman tam olarak uygulanmadı, yüksek trafikli yüksek stresli koşullarda çok daha az yaygın bir şekilde konuşlandırıldı.
Bir IP adresi ile bir portun birleşimi kesinlikle bir uç nokta olarak bilinir ve bazen soket olarak adlandırılır. Bu kullanım orijinal TCP belirtimi olan RFC793'ten kaynaklanır.
TCP bağlantısı soketler olarak adlandırılan iki uç nokta ile tanımlanır .
Bir uç nokta (soket), bir ağ adresi ile bir bağlantı noktası tanımlayıcısı kombinasyonu tarafından tanımlanır. Olmadığını adres / port Not değil tamamen (bu konuda daha sonra) bir soket tanımlar.
Bağlantı noktalarının amacı, belirli bir ağ adresindeki birden çok uç noktayı ayırt etmektir. Bir bağlantı noktasının sanallaştırılmış bir bitiş noktası olduğunu söyleyebilirsiniz. Bu sanallaştırma, tek bir ağ arabiriminde birden çok eşzamanlı bağlantıyı mümkün kılar.
İnternetteki her TCP bağlantısını benzersiz şekilde tanımlayan iki uç noktayı belirten soket çiftidir (istemci IP adresi, istemci port numarası, sunucu IP adresi ve sunucu port numarasından oluşan 4-uç). ( TCP-IP Resimli Cilt 1 , W. Richard Stevens)
Çoğu C türevi dilde, TCP bağlantıları bir Socket sınıfının örneğindeki yöntemler kullanılarak oluşturulur ve işlenir. Genellikle bir NetworkStream sınıfının bir örneği olan daha yüksek bir soyutlama düzeyinde çalışmak yaygın olsa da, bu genellikle bir soket nesnesine bir başvuru ortaya koyar. Kodlayıcıya, bu soket nesnesi bağlantıyı temsil eder, çünkü bağlantı soket nesnesinin yöntemleri kullanılarak oluşturulur ve işlenir.
C # 'da (mevcut bir dinleyiciye) bir TCP bağlantısı kurmak için önce bir TcpClient oluşturursunuz . TcpClient yapıcısına bir bitiş noktası belirtmezseniz , varsayılanları kullanır - şu veya bu şekilde yerel bitiş noktası tanımlanır. Ardından, oluşturduğunuz örnekte Connect yöntemini çağırırsınız . Bu yöntem, diğer uç noktayı tanımlayan bir parametre gerektirir.
Bütün bunlar biraz kafa karıştırıcı ve bir soketin bir kilit, yani kilitler olduğuna inanmanıza neden oluyor. Richard Dorman soruyu sorana kadar bu yanlış anlama altında çalışıyordum.
Çok fazla okuma ve düşünme yaptıktan sonra, iki argüman alan LocalEndpoint ve RemoteEndpoint ile bir sınıf TcpConnection sınıfına sahip olmanın çok daha mantıklı olacağına ikna oldum . Yerel son nokta için varsayılanlar kabul edilebilir olduğunda büyük olasılıkla tek bir RemoteEndpoint bağımsız değişkenini destekleyebilirsiniz . Bu, birden çok ağ bağlantısı olan bilgisayarlarda belirsizdir, ancak uzak uç noktaya en kısa yol olan arabirimi seçerek yönlendirme tablosu kullanılarak belirlenebilir.
Netlik diğer açılardan da artırılacaktı. Bir yuva edilir değil IP adresi ve port kombinasyonu tarafından tespit:
[...] TCP, yerel ve yabancı adresleri içeren dört değerin tümünü kullanarak gelen segmentleri çoğaltır: hedef IP adresi, hedef port numarası, kaynak IP adresi ve kaynak port numarası. TCP, yalnızca hedef bağlantı noktasına bakarak hangi işlemin gelen segmenti alacağını belirleyemez. Ayrıca, [belirli bir bağlantı noktası numarası] 'ndaki [çeşitli] uç noktalardan gelen bağlantı isteklerini alacak olan tek kişi dinleme durumunda olan noktalardır. (p255, TCP-IP Resimli Cilt 1 , W. Richard Stevens)
Gördüğünüz gibi, sadece bir ağ hizmetinin aynı adres / bağlantı noktasına sahip çok sayıda sokete sahip olması mümkün değildir, ancak belirli bir adres / bağlantı noktası birleşiminde yalnızca bir dinleyici soketi vardır. Tipik kütüphane uygulamaları, örneği bir bağlantı oluşturmak ve yönetmek için kullanılan bir soket sınıfı sunar. Bu, son derece talihsiz bir durumdur, çünkü karışıklığa neden olur ve iki kavramın yaygın bir şekilde birleşmesine yol açar.
Hagrawal bana inanmıyor (yorumlara bakın) bu yüzden gerçek bir örnek. Bir web tarayıcısını http://dilbert.com adresine bağladım ve sonra koştum netstat -an -p tcp
. Çıktının son altı satırı, adresin ve bağlantı noktasının bir soketi benzersiz olarak tanımlamak için yeterli olmadığına dair iki örnek içerir. 192.168.1.3 (iş istasyonum) ile 54.252.94.236:80 (uzak HTTP sunucusu) arasında iki ayrı bağlantı var
TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT
TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT
TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED
Bir soket bağlantının uç noktası olduğundan, adres / bağlantı noktası birleşimine sahip iki soket ve adres / bağlantı noktası birleşimine sahip iki yuva 207.38.110.62:80
daha vardır 54.252.94.236:80
.
Bence Hagrawal'ın yanlış anlaması "özdeşleşiyor" kelimesini çok dikkatli kullanmamdan kaynaklanıyor. "Tamamen, kesin ve benzersiz bir şekilde özdeşleşir" demek istiyorum. Yukarıdaki örnekte, adres / port kombinasyonuna sahip iki uç nokta vardır 54.252.94.236:80
. Eğer tek adres ve port ise, bu soketleri birbirinden ayıracak kadar bilginiz yok. Bir soketi tanımlamak için yeterli bilgi yoktur .
RFC793 bölüm 2.7'nin ikinci paragrafı şöyle diyor:
Bir bağlantı, uçlardaki soket çifti tarafından tamamen belirtilir. Yerel bir soket farklı yabancı soketlerle birçok bağlantıya katılabilir.
Soketin bu tanımı, belirli bir bağlantının uç noktası olan soket nesnesiyle aynı olmadığından programlama açısından yararlı değildir . Bir programcı için ve bu sorunun izleyicilerinin çoğu programcıdır, bu hayati bir işlevsel farktır.
Bir soket üç şeyden oluşur:
Bağlantı noktası, bir aygıttaki mantıksal bir kapıyı gösteren 1 ile 65535 arasında bir sayıdır. İstemci ve sunucu arasındaki her bağlantı için benzersiz bir soket gerekir.
Örneğin:
Bir soket , iki ağ uygulaması arasındaki tek bir bağlantıyı temsil eder. Bu iki uygulama nominal olarak farklı bilgisayarlarda çalışır, ancak soketler tek bir bilgisayarda işlemlerarası iletişim için de kullanılabilir. Uygulamalar birbirleriyle iletişim kurmak için birden fazla yuva oluşturabilir. Soketler çift yönlüdür, yani bağlantının her iki tarafında veri gönderebilir ve alabilir. Bu nedenle teorik olarak OSI modelinin herhangi bir seviyesinde 2'den yukarı doğru bir soket oluşturulabilir. Programcılar genellikle dolaylı da olsa ağ programlamasında yuva kullanır. Winsock gibi programlama kütüphaneleri, soket programlamanın düşük seviyeli ayrıntılarının çoğunu gizler. Soketler 1980'lerin başından beri yaygın olarak kullanılmaktadır.
Bağlantı noktası, ağ iletişimi için bir bitiş noktasını veya "kanalı" temsil eder. Bağlantı noktası numaraları, aynı bilgisayardaki farklı uygulamaların birbirine müdahale etmeden ağ kaynaklarını kullanmasına olanak tanır. Bağlantı noktası numaraları en yaygın olarak ağ programlamasında, özellikle soket programlamasında görülür. Ancak bazen bağlantı noktası numaraları sıradan kullanıcı tarafından görülebilir. Örneğin, bir kişinin İnternet'te ziyaret ettiği bazı Web siteleri aşağıdaki gibi bir URL kullanır:
http://www.mairie-metz.fr:8080/ Bu örnekte 8080 sayısı, Web tarayıcısı tarafından Web sunucusuna bağlanmak için kullanılan bağlantı noktası numarasını ifade eder. Normalde, bir Web sitesi 80 numaralı bağlantı noktasını kullanır ve bu numaranın URL'ye dahil edilmesi gerekmez (olmasına rağmen).
IP ağında, bağlantı noktası numaraları teorik olarak 0 ila 65535 arasında olabilir. Çoğu popüler ağ uygulaması, aralığın alt ucundaki bağlantı noktası numaralarını kullanır (HTTP için 80 gibi).
Not: Bağlantı noktası terimi, ağ teknolojisinin diğer bazı yönlerini de ifade eder. Bağlantı noktası, seri, paralel ve USB bağlantı noktaları gibi çevresel aygıtlar için fiziksel bir bağlantı noktasına başvurabilir. Bağlantı noktası terimi ayrıca bir hub, anahtar veya yönlendirici gibi belirli Ethernet bağlantı noktalarını ifade eder.
ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm
ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm
Biraz benzetmeyle
Yukarıda soketler için çok fazla teknik malzeme verilmiş olmasına rağmen ... Birisi hala ip, port ve soketler arasındaki farkı hissedemiyorsa, cevabımı eklemek istiyorum.
Bir sunucu S düşünün ,
ve X, Y, Z kişilerinin bu sunucudan bir servise (sohbet servisi diyelim) ihtiyacı var
sonra
IP adresi söyler -> kim? sohbet sunucusunun X, Y, Z ile iletişime geçmek istediği 'S'
tamam, "sunucu kim"
ancak "S" sunucusunun diğer kişilere de başka hizmetler sunduğunu varsayalım, "S" A, B, C kişisine depolama hizmetleri sağlıyorsa,
sonra
port --- hangisini söyler ? size (X, Y, Z) ihtiyaç duyduğunuz servis, yani sohbet servisi değil, sohbet servisi
tamam .., sunucunun 'sohbet servisi' nin depolamak yerine istediğiniz şey olduğunu bilmesini sağlıyorsunuz
fakat
üç yaşındasınız ve sunucu bu üçünü de farklı şekilde tanımlamak isteyebilir
soket geliyor
şimdi soket söyler -> hangisi? belirli bağlantı
yani,
kişi X için soket 1
Y kişi için soket 2
ve Z kişi için soket 3
Umarım hala şaşkın birine yardım eder :)
Birincisi, sanırım A'dan B'ye bir paket almayı neyin oluşturduğuna dair biraz anlayışla başlamalıyız.
Bir ağ için ortak bir tanım, bir ağı amaca göre birkaç katmana ayıran OSI Modelinin kullanılmasıdır. Burada ele alacağımız birkaç önemli nokta var:
TCP, diğer şeylerin yanı sıra bağlantı noktaları kavramını içerir . Bunlar, bir İnternet Soketinin ( AF_INET
) bağlanabileceği aynı IP adresindeki etkin bir şekilde farklı veri uç noktalarıdır .
Olduğu gibi , UDP ve diğer taşıma katmanı protokolleri de öyle. Teknik olarak bağlantı noktalarına sahip olmaları gerekmez , ancak bu bağlantı noktaları yukarıdaki katmanlardaki birden fazla uygulamanın aynı bilgisayarı giden bağlantıları almak (ve aslında yapmak) için kullanması için bir yol sağlar.
Bu da bizi bir TCP veya UDP bağlantısının anatomisine getiriyor. Her birinde bir kaynak bağlantı noktası ve adresi ile bir hedef bağlantı noktası ve adresi bulunur. Böylece, herhangi bir oturumda, hedef uygulama kaynaktan yanıt alabileceği gibi, kaynaktan da alabilir.
Bu nedenle, portlar aslında aynı adresi paylaşan birden fazla eşzamanlı bağlantıya izin vermenin şartname zorunlu bir yoludur.
Şimdi, bir uygulama açısından dış dünyaya nasıl iletişim kurduğunuza bir göz atmamız gerekiyor. Bunu yapmak için, işletim sisteminize nazikçe sormanız gerekir ve çoğu işletim sistemi Berkeley Soketleri bir şeyler yapma şeklini desteklediğinden, böyle bir uygulamadan bağlantı noktalarını içeren soketler oluşturabileceğimizi görüyoruz:
int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket
int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket
// later we bind...
Harika! Yani sockaddr
yapılarda limanımızı ve bam'ımızı belirleyeceğiz! İş bitmiş! Neredeyse hariç:
int fd = socket(AF_UNIX, SOCK_STREAM, 0);
ayrıca mümkündür. Urgh, bu eserlere bir somun anahtarı attı!
Tamam, aslında olmadı. Tek yapmamız gereken bazı uygun tanımlar bulmaktır:
/var/run/database.sock
.İşte bu kadar! Bu işleri düzenler. O halde planımızda,
Yani gerçekten bir port, bir internet soketi oluşturmak için gereksinimlerin bir alt kümesidir. Ne yazık ki, soket kelimesinin anlamı birkaç farklı fikre uygulanmıştır. Bu yüzden, sadece karışıklığa eklemek için bir sonraki proje soketinizi ismini vermenizi tavsiye ederim;)
Bir soket = IP Adresi + bir port (sayısal adres)
Birlikte, bir makinedeki ağ bağlantısı için bir bitiş noktası tanımlarlar. (Sadece ağ 101'i kullandım mı?)
Genel olarak, çok fazla teorik olursunuz, ancak bu iki kavramı ayırt etmenin en kolay yollarından biri aşağıdaki gibidir:
Servis alabilmek için bir servis numarasına ihtiyacınız vardır. Bu servis numarasına port adı verilir. Bu kadar basit.
Örneğin, hizmet olarak HTTP 80 numaralı bağlantı noktasında çalışıyor.
Şimdi, birçok kişi hizmeti talep edebilir ve istemci-sunucudan bir bağlantı kurulmuştur. Çok fazla bağlantı olacak. Her bağlantı bir istemciyi temsil eder. Her bağlantıyı korumak için sunucu, istemcisini korumak için bağlantı başına bir soket oluşturur.
2 PC arasındaki bağlantı ile soket denklem cevapları bir sürü var gibi görünüyor ... hangi kesinlikle yanlış olduğunu düşünüyorum. Bir soket her zaman 1 PC'de bitiş noktası olmuştur, bağlanabilir veya bağlanmayabilir - elbette hepimiz bir noktada dinleyici veya UDP soketleri * kullandık. Önemli olan, adreslenebilir ve aktif olmasıdır. 1.1.1.1:1234'e bir mesaj göndermek, bu uç nokta için tanımlanmış bir soket olmadığından işe yaramaz.
Yuva protokol özeldir - teklik uygulanması böylece hem bu TCP / IP ve UDP / IP kullanır. *: (İpadresi bağlantı noktası), daha örn farklıdır IPX - ama farklı (Ağ, Düğüm ve ... ehem, soket soket genel "soket" terimi ile kastedilmektedir IPX soket numaraları IP portlarına eşdeğerdir). Ancak, hepsi benzersiz bir adreslenebilir uç nokta sunar.
IP baskın protokol haline geldiğinden, bir bağlantı noktası (ağ oluşturma açısından) soket adresinin bir parçası olan bir UDP veya TCP bağlantı noktası numarasıyla eşzamanlı hale gelmiştir.
UDP bağlantısızdır, yani 2 uç nokta arasında hiçbir sanal devre oluşturulmamıştır. Ancak yine de UDP soketlerini uç nokta olarak adlandırıyoruz. API işlevleri, her ikisinin de sadece farklı türde bir soket olduğunu açıklar - SOCK_DGRAM
UDP (sadece mesaj gönderme) ve SOCK_STREAM
TCP (sanal devre oluşturma).
Teknik olarak, IP üstbilgisi IP Adresini tutar ve IP'nin üstündeki protokol (UDP veya TCP) bağlantı noktası numarasını tutar. Bu, başka protokollere (örn. Bağlantı noktası numarası olmayan, ancak IP adresleme bilgisi olan ICMP) sahip olmayı mümkün kılar .
Kısa kısa cevap.
Bir bağlantı noktası bir şekilde tarif edilebilir iç adresi , bir program veya işlem tanımlayan bir ev sahibi içinde.
Bir soket , bir programın diğer programlar veya süreçlerle, internette veya yerel olarak iletişim kurmasına izin veren bir programlama arabirimi olarak tanımlanabilir .
Bunlar iki farklı alandan gelen terimlerdir: 'port' TCP / IP ağından bir kavramdır, 'socket' bir API (programlama) olayıdır. Bağlantı noktası ve ana bilgisayar adı veya ağ bağdaştırıcısı alıp veri göndermek veya almak için kullanabileceğiniz bir veri yapısında birleştirilerek 'soket' yapılır (kodda).
Bunlar temel ağ oluşturma kavramlarıdır, bu yüzden onları ayrıntılı olarak anlamak için kolay ama kapsamlı bir şekilde açıklayacağım.
Yani ağdaki bir soket bir çift (ip, port) = (adres, servis) ile bağlantılı bir sanal iletişim cihazıdır.
Not:
Umarım şüphelerini temizler
Mükemmel oylanan cevapları okuduktan sonra, aşağıdaki noktaların ağ programlamaya yeni katılan benim için vurgulanması gerektiğini buldum:
TCP-IP bağlantıları, bir adres: bağlantı noktası birleşimini başka bir adres: bağlantı noktası birleşimi ile bağlayan iki yönlü yollardır. Bu nedenle, yerel makinenizden uzak sunucudaki bir bağlantı noktasına (örneğin www.google.com:80) bir bağlantı açtığınızda, sunucunun göndermesine izin vermek için makinenizdeki yeni bir bağlantı noktası numarasını da bağlantıyla ilişkilendirirsiniz. bazı şeyleri size geri göndeririz (örneğin 127.0.0.1:65234). Makinenizin bağlantılarına bakmak için netstat kullanmak yararlı olabilir:
> netstat -nWp tcp (on OS X)
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4 0 0 192.168.0.6.49871 17.172.232.57.5223 ESTABLISHED
...
123.132.213.231 # IP address
:1234 # port number
123.132.213.231:1234 # socket address
2 soket birbirine bağlandığında bir bağlantı oluşur.
Bir soket, bir işlem tarafından işletim sisteminden ağ hizmetleri istemek için kullanılan özel bir dosya tanıtıcı türüdür. Yuva adresi üçlüdür: {protokol, yerel adres, yerel işlem}, burada yerel işlem bir port numarası ile tanımlanır.
TCP / IP paketinde, örneğin:
{tcp, 193.44.234.3, 12345}
Bir konuşma iki süreç arasındaki iletişim bağlantısıdır, böylece iki süreç arasındaki ilişkiyi gösterir. İlişkilendirme, bir bağlantı içeren iki işlemi tamamen belirten 5-demettir: {protokol, yerel adres, yerel işlem, yabancı adres, yabancı işlem}
TCP / IP paketinde, örneğin:
{tcp, 193.44.234.3, 1500, 193.44.234.5, 21}
geçerli bir ilişkilendirme olabilir.
Yarım ilişkilendirme ya: {protokol, yerel adres, yerel işlem}
veya
{protokol, yabancı adres, yabancı süreç}
bağlantının her yarısını belirtir.
Yarı birleşime soket veya aktarım adresi de denir. Yani soket, bir ağda adlandırılabilen ve adreslenebilen iletişim için bir bitiş noktasıdır. Soket arayüzü, iletişim protokollerine yönelik çeşitli uygulama programlama arayüzlerinden (API) biridir. Genel bir iletişim programlama arayüzü olarak tasarlanan bu ürün, ilk olarak 4.2BSD UNIX sistemi tarafından tanıtıldı. Standartlaştırılmamış olmasına rağmen fiilen endüstri standardı haline gelmiştir.
Bir soket bir iletişim uç noktasıdır. Bir soket doğrudan TCP / IP protokol ailesi ile ilgili değildir, sisteminizin desteklediği herhangi bir protokolle kullanılabilir. C soketi API'sı önce sistemden boş bir soket nesnesi almanızı bekler, ardından ya yerel soket adresine bağlayabilirsiniz (bağlantısız protokoller için gelen trafiği doğrudan almak veya bağlantıya yönelik protokoller için gelen bağlantı isteklerini kabul etmek) veya uzak soket adresine bağlanabilmeniz (her iki protokol için de). Her ikisini de kontrol etmek istiyorsanız, bir soketin bağlı olduğu yerel soket adresini ve bir soketin bağlı olduğu uzak soket adresini de yapabilirsiniz. Bir soketi bağlayan bağlantısız protokoller için bile isteğe bağlıdır, ancak bunu yapmazsanız, ayrıca soket üzerinden göndermek istediğiniz her paket ile hedef adresi iletmek zorunda kalacaksınız, çünkü soket bu verileri nereye göndereceğini nasıl biliyor? Avantajı, paketleri farklı soket adreslerine göndermek için tek bir soket kullanabilmenizdir. Soketinizi yapılandırdıktan ve hatta bağladıktan sonra, çift yönlü bir iletişim borusu olarak düşünün. Verileri bir hedefe aktarmak için kullanabilirsiniz ve bazı hedefler verileri size geri iletmek için kullanabilir. Bir sokete yazdıklarınız gönderilir ve alınanlar okunabilir. Verileri bir hedefe aktarmak için kullanabilirsiniz ve bazı hedefler verileri size geri iletmek için kullanabilir. Bir sokete yazdıklarınız gönderilir ve alınanlar okunabilir. Verileri bir hedefe aktarmak için kullanabilirsiniz ve bazı hedefler verileri size geri iletmek için kullanabilir. Bir sokete yazdıklarınız gönderilir ve alınanlar okunabilir.
Diğer taraftan bağlantı noktaları, TCP / IP protokol yığınının yalnızca belirli protokollerinin sahip olduğu bir şeydir. TCP ve UDP paketlerinde bağlantı noktaları bulunur. Bir port sadece basit bir sayıdır. Kaynak bağlantı noktası ve hedef bağlantı noktası birleşimi, iki ana bilgisayar arasındaki iletişim kanalını tanımlar. Örneğin, hem basit bir HTTP sunucusu hem de basit bir FTP sunucusu olacak bir sunucunuz olabilir. Şimdi bu sunucunun adresi için bir paket gelirse, bunun HTTP veya FTP sunucusu için bir paket olup olmadığını nasıl bilebilir? HTTP sunucusu 80 numaralı bağlantı noktasında ve FTP sunucusu 21 numaralı bağlantı noktasında çalışacağından, paket bir hedef bağlantı noktası 80 ile birlikte gelirse, FTP sunucusu için değil, HTTP sunucusu içindir. Ayrıca paketin bir kaynak portu vardır, çünkü böyle bir kaynak portu olmadan, bir sunucunun aynı anda sadece bir IP adresine tek bir bağlantısı olabilir. Kaynak bağlantı noktası bir sunucunun başka türlü özdeş bağlantıları ayırt etmesini mümkün kılar: hepsinin aynı hedef bağlantı noktası vardır, örneğin bağlantı noktası 80, aynı hedef IP'si (sunucunun IP'si) ve hepsinin geldiği kaynak IP'si aynı istemci, ancak farklı kaynak bağlantı noktalarına sahip olduklarından, sunucu bunları birbirinden ayırt edebilir. Sunucu yanıtları geri gönderdiğinde, isteğin geldiği bağlantı noktasına bunu yapar, böylece istemci aynı sunucudan aldığı farklı yanıtları da ayırt edebilir.
Bağlantı noktası en kolay kısımdı, sadece bir soket için benzersiz bir tanımlayıcıydı. Bir soket, süreçlerin bağlantı kurmak ve birbirleriyle iletişim kurmak için kullanabileceği bir şeydir. Tall Jeff mükemmel olmayan harika bir telefon benzetmesi vardı, bu yüzden düzeltmeye karar verdim:
netstat
süre ekrana bakın . Bir dinleme soketinden kabul edilen tüm soketler aynı bağlantı noktasını paylaşır. Ergo bağlantı noktası bir soket için benzersiz bir tanımlayıcı değildir.
Bir uygulama, ağ üzerinden iletişim kuran süreçlerden oluşur (istemci-sunucu çifti). Bu işlemler, soket adı verilen bir yazılım arabirimi aracılığıyla ağa ve ağdan mesaj gönderir ve alır . "Bilgisayar Ağı: Yukarıdan Aşağıya Yaklaşım" kitabında sunulan benzetme dikkate alındığında. Diğer evle iletişim kurmak isteyen bir ev var. Burada, ev bir sürece benzer ve bir sokete kapıdır. Gönderme işlemi, kapının diğer tarafında verileri hedefe taşıyacak bir altyapı bulunduğunu varsayar. Mesaj diğer tarafa ulaştığında, alıcının kapısından (soket) eve (işlem) geçer. Aynı kitaptaki bu çizim size yardımcı olabilir:
Soketler, uygulamalarla mantıksal iletişim sağlayan taşıma katmanının bir parçasıdır. Bu, uygulamanın bakış açısından, aralarında çok sayıda yönlendirici ve / veya anahtar olmasına rağmen, her iki ana bilgisayarın da doğrudan birbirine bağlı olduğu anlamına gelir. Böylece bir soket bir bağlantının kendisi değildir, bağlantının bitiş noktasıdır. Aktarım katmanı protokolleri ara yönlendiricilerde değil, yalnızca ana bilgisayarlarda uygulanır.
Limanlarbir makineye dahili adresleme aracı sağlar. Birincil amaç, birden çok işlemin, diğer işlemlere (verileri) müdahale etmeden ağ üzerinden veri göndermesine ve almasına izin vermesidir. Tüm soketler bir port numarası ile birlikte verilir. Bir segment bir ana bilgisayara ulaştığında, taşıma katmanı segmentin hedef port numarasını inceler. Daha sonra segmenti ilgili sokete iletir. Bir taşıma katmanı segmentindeki verileri doğru sokete iletme işine çoğullama denir . Segmentin verileri daha sonra sokete bağlı işleme iletilir.
Soket, yazılımınızdaki bir yapıdır. Az çok bir dosya; okuma ve yazma gibi işlemleri vardır. Fiziksel bir şey değil; yazılımınızın fiziksel şeyleri ifade etmesinin bir yoludur.
Bağlantı noktası, aygıt benzeri bir şeydir. Her ana bilgisayarın bir veya daha fazla ağı vardır (bunlar fizikseldir); bir ana bilgisayarın her ağda bir adresi vardır. Her adres binlerce bağlantı noktasına sahip olabilir.
Sadece bir soket bir adreste bağlantı noktası kullanıyor olabilir. Soket bağlantı noktasını yaklaşık olarak dosya sistemi G / Ç için bir aygıt ayırmaya benzer. Bağlantı noktası tahsis edildikten sonra, bu bağlantı noktasına başka bir soket bağlanamaz. Soket kapalı olduğunda port serbest bırakılacaktır.
TCP / IP Terminolojisine bir göz atın .
dan Oracle Java Eğitimi :
Bir soket, ağ üzerinde çalışan iki program arasındaki iki yönlü iletişim bağlantısının bir uç noktasıdır. TCP katmanı, verilerin gönderilmek üzere yönlendirildiği uygulamayı tanımlayabilmesi için bir yuva bağlantı noktası numarasına bağlıdır.
Liman ve soket Banka Şubesi ile karşılaştırılabilir.
"Banka" nın bina numarası IP adresine benzer. Bir bankanın farklı bölümleri vardır:
Yani 1 (tasarruf hesabı departmanı), 2 (kişisel kredi departmanı), 3 (konut kredisi departmanı) ve 4 (şikayet departmanı) limanlardır.
Şimdi diyelim ki bir tasarruf hesabı açıyorsunuz, bankaya gidiyorsunuz (IP adresi), sonra "tasarruf hesabı departmanı" na (port numarası 1) gidiyorsunuz, sonra "tasarruf hesabı departmanı" altında çalışan çalışanlardan biriyle tanışıyorsunuz ". Hesap açmak için ona SAVINGACCOUNT_EMPLOYEE1 diyelim.
SAVINGACCOUNT_EMPLOYEE1, soket tanımlayıcınız olduğundan SAVINGACCOUNT_EMPLOYEE1 ile SAVINGACCOUNT_EMPLOYEEN arasında olabilir. Bunların hepsi soket tanımlayıcılarıdır.
Benzer şekilde, diğer departmanların altında çalışan bir istihdam olacaktır ve bunlar sokete benzerdir.
Soket bir veri G / Ç mekanizmasıdır. Bağlantı noktası, bir iletişim protokolünün sözleşmeli bir konseptidir . Bağlantı noktası olmadan bir soket bulunabilir. Belirli bir soket olmadan bir port bulunabilir (örneğin, aynı port üzerinde bazı protokoller için izin verilebilecek birden fazla soket etkinse).
Bir port, alıcının paketi hangi protokole yönlendireceğini belirlemek için kullanılır, ancak her zaman gerekli değildir ve alıcı soket seçimi başka yollarla yapılabilir - bir port tamamen protokol işleyicisi tarafından kullanılan bir araçtır. ağ alt sistemi. örneğin bir protokol bağlantı noktası kullanmıyorsa, paketler tüm dinleme soketlerine veya herhangi bir sokete gidebilir.
Tahmin ettiğim şey göreceli TCP / IP terminolojisi soruda ima edilmektedir. Layman'ın terimleriyle:
PORT, belirli bir evin belirli bir posta kodundaki telefon numarası gibidir. Kasabanın posta kodu, kasabanın IP adresi ve o kasabadaki tüm evler olarak düşünülebilir.
Öte yandan bir SOKET, birbirleriyle konuşan bir çift evin telefonları arasında yerleşik bir telefon görüşmesine benzer. Bu çağrılar aynı kasabadaki evler veya farklı kasabalardaki iki ev arasında yapılabilir. Birbiriyle konuşan telefon çifti arasındaki geçici yerleşik yol, SOKET.
Geniş anlamda, Soket - tıpkı elektrik, kablo veya telefon soketiniz gibi bir soket. "Gerekli şeylerin" (güç, sinyal, bilgi) dışarı çıkıp gelebileceği bir nokta. "Gerekli şeylerin" kullanımı için gerekli olmayan birçok ayrıntılı şeyi gizler. Yazılım söz konusu olduğunda, iki varlık arasında bir iletişim mekanizması tanımlamak için genel bir yol sağlar (bu varlıklar herhangi bir şey olabilir - iki uygulama, iki fiziksel olarak ayrı cihaz, bir işletim sistemi içindeki Kullanıcı ve Çekirdek alanı, vb.)
Bir Bağlantı Noktası bir uç nokta ayırıcısıdır. Bir uç noktayı diğerinden ayırır. Ağ düzeyinde, bir uygulamayı diğerinden ayırır, böylece ağ yığını bilgileri uygun uygulamaya aktarabilir.
Bu soruya zaten teorik cevaplar verilmiştir. Soket ve Liman hakkındaki anlayışınızı netleştirecek bu soruya pratik bir örnek vermek istiyorum.
Burada buldum
Bu örnek, Wiley gibi bir web sitesine bağlanma süreci boyunca size yol gösterecektir. Web tarayıcınızı (Mozilla Firefox gibi) açar ve adres çubuğuna www.wiley.com yazarsınız. Web tarayıcınız bir Alan Adı Sistemi (DNS) sunucusu kullanarak IP adresini belirlemek için www.wiley.com adını arar. Bu örnek için adres 192.0.2.100'dür.
Firefox, 192.0.2.100 adresine ve uygulama katmanı web sunucusunun çalıştığı bağlantı noktasına bağlantı kurar. Firefox, hangi portun bekleneceğini biliyor çünkü iyi bilinen bir port. Bir web sunucusu için iyi bilinen bağlantı noktası 80 numaralı TCP bağlantı noktasıdır.
Firefox'un bağlanmaya çalıştığı hedef soket soket: bağlantı noktası olarak veya bu örnekte 192.0.2.100:80 olarak yazılmıştır. Bu bağlantının sunucu tarafıdır, ancak sunucunun Mozilla Firefox'ta görüntülemek istediğiniz web sayfasını nereye göndereceğini bilmesi gerekir, böylece bağlantının istemci tarafı için de bir soketiniz olur.
İstemci tarafı bağlantısı 192.168.1.25 gibi IP adresinizden ve rastgele seçilen bir dinamik bağlantı noktası numarasından oluşur. Firefox ile ilişkili soket 192.168.1.25:49175 gibi görünüyor. Web sunucuları 80 numaralı TCP bağlantı noktasında çalıştığından, bu soketlerin her ikisi de TCP soketleriyken, bir UDP bağlantı noktasında çalışan bir sunucuya bağlanıyorsanız, hem sunucu hem de istemci soketleri UDP yuvaları olacaktır.
Soket, veri I / O için çekirdek tarafından kullanıcı uygulamalarına sağlanan bir soyutlamadır. Bir soket türü, protokolü, kullanımı, IPC iletişimi vb. Tarafından tanımlanır. Bu nedenle, birisi bir TCP soketi oluşturuyorsa, sokete veri okumak ve ona basit yöntemler ve TCP dönüşümleri gibi daha alt düzey protokol kullanımı ile veri yazmak gibi manipülasyonlar yapabilir. paketleri daha düşük seviyeli ağ protokollerine iletmek, çekirdekteki belirli soket uygulamasıyla yapılır. Avantajı, kullanıcının protokole özgü nitigriteleri ele alma konusunda endişelenmesine gerek olmaması ve sadece normal bir tampon gibi sokete veri okuması ve yazmasıdır. Aynı durum IPC için de geçerlidir, kullanıcı sadece sokete veri okur ve yazar ve çekirdek, oluşturulan soket türüne bağlı olarak daha düşük seviyedeki tüm ayrıntıları işler.
IP ile birlikte port, sokete bir adres sağlamak gibidir, ancak gerekli değildir, ancak ağ iletişimine yardımcı olur.
Tek bir bağlantı noktasında, birden çok elektrik prizi gibi farklı harici IP'lere bağlı bir veya daha fazla soket bulunabilir.
TCP 192.168.100.2:9001 155.94.246.179:39255 ESTABLISHED 1312
TCP 192.168.100.2:9001 171.25.193.9:61832 ESTABLISHED 1312
TCP 192.168.100.2:9001 178.62.199.226:37912 ESTABLISHED 1312
TCP 192.168.100.2:9001 188.193.64.150:40900 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.23.194.149:43970 ESTABLISHED 1312
TCP 192.168.100.2:9001 198.49.73.11:38842 ESTABLISHED 1312
Soket, uygulamanın arabirimi olarak kullanılan ağ uç noktasının SW soyutlamasıdır. Java, C #, nesne ile temsil edilir, Linux'ta, Unix bir dosyadır.
Bağlantı noktası, iletişim kurmak isteyip istemediğinizi belirttiğiniz bir soketin özelliğidir. Bir soketten paket almak için belirli bir yerel bağlantı noktasına ve NIC'ye (yerel IP adresi ile) veya tüm NIC'lere (bağlama çağrısında INADDR_ANY belirtilir) bağlamanız gerekir. Paket göndermek için uzak soketin bağlantı noktasını ve IP'sini belirtmeniz gerekir.
Bir soket temel olarak ağ iletişimi için en az bir IP adresi ve bir bağlantı noktasından oluşan bir uç noktadır. Java / C # 'da bir soket, iki yönlü bağlantının bir tarafının daha üst düzey bir uygulamasıdır.
Ayrıca, Java belgelerinde bir tanım .
Liman:
Bağlantı noktası, seri, paralel ve USB bağlantı noktaları gibi çevresel aygıtlar için fiziksel bir bağlantı noktasına başvurabilir. Bağlantı noktası terimi ayrıca bir hub, anahtar veya yönlendiricideki gibi bazı Ethernet bağlantı noktalarını ifade eder.
Priz:
Bir soket, iki ağ uygulaması arasındaki tek bir bağlantıyı temsil eder. Bu iki uygulama nominal olarak farklı bilgisayarlarda çalışır, ancak soketler tek bir bilgisayarda işlemlerarası iletişim için de kullanılabilir. Uygulamalar birbirleriyle iletişim kurmak için birden fazla yuva oluşturabilir. Soketler çift yönlüdür, yani bağlantının her iki tarafında veri gönderebilir ve alabilir.
Bir bağlantı noktası IP ağ protokolü için TCP ve UDP aktarımlarında bir iletişim uç noktasını belirtir. Bir soket, bu protokollerin (soket API) uygulamalarında yaygın olarak kullanılan bir iletişim uç noktası için bir yazılım soyutlamasıdır. Alternatif bir uygulama XTI / TLI API'sıdır.
Ayrıca bakınız:
Stevens, WR 1998, UNIX Ağ Programlama: Ağ API'leri: Yuva ve XTI; Cilt 1, Prentice Salonu.
Stevens, WR, 1994, TCP / IP Resimli, Cilt 1: Protokoller, Addison-Wesley.