在TCP里可以讓數個Application共享一個Port么?
12-28
"A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent to."
Oracle的文檔里對Socket的定義有這麼一句話
這是不是意味著 應用/或者說TCP之上的協議 和埠之間應當存在某種一一對應的關係? 或者說port可以用來識別application 但是也沒說必須識別到特別清楚的程度, 只是為了方便管理而已.
然後我能不能把數個socket綁定到一個埠上?
高版本內核用so_reuseport
低版本用父進程listen,子進程accept
http://lwn.net/Articles/542629/
1) 首先,你想幹什麼?
2) 埠本意是用於區分應用,你要復用它,一般來說是要多同一個報文進行多次處理。如果你不是這個目的,那就毫無意義。
如果你是,那系統有很多hook可以給你做這件事情,沒必要在port這個位置做。
肯定啊,一個應用版定了一個埠,別的應用就不能版定了,所以api是叫槽(socket),一個埠就是一個槽位,udp可以再版定同一埠,但ip上面的同一協議下的應用不能重複版定。
很多成熟的web伺服器都是這麼做的。比如nginx, gunicorn。 父進程bind, listen, 子進程accept。 這種模式有個名字叫做 prefork,請google (nginx, prefork, 驚群效應) 可以看到內核對於prefork 模式的支持與改動。
參考Google SPDY協議,tcp並發重用
tcp 連接是針對IP 和埠的,不同的應用綁定到不同得埠上。你要問不同的服務,公用同一個埠。那是不是可以看做你把幾個服務合併為一個了。
可以,你想一個nginx的worker進程是怎麼工作的嘛
推薦閱讀:
※在以TCP為連接方式的伺服器中,為什麼在服務端設計當中需要考慮心跳?
※基於UDP實現的可靠傳輸協議(比如uTP),與TCP協議相比有什麼優缺點?
※為什麼多 TCP 連接分塊下載比單連接下載快?
※為什麼區域網的IP普遍是192.168開頭?