網路中可以被命名和定址的通訊連接埠,是作業系統可分配的一種資源。
按照OSI七層協議的描述,傳輸層與網路層在功能上的最大區別是傳輸層提供進程通訊能力。從這個意義上講,網路通訊的最終地址就不僅僅是主機地址了,還包括可以描述進程的某種標識符。為此,TCP/IP協議提出了協議連接埠(protocol port,簡稱連接埠)的概念,用於標識通訊的進程。
連接埠是一種抽象的軟體結構(包括一些資料結構和I/O緩衝區)。應用程式(即進程)通過系統調用與某連接埠建立串連(binding)後,傳輸層傳給該連接埠的資料都被相應進程所接收,相應進程發給傳輸層的資料都通過該連接埠輸出。在TCP/IP協議的實現中,連接埠操作類似於一般的I/O操作,進程擷取一個連接埠,相當於擷取本地唯一的I/O檔案,可以用一般的讀寫原語訪問之。
類似於檔案描述符,每個連接埠都擁有一個叫連接埠號碼(port number)的整數型標識符,用於區別不同連接埠。由於TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟體模組,因此各自的連接埠號碼也相互獨立,如TCP有一個255號連接埠,UDP也可以有一個255號連接埠,二者並不衝突。
連接埠號碼的分配是一個重要問題。有兩種基本分配方式:第一種叫全域分配,這是一種集中控制方式,由一個公認的中央機構根據使用者需要進行統一分配,並將結果公佈於眾。第二種是本地分配,又稱動態串連,即進程需要訪問傳輸層服務時,向本地作業系統提出申請,作業系統返回一個本地唯一的連接埠號碼,進程再通過合適的系統調用將自己與該連接埠號碼聯絡起來(綁紮)。TCP/IP連接埠號碼的分配中綜合了上述兩種方式。TCP/IP將連接埠號碼分為兩部分,少量的作為保留連接埠,以全域方式分配給服務進程。因此,每一個標準伺服器都擁有一個全域公認的連接埠(即周知口,well-known
port),即使在不同機器上,其連接埠號碼也相同。剩餘的為自由連接埠,以本地方式進行分配。TCP和UDP均規定,小於256的連接埠號碼才能作保留連接埠。
· 再討論一下,一個伺服器監控一個連接埠,比如80連接埠,它為什麼可以建立上成千上萬的串連?
首先, 一個TCP串連需要由四元組來形成,即(src_ip,src_port,dst_ip,dst_port)。當一個串連請求過來的時候,服務端調用accept函數,新產生一個socket,這個socket所佔用的本地連接埠依然是80連接埠。由四元組就很容易分析到了,同一個(src_ip,src_port),它所對應的(dst_ip,dst_port)可以無窮變化,這樣就可以建立很多個用戶端的請求了。