TCP/UDP 共用埠問題。
轉載自:TCP/UDP 佔用埠問題總結 - mengban - 部落格園 (cnblogs.com)
1.TCP UDP 可以共同佔用一個埠號嗎?
首先明確一點 埠是一種抽象的軟體結構(包括一些資料結構和I/O緩衝區)。
應用程式(即程序)透過系統呼叫與某埠建立連線(binding)後,傳輸層傳給該埠的資料都被相應程序所接收,相應程序發給傳輸層的資料都透過該埠輸出。在TCP/IP協議的實現中,埠操作類似於一般的I/O操作,程序獲取一個埠,相當於獲取本地唯一的I/O檔案,可以用一般的讀寫原語訪問之。
類似於檔案描述符,每個埠都擁有一個叫埠號(port number)的整數型識別符號,用於區別不同埠。由於TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟體模組,因此各自的埠號也相互獨立,如TCP有一個255號埠,UDP也可以有一個255號埠,二者並不衝突。
2.為什麼一個80埠可以建立很多連線?
一個TCP連線需要由四元組來形成,即(src_ip,src_port,dst_ip,dst_port)。假設有客戶端建立了連線(src_ip1,src_port1,dst_ip1,dst_port1),那麼,如果我們還有listen在(src_ip1,src_port1),那麼當(dst_ip1,dst_port1)傳送訊息過來,系統應該把訊息給誰?所以就說明了客戶端佔用了某一埠時,該埠就不能被其它程序listen了。
那麼,對於有些童鞋,可能還有這樣的疑問,是否一臺機器就只能建立65535個連線了(埠16位限制)?非也,一個連線由四元組(src_ip,src_port,dst_ip,dst_port)形式,那麼當(src_ip,src_port)一定時,變化的(dst_ip,dst_port)就可以建立更多連線了。
所以一臺機器可以建立最多65535個連線是大錯特錯的。所有的一切都可以用四元組原理來分析即:一個TCP連線需要由四元組來形成,即(src_ip,src_port,dst_ip,dst_port),只要四個元素的組合中有一個元素不一樣,那就可以區別不同的連線。
3.承接2問 為什麼還會出現埠被佔的情況??
這個問題問的好。預設情況下 一個網路應用程式的套接字繫結了一個埠 這時候別的套接字就無法使用這個埠。這個就是為什麼我們實際應用過程中經常會出現 埠已經被使用的情況。
但是 在實際網路程式設計過程中,socket有一個 SO_REUSEADDR 選項。該選項可以用在以下四種情況下。 (摘自《Unix網路程式設計》卷一,即UNPv1)
1、當有一個有相同本地地址和埠的socket1處於TIME_WAIT狀態時,而你啟動的程式的socket2要佔用該地址和埠,你的程式就要用到該選項。
2、SO_REUSEADDR允許同一port上啟動同一伺服器的多個例項(多個程序)。但每個例項繫結的IP地址是不能相同的。在有多塊網路卡或用IP Alias技術的機器可以測試這種情況。
3、SO_REUSEADDR允許單個程序繫結相同的埠到多個socket上,但每個socket繫結的ip地址不同。這和2很相似,區別請看UNPv1。
4、SO_REUSEADDR允許完全相同的地址和埠的重複繫結。但這隻用於UDP的多播,不用於TCP。