關於埠共用

2021-09-08 14:41:35 字數 1965 閱讀 5172

以前整socket程式設計(vb6.0)有時忘關閉socket再次啟動時就報埠已經被用了,當時的辦法就是重啟系統,後來看到書上介紹乙個埠唯一標識乙個應用程式,於是就高興的認為乙個埠只能被乙個應用程式繫結,這樣和諧的過了一些年,直到有一天發現自己整了一年多的iis其實可以多個程序(w3p.exe)共用乙個80埠,於是俺的世界又不和諧了.

為了解決這一重大矛盾,作為乙個2b程式設計師,我嘗試了平行宇宙理論,玄理論,直到上帝造物說...-_",呵呵扯淡了。

下面談一下本人的yy,大神們看了表笑,還望不吝賜教。

關於鏈結的回憶

小時候還記的廠裡有個總機室,師傅姓王,裡面有個**交換機具體叫什麼也不清楚,就是乙個合子後面連了很多**線前面很多插空,這些**線連到廠裡的多個辦公室,小王找小李時需要搖下**打到總機叫王師傅接,王師傅晚上愛打麻將白天經常接錯線,接外線貌似要層層轉接很麻煩,好在廠裡**主要用來各部門閒聊扯蛋的,(找遠方親戚一般是寫信或拍電報)由於大家上班無聊會用**扯蛋,當時經常佔線,小張跟小李正聊到興頭上,現在吳廠張要找小李,但是王師傅說小李正跟小張接著,此時吳廠張發話了,給我拔掉,結果小張那頭突然掉線了,而小李突然發現小張怎麼變聲了.........,當然你可能會想(哥確實想過)為什麼不每個部門兩兩拉根線呢,這樣就不要王師傅轉接了,不過上完高中後(注意不是初中)哥發現這樣一來全國的**網多少根線都拉不過來,而且就廠裡來說,如果有10個部門,需要每個部門都按十個**。 哥對於連線的理解也就停留在這個水平上,以至一直誤解了tcp鏈結,不過看完本文後您會發現以前的**是真正意義上的流連線(先不提波粒二象性這事了^_^)

tcp鏈結應該是幻覺

數字線路的關鍵是將資訊編碼後拆成資料報來乙份乙份傳送,因此會有所謂的延遲(編碼解碼**等時間),而以前的**只要接通後就是按光速傳播的,呵呵

不管是tcp,還是udp,都是走ip資料報然後由鏈路層轉物理層傳送出去的,對ip層傳送資料來說tcp跟udp沒任何區別,tcp的三次握手更是神馬,當然話說的有點絕對了,ip層的資料報中有乙個協議標識字段,目的是在收到ip資料報後決定將這個資料報交tcp驅動還是udp驅動來處理。從上面的過程描述可以看出所謂的tcp鏈結是乙個幻覺,其本質應該是tcp驅動程式維護的乙個結構體(裡面應該有源ip+埠,目標ip+埠,初始序列號,以及上一次收/發資料報的序列號等等字段),而服務端應用程式綁訂埠本質是為了tcp驅動在收到tcp資料報時作為路由的標誌。

乙個伺服器端口能同時跟很多瀏覽器建立tcp鏈結嗎?

乙個服務端埠理論上可以建立無限個連線,通過 [local-ip:port跟remote-ip:port ]組合可以區分每個連線(注意客戶端--連線發起端,每次總使用乙個未使用的隨機埠),但是由於每個鏈結需要一定的記憶體空間(包括緩衝視窗),以及tcp驅動程式需要多個執行緒來維護這些鏈結(cpu資源),因此實際上不能同時保持很多個tcp連線。

同個埠多個**怎麼收發資料報?

首先發應該不是問題,tcp驅動將資料報在對應的tcp鏈結上發回去,客戶端程序就能正確接收了(tcp客戶端不存在埠共用的說法)。

直接是收的問題,在tcp報頭上沒有特殊的標識的情況(類似cookie的機制,當然正常情況下不應該去改已經存在的tcp協議實現),服務端能做的是在應用層上做處理即引進路由**,根據種種跡象哥發現這個**可能叫http.sys當然net.tcp port sharing service也很可疑。

好了在假設這個**存在後,收資料的過程應該是這樣的: 當共享埠的某個tcp鏈結到資料報後,首先將資料報發給**(就想tcp以前的作法一樣),接著**根據tcp資料報中的資料具體應該是http協議中的host報頭(即iis中設定的**主機頭屬性),將資料**給對應主機頭的**(更可行的做法是將該tcp鏈結的socket控制代碼給對應的**處理程式),但不管怎麼樣**必須要對tcp資料報中的資料段進行分析。

另外net.tcp也應該在tcp資料報的資料區有額外標的識別,因為我們使用wcf的net.tcp時,指定服務端點屬性其實類似iis中的主機頭設定,當然以上都是yy。。。

IIS與Apache共用80埠

共用80埠 windows server 2003伺服器上安裝有預設 iis 6和apache兩個伺服器,iis執行的乙個.net程式,apache執行php程式,現在想讓它們同時都能通過80埠訪問,設定起來還比較簡單。iis的.net程式假設繫結81埠,主機名 www.a.com apache的p...

NodeJS與Nginx共用80埠

apache和nginx通常都會使用預設的http請求的80埠。但我們知道,一旦開啟了nginx後,nodejs再去監聽80埠就會發生錯誤。那麼,我們該如何解決這個問題呢?接下來,以最近發布的乙個個人博站為例。在我的阿里雲伺服器上已經開啟了nginx服務,並且該網域名稱下已經有對應的專案在跑。而此時...

apache IIS共用80埠四法

為除錯程式,本機安裝iis與apache,無法同時使用80埠,現給出解決方法 方法一 c inetpub adminscripts cscript adsutil.vbs set w3svc disablesocketpooling true 該命令反饋如下disablesocketpooling ...