linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?
光是在知乎上這個問題我都看了好幾遍了,問之前先搜一下不好嗎?簡單說來:
TCP連接數量最大不能超過65535是錯的。
一個連接由一個5元組決定(protocol,local IP,local port,remote ip,remote port),對于TCP,protocol固定是TCP,還有四個元素。對于服務器來說,local port一般是固定的,比如HTTP(80),但是remote ip和remote port沒有限制。
連接數量是沒有限制的,除非是一個端口只能有一個連接。你說的這個65535是端口個數,這不光是Linux,所有的系統都只有這么多端口。端口數和連接個數沒有必然聯系。如果你學過網絡編程的話,在創建連接的時候肯定是IP+port的形式,并且有一個參數指定最大連接數,這個最大連接數并沒有限制,可以很小也可以非常大。
https://www.zhihu.com/zvideo/1386712439304597504?playTime=6.1
首先,服務器服務進程只會占用一個端口(listen)對外提供連接請求。
其次,百萬并發指的是百萬個不同請求方(remote ip,remote port)同時請求服務進程監聽的端口。注意這里,服務進程只會用這一個監聽端口與請求方建立連接,服務進程不會消耗服務器其他端口去建立連接的。
也就是說服務進程只要一個端口就夠了,況幾千個端口呼~
端口號主要是用來在服務器本地解復用用的,數據包通過IP和端口號來告知目的地,也就是網絡通過數據包中的IP找到服務器,然后服務器再通過數據包中的端口號把數據包交到這個服務器上跑著的特定進程。同一IP下端口號相同數據包同時只能被一個進程處理,不過每個進程同時可以處理多個端口號的數據。就是服務器計算機會維護一個端口號與進程號的映射,這個映射就是嚴格函數關系,也就是每個端口號有唯一進程號,但是一個進程號可以對應多個端口號,通過這個映射,服務器計算機的網絡堆棧把數據包分發給指定進程。進程監聽端口號,你可以理解為在這個映射中插入一項對應關系,進程關閉端口監聽或者進程當掉了,就是抹掉關于這個進程號的對應關系。所以呢,端口數限制只是表示服務器最多只可以開65535個使用網絡的進程。這個限制在實際中不會遇到,因為服務器多是一個計算機只提供一種服務,然后一種服務開個位數進程(一般為了最大利用CPU,數目是與CPU的核數對齊的)處理幾十萬、上百萬請求的。理論上,并沒有什么限制請求數,實際上呢,內存會限制請求數,因為每個請求需要用到一塊內存來維護請求的狀態和緩存收發數據,另外帶寬也會限制請求數量,因為一部分請求可能會因為丟包而建立不了連接。
不過在計算機作為客戶端測試機,來測試與服務器的連接時,對于同一個遠端IP端口組合,是最多只能有65535個連接,因為數據包中的端口號就16位,大于這個,就裝不下了,這種情況本地是最多可以對應65535個數據連接。這個限制做壓力測試時客戶機是會遇到。
總結
以上是生活随笔為你收集整理的linux的TCP连接数量最大不能超过65535个,那服务器是如何应对百万千万的并发的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty与Spring WebSock
- 下一篇: nginx转发websocket