經過了上節的學習之后,接下來我們再要了解的一個知識就是端口號和套接字。尤其端口號,是傳輸層中最為重要的基礎概念之一,我們在以后的學習中會經常提及到端口號。
端口號
曾經在學習TCP/IP模型的時候,我們曾學過“SAP”即服務訪問點的概念,傳輸層的SAP即是端口號。也就是說,傳輸層是通過不同的端口和上面的應用層來交換數據的。我們上節提到過的傳輸層為兩臺主機的應用進程之間通信提供服務,其實說到本質上也就是端口號在起作用。
要理解端口號,首先需要理解什么是端口,上面我們說到應用進程,當數據發送方的QQ進程發出消息,消息到達接收方的時候,接收方能夠判斷出這個消息該由自己的QQ進程來接收。這就是因為每一個應用進程都有自己的一個端口,把每一個端口給它編號就是端口號,端口號可以唯一標識一個應用進程,不同應用進程的端口號是不同的,接收方就是根據端口號來判斷應把數據交給哪個應用程序的。
那么我們為所有的應用程序都安排一個固定的端口號就可以解決問題了,比如規定QQ進程的端口號是10,微信進程的端口號是20。這樣就可以了嗎?其實不然,因為應用進程是一個動態的概念,可以隨時被創建和撤銷,也就是我可以隨時打開一個應用程序,不想用了也可以隨時關閉,這樣的話和端口號的配合就不夠靈活。所以,比較好的一個解決辦法就是:當應用進程創建的時候,由系統自動為應用進程分配一個隨機的端口號,讓端口號也做到“動態地創建和撤銷”(除熟知端口號外)。
不過要說明的一點是,雖然端口號是由系統創建應用進程時隨機分配的,但這并不等于“隨便分配”。端口號也是有范圍的:0~65535,雖然數量是有限的,但這個數量對一個計算機來說足夠用了。
端口號的類型
在0~65535這個大范圍內,又把端口號分了三個小類,分別是:熟知端口號、登記端口號和短暫端口號。
其中,熟知端口號又叫“知名端口號”,這類端口號的范圍是0~1023,這類端口號一般都是在服務器端為一些比較重要的知名的應用程序固定使用的,目的就是為了讓所有的客戶程序都能找到服務器上相應的程序,所以必須是固定的且熟知的。就像日常生活中的110、119、120等報警和急救電話一樣,是大家共同熟知并且共同遵守的。當然我們不需要把所有的熟知端口號都記住,但在各類考試中我們必須要記住幾個常考的:
例如,HTTP使用的端口號是80,SMTP的端口號是25,POP3的是110,DNS的是53,FTP的是20和21,TELNET的是23。這些都是各類考試中常會考的幾個熟知端口號。
第二類是登記端口號,其范圍是1024~49151,這一類端口也一般是在服務器端使用,是為一些還沒有熟知端口號的應用程序使用的,不是太重要,簡單知道就可以。
第三類是短暫端口號,其范圍是49152~65535,這類端口一般是在客戶端使用的,僅在客戶進程運行時才被動態選擇。也就是說,這種端口的存在時期是短暫的,應用進程創建時被分配,應用進程撤銷時被收回。我們前面舉的例子,QQ和微信這種應用程序就是在創建時被動態的分配一個短暫端口號。其實在應用程序的角度看來,自己被分配的端口號是多少并不重要,因為所有的端口號對它們來說都是一樣的,只需要有一個端口,能夠進行通信的工作即可。
套接字(socket)
套接字這個概念,對我們而言是一個新的說法。我們之前說“兩臺主機之間互相通信”這個說法不準確,因為其本質是兩臺主機的應用進程之間的通信。后來我們講的是“兩臺主機應用進程之間的通信”,這個說法,準確了,但是不全面。
如果要既全面又準確的表達這個意思,有一個專門的術語,叫做Socket,也就是套接字。套接字的表達形式就是用冒號把IP地址和端口號連接起來,例如:(192.168.0.1:8080)所以,傳輸層的連接,最準確的說法應該是兩端套接字的連接。
學到這里,我們應該也能更加清晰地理解前面NAPT技術的原理了,私網IP地址能夠映射到同一個公網IP地址,但是使用不同的端口號。也就是在(私網IP?→?公網IP)這樣形式的NAT基礎上,變成了(私網IP:端口號? →? 公網IP:端口號)。
本節我們學習了傳輸層的端口號和套接字的概念。下面一節內容,我們將開始學習傳輸層兩大協議中TCP協議具體的細節。
參考教材:謝希仁《計算機網絡》第八版