TCP、UDP及Socket(Port)的關系,深入淺出!


提醒:貌似這里說的socket是指port,而非socket api技術!僅供參考!貌似標題命名不准確的說
《更安全的Linux網絡》第1章防火牆的基本概念,在本書的開始將詳盡講解與防火牆相關的TCP/IP技術。此外,對於防火牆的原理、種類、架構及其優、缺點,在本章中也都有詳盡的介紹。本節為大家介紹TCP、UDP及Socket的關系。
1.4 TCP、UDP及Socket的關系
在了解了信息在網絡上是如何傳遞之后,接下來,我們要認識傳輸層中另一個重要的標記——Port。Port在傳輸層中是一個很重要的概念,我們之所以能夠在一台主機上同時執行多個服務,都得歸功於Port的概念。在開始談Port之前,我們先來了解什么是Socket。
Socket是指一個上面有很多“洞”的東西,比如說,計算機主機板上CPU的插座,我們稱其為Socket 478或Socket 939等,而Socket上面這些洞在傳輸層中則稱為Port,在OS的網絡系統中會有兩個Socket,分別為TCPSocket及UDP Socket,Socket上各有65536個洞,我們把它稱為Port 0、Port 1、Port 2 …… Port 65 535。
我們以圖1-11為例來說明Port的用途,圖的左邊為Client端、圖的右邊則為Server端,在Server端主機上,我們假設執行了Web、 SSH及DNS這3項服務,在 TCP/IP的網絡規范中,每一個網絡應用程序執行時都會占用一個Port,如Server端的Web Service啟動時,就會占用在TCP Socket中的Port80,簡稱為TCP Port 80,而SSH Service是TCP Port 22、DNS Service則為UDP Port 53,因此我們可以說,TCP Port 80代表Web Service程序,TCPPort 22代表SSH Service程序,而UDP Port 53即代表DNS Service程序。
   

圖1-11  TCP、UDP及Port的關系
另外,在Client部分,我們假設Client端啟動了Browser、SSH Client及DNS Client 這3個網絡應用程序,在TCP/IP的規范中,客戶端的網絡應用程序啟動時,一樣也會占用一個Port。如圖1-11所示,我們假設Browser使用 TCP Port 2099、SSH Client使用TCP Port 2088,以及DNS Client使用UDPPort 5555,因此,我們也可以說,TCP Port 2099代表Browser程序、TCPPort 2088代表SSH Client程序、而UDP Port 5555則代表DNS Client程序。接下來看Port的用途。假設Client端主機上的Browser欲與Server端的Web Service 來傳遞數據,因此,Client端主機隨即產生一個數據封包送至 Server 端。我們假設 Client 端的 IP 為 10.0.1.219、Server 端的 IP 為202.43.195.52,這個封包的內容就如圖1-12所示。首先,封包內必然會記錄封包的來源及目的,在圖1-12中所標記的部分即為封包的來源 及目的地址,但光是這兩項信息只能代表Client端及Server端在傳送數據,並無法說明Client端主機上哪一個應用程序在訪問,所標記的部分就 說明了Client端以Port 2099來連接Server端的Port 80,但別忘了剛才說過的,Port可以代表主機上目前正在執行的某一個應用程序。

   

圖1-12  Client送至Server的封包內容
從以上說明我們可以了解,系統在接到一個封包之后,它是如何來辨別這個數據封包是要送給哪一個應用程序的。
當Web Service接到這個請求封包之后,Web Service也會回應Client端主機一個封包,而這個封包的內容就如圖1-13所示,圖中③所標記的位置為來源及接收端主機的IP,標記④的位置則 表示來源端的Web Service(Port 80)及響應給Client端主機的瀏覽器(Port 2099)。由以上例子相信你已經了解了Port的用途。
  
 
圖1-13  Server回應Client的封包內容
在了解Port的用途之后,我們要了解65536個Port是如何被分配使用的。其實,不管是TCP Port或UDP Port的運用,在RFC 1700文檔中都有完整的規范,我們可以從IANA的網站(http://www.iana.org/assignments/port-numbers)中取得Port的使用列表,或是從Linux系統中的/etc/services文件中取得這些信息,筆者將其整理如下。
公認的Port:0~1023。
注冊的Port:1024~49 151。
動態的Port:49 152~65 535。
1. 公認的Port
會使用TCP Port 80,因為它是一個“規范”、是大家都知道的事,所以Client端在Web Server上訪問Web Service時,Client端就會預設將封包送至Web Server的TCP Port 80。也因為有規范的存在,所以我們要訪問遠程的某個服務時,就無須特別打電話去詢問:“你們家的Web Service是使用在哪個Port中”,換句話說,每個Service都會有一個固定的Port,而這些Port我們就稱為公認的Port,其范圍為 0~1023。
2. 注冊的Port
由於在同一時間內,相同的Port只能給一個程序使用,因此,程序設計師在編寫網絡應用程序時,就得特別注意自己開發的應用程序是使用哪一個Port,而 這個Port是否已經被其他的應用程序占用了,但問題是程序設計師如何得知該Port已被其他應用程序占用了呢?所幸的是IANA組織定了一個規范,為了 避免不必要的Port沖突,在指定Port之前,凡是需要用到固定Port的網絡應用程序可先在IANA的網站上選用一個沒有其他應用程序在使用的 Port,並且可以將其注冊下來,以告訴其他的程序設計師,某個Port已被你所選用且已被注冊,通過IANA機制即可避免Port沖突的問題,而這些可 被使用者注冊的Port范圍為1024~49 151。
3. 動態的Port
動態的Port通常應用在暫時性的使用上,例如,幾乎所有Client端的應用程序都會使用動態Port,在Client端的應用程序啟動時,系統就會分 配一個“動態的Port”給該應用程序使用,並且在應用程序結束時將Port歸還給系統,而這些動態的Port范圍為49 152~65 535。
請注意,以上所講的“規范”並非所有程序設計師都會遵循,比如說,Linux系統上的SSH Client所使用的Port通常都會落在“注冊的Port”范圍內,其實這並不會對系統造成什么問題。原則上,“相同一個Port在同一時間內不得有一 個以上的應用程序同時使用”,只要把握這個原則,基本上都是可以被接受的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM