想象一下當初為什麼不讓多個程序/執行緒在乙個相同的ip位址和埠上偵聽,很簡單,這是因為tcp/ip模型將乙個埠作為乙個四層復用解復用的唯一標 識,也就是乙個四層位址,正如ip位址屬於乙個主機一樣(屬於一塊網絡卡?),乙個ip/埠對屬於一台主機上乙個特定的程序,它只是乙個保證唯一性的靜態 標識。世界上不同的主機不能有相同的ip位址,一台主機上繫結特定ip位址的不同程序也不能有相同的埠,否則就不知道乙個流到底該交給哪個程序!
想 象一下現在為什麼reuseport可以讓以前不可能的事變成可能。很簡單,在靜態因素之外加入了乙個動態因素,那就是將發起連線的源ip和源埠也一起 考慮了進來,四元組一起做了乙個簡單的hash計算,所得的結果對listener數量取模,獲取哪個listener要為這個連線服務。
事實 上,我們發現,需要唯一標識的不是乙個listener,而應該是乙個連線本身。tcp服務端在有客戶端企圖建立乙個連線時才有意義。那麼是什麼讓乙個綁 定同一ip/埠的套接字只能listen一次這麼乙個限制存在了這麼久呢?我認為答案有兩個方面,一方面是因為unix的程序模型,另一方面是這個限制 在單核cpu時代工作的足夠好,又可以避免很多問題。
雜亂不清的東西糾纏在一起的時候,會引入很多複雜性,避免這些複雜性的方式就是把糾纏在一起的東西剝離,海闊天空。同事為我這個優化取了乙個很好的名字,叫做xsocket,這裡的x可以理解成兩個意思,乙個是「牛x」中的x,乙個是「插」!!
今天感到特別累,但是卻又無比的高興,昨晚做了乙個夢,感覺今天會有驚喜,然而等了一天還是未能如願,我不再相信緣份了,可是最終我還是改變了想法,緣份未盡,上帝讓我的驚喜來自於別處,雖然它並不是我夢裡的那個。阿們...
Linux TCP協議使用執行緒實現併發伺服器
直接放 伺服器 include include include include include include include define portnum 3333 char send buf 1024 if 0 void write void sock fd pthread exit 0 end...
Linux TCP協議的程式設計流程
一 定義 tcp協議是面向連線的可靠的位元組流服務 tcp協議分為客戶端和服務端 伺服器是被動通訊,客戶端是主動通訊 二 伺服器的系統呼叫 1 方法 1 int socket 建立乙個用於監聽客戶端連線的網路套接字 原型 成功返回套接字的檔案描述符,失敗返回 1 domain 協議簇 af inet...
linux TCP和UDP的差異項
udp為什麼是不可靠的?bind和connect對於udp的作用是什麼?1 能夠捕獲錯誤。因為udp是無狀態的,使用connect會在核心中建立乙個類似額的tcp的維護,這樣當網路異常時進行icmp回應時核心會通知應用,如果不使用connect 的話就接收不到錯誤 2 udp多次呼叫connect,...