TCP/UDP 占用端口問題總結


TCP/UDP 共用端口問題。

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。


免責聲明!

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



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