目錄
TCP 和 UDP 可以同時綁定相同的端口嗎?
多個 TCP 服務(wù)進(jìn)程可以綁定同一個端口嗎?
重啟 TCP 服務(wù)進(jìn)程時,為什么會有“Address in use”的報錯信息?
重啟 TCP 服務(wù)進(jìn)程時,如何避免“Address in use”的報錯信息?
客戶端的端口可以重復(fù)使用嗎?
多個客戶端可以 bind 同一個端口嗎?
客戶端 TCP 連接 TIME_WAIT 狀態(tài)過多,會導(dǎo)致端口資源耗盡而無法建立新的連接嗎?
如何解決客戶端 TCP 連接 TIME_WAIT 過多,導(dǎo)致無法與同一個服務(wù)器建立連接的問題?
因為「監(jiān)聽」這個動作是在 TCP 服務(wù)端網(wǎng)絡(luò)編程中才具有的,而 UDP 服務(wù)端網(wǎng)絡(luò)編程中是沒有「監(jiān)聽」這個動作的。
TCP 和 UDP 服務(wù)端網(wǎng)絡(luò)相似的一個地方,就是會調(diào)用 bind 綁定端口。
TCP 和 UDP 可以同時綁定相同的端口嗎?
在數(shù)據(jù)鏈路層中,通過 MAC 地址來尋找局域網(wǎng)中的主機(jī)。在網(wǎng)際層中,通過 IP 地址來尋找網(wǎng)絡(luò)中互連的主機(jī)或路由器。在傳輸層中,需要通過端口進(jìn)行尋址,來識別同一計算機(jī)中同時通信的不同應(yīng)用程序。
傳輸層的「端口號」的作用,是為了區(qū)分同一個主機(jī)上不同應(yīng)用程序的數(shù)據(jù)包。
傳輸層有兩個傳輸協(xié)議分別是 TCP 和 UDP,在內(nèi)核中是兩個完全獨(dú)立的軟件模塊。
多個 TCP 服務(wù)進(jìn)程可以綁定同一個端口嗎?
如果兩個 TCP 服務(wù)進(jìn)程同時綁定的 IP 地址和端口都相同,那么執(zhí)行 bind() 時候就會出錯,錯誤是“Address already in use”。
如果想多個進(jìn)程綁定相同的 IP 地址和端口,也是有辦法的,就是對 socket 設(shè)置 SO_REUSEPORT
重啟 TCP 服務(wù)進(jìn)程時,為什么會有“Address in use”的報錯信息?
當(dāng) TCP 服務(wù)進(jìn)程重啟時,服務(wù)端會出現(xiàn) TIME_WAIT 狀態(tài)的連接,TIME_WAIT 狀態(tài)的連接使用的 IP+PORT 仍然被認(rèn)為是一個有效的 IP+PORT 組合,相同機(jī)器上不能夠在該 IP+PORT 組合上進(jìn)行綁定,那么執(zhí)行 bind() 函數(shù)的時候,就會返回了 Address already in use 的錯誤。
而等 TIME_WAIT 狀態(tài)的連接結(jié)束后,重啟 TCP 服務(wù)進(jìn)程就能成功。
重啟 TCP 服務(wù)進(jìn)程時,如何避免“Address in use”的報錯信息?
對 socket 設(shè)置 SO_REUSEADDR 屬性
客戶端的端口可以重復(fù)使用嗎?
客戶端在執(zhí)行 connect 函數(shù)的時候,會在內(nèi)核里隨機(jī)選擇一個端口,然后向服務(wù)端發(fā)起 SYN 報文,然后與服務(wù)端進(jìn)行三次握手。
客戶端的端口選擇的發(fā)生在 connect 函數(shù),內(nèi)核在選擇端口的時候,會從?net.ipv4.ip_local_port_range
?這個內(nèi)核參數(shù)指定的范圍來選取一個端口作為客戶端端口。
可用端口號 61000 - 32768 = 28232 個
TCP 連接是由四元組(源IP地址,源端口,目的IP地址,目的端口)唯一確認(rèn)的,那么只要四元組中其中一個元素發(fā)生了變化,那么就表示不同的 TCP 連接的。所以如果客戶端已使用端口 64992 與服務(wù)端 A 建立了連接,那么客戶端要與服務(wù)端 B 建立連接,還是可以使用端口 64992 的,因為內(nèi)核是通過四元祖信息來定位一個 TCP 連接的,并不會因為客戶端的端口號相同,而導(dǎo)致連接沖突的問題。
多個客戶端可以 bind 同一個端口嗎?
一般而言,客戶端不建議使用 bind 函數(shù),bind 函數(shù)雖然常用于服務(wù)端網(wǎng)絡(luò)編程中,但是它也是用于客戶端的。
客戶端是在調(diào)用 connect 函數(shù)的時候,由內(nèi)核隨機(jī)選取一個端口作為連接的端口。
要看多個客戶端綁定的 IP + PORT 是否都相同,如果都是相同的,那么在執(zhí)行 bind() 時候就會出錯,錯誤是“Address already in use”。
客戶端 TCP 連接 TIME_WAIT 狀態(tài)過多,會導(dǎo)致端口資源耗盡而無法建立新的連接嗎?
客戶端是否都是與同一個服務(wù)器(目標(biāo)地址和目標(biāo)端口一樣)建立連接,如果同一個服務(wù)器(目標(biāo)地址和目標(biāo)端口一樣)建立連接,那么如果客戶端 TIME_WAIT 狀態(tài)的連接過多,當(dāng)端口資源被耗盡,就無法與這個服務(wù)器再建立連接了。因為只要客戶端連接的服務(wù)器不同,端口資源可以重復(fù)使用的。
如何解決客戶端 TCP 連接 TIME_WAIT 過多,導(dǎo)致無法與同一個服務(wù)器建立連接的問題?
打開?net.ipv4.tcp_tw_reuse
?這個內(nèi)核參數(shù),文章來源:http://www.zghlxwxcb.cn/news/detail-681122.html
因為開啟了這個內(nèi)核參數(shù)后,客戶端調(diào)用 connect 函數(shù)時,如果選擇到的端口,已經(jīng)被相同四元組的連接占用的時候,就會判斷該連接是否處于 TIME_WAIT 狀態(tài),如果該連接處于 TIME_WAIT 狀態(tài)并且 TIME_WAIT 狀態(tài)持續(xù)的時間超過了 1 秒,那么就會重用這個連接,然后就可以正常使用該端口了。文章來源地址http://www.zghlxwxcb.cn/news/detail-681122.html
到了這里,關(guān)于4.18 TCP 和 UDP 可以使用同一個端口嗎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!