鍍金池/ 問(wèn)答/C  C++  Linux  網(wǎng)絡(luò)安全/ 一個(gè)端口只能由一個(gè)程序使用,那為什么tcp中多個(gè)client可以連接上一個(gè)ser

一個(gè)端口只能由一個(gè)程序使用,那為什么tcp中多個(gè)client可以連接上一個(gè)server的同一個(gè)端口?

如題,是我哪里理解不對(duì)么?求指點(diǎn)。

回答
編輯回答
野橘

拋磚引玉

  • 一臺(tái)服務(wù)器上已經(jīng)安裝了Nginx并啟動(dòng)監(jiān)聽(tīng)80端口,但此時(shí)你又下載一個(gè)Apache想啟動(dòng)也去監(jiān)聽(tīng)80端口,這時(shí)服務(wù)器就不讓了,會(huì)提示端口被占用,這就是一個(gè)端口對(duì)應(yīng)一個(gè)應(yīng)用程序
  • 當(dāng)你訪問(wèn)一個(gè)網(wǎng)址時(shí),默認(rèn)會(huì)訪問(wèn)80端口,假設(shè)服務(wù)器使用Nginx,當(dāng)Nginx監(jiān)聽(tīng)到有客戶請(qǐng)求自己監(jiān)聽(tīng)的80端口時(shí),會(huì)根據(jù)請(qǐng)求做出相應(yīng)的相應(yīng),至于為什么可以同時(shí)鏈接多個(gè)用戶,那得看服務(wù)器的本身配置了,可以同時(shí)允許多少個(gè)用戶同時(shí)訪問(wèn),若是僅允許一個(gè),那么第一個(gè)進(jìn)來(lái)了,接下來(lái)的就順次排隊(duì),服務(wù)器處理一個(gè)之后會(huì)接下往下處理
2017年4月30日 08:36
編輯回答
避風(fēng)港

不明白你的點(diǎn)在哪里,你的疑問(wèn)和前段所描述的原理并不沖突。
服務(wù)端都是多進(jìn)程或者多線程又或者使用了代理等等,一個(gè)鏈接進(jìn)來(lái),會(huì)交由一個(gè)子進(jìn)程/線程/一臺(tái)web服務(wù)器進(jìn)行處理,并不影響接下來(lái)的請(qǐng)求。

2018年2月1日 04:15
編輯回答
純妹

猜測(cè)題主可能是混淆了socket和port這兩個(gè)概念。

打個(gè)(可能不太恰當(dāng)?shù)模┍确?,port就是門牌號(hào),你一家住進(jìn)去了,如果不搬出來(lái),下一家不能進(jìn)。socket就是快遞編號(hào),可以同時(shí)給你們家寄好幾件快遞。port只不過(guò)是在網(wǎng)絡(luò)中標(biāo)識(shí)了一個(gè)進(jìn)程,socket才是數(shù)據(jù)交換的端點(diǎn)。

節(jié)選一下 man accept,翻譯成中文是這樣的

It extracts the first connection request on the queue of pending connections for the listening socket, sockfd, creates a new connected socket, and returns a new file descriptor referring to that socket. The newly created socket is not in the listening state. The original socket sockfd is unaffected by this call.

它(accept)從監(jiān)聽(tīng)套接字sockfd的隊(duì)列中取出第一個(gè)請(qǐng)求,創(chuàng)建一個(gè)新的連接socket,然后返回一個(gè)指向新socket的文件描述符。這個(gè)新socket并不在監(jiān)聽(tīng)狀態(tài)。原本的socketsockfd不會(huì)被這個(gè)調(diào)用改變。

所以跟“切換的夠快”、“子進(jìn)程/線程”、“Nginx的配置”都無(wú)關(guān),它們只是后續(xù)用來(lái)處理這些新socket的方法,是一個(gè)一個(gè)處理,還是一起處理,相當(dāng)于你快遞可以一件一件收,也可以請(qǐng)快遞員用推車一起送上來(lái)。但是能支持多連接,本質(zhì)上還是因?yàn)槊總€(gè)客戶端連接都有一個(gè)新的socket,互不相干,可以分別處理。

系統(tǒng)區(qū)分socket,靠的則是五元組。因?yàn)閮蓚€(gè)IP都是不能變的,只能靠端口號(hào)來(lái)區(qū)分應(yīng)用程序,所以要求一個(gè)端口只能由一個(gè)程序使用。

2017年3月20日 21:53
編輯回答
萢萢糖

計(jì)算機(jī)原理,linux多用戶其實(shí)還是單用戶,但是切換的夠快就感覺(jué)是在并發(fā)使用了

2017年2月14日 10:03