平時工作和學習中,大家都知道一臺計算機的端口號總共有65535個,但一臺計算機真的只能建立65535個TCP的連接嗎?TCP:(Transmission Control Protocol 傳輸控制協議) 提供面向連接的、可靠的數據傳輸。
一個完整的TCP連接由四個部分組成:源IP 源端口 目的IP 目的端口 這就是經典的socket四元組。
建立一個TCP連接,需要將兩端的套接字進行綁定:源IP地址:源端口號 <---->目標IP地址:目標端口號,只要確保綁定的套接字不重復,即可完成一個tcp的連接,由此可見如果端口號不夠用了,就不斷變換目標IP地址和目標端口號,保證四元組不重復,就能創建很多個TCP的連接,由此可見有人說最多只能創建65535個tcp連接是不正確的。既然如此,那可以創建tcp的數量有沒有限制呢?
一、系統設置對連接數的限制
1. Linux系統對可以使用的端口范圍是由具體限制的,具體查看方法如下:
[root?@muyu? ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
當前的限制是32768-60999 所以此時可以使用的端口號只有60999-32768=28231個
當然這個數字是可以修改的,(這是系統管理員優化操作系統的一個重點)
修改的方法如下:[root?@muyu? ~]# vim /etc/sysctl.conf加入一行:net.ipv4.ip_local_port_range = 1024 60009保存好后執行 sysctl -p /etc/sysctl.conf 使其生效[root?@muyu? ~]# cat /proc/sys/net/ipv4/ip_local_port_range 1024 60999
二、文件描述符對連接數的限制
Linux下一切皆文件,計算機會為每一個TCP的連接分配一個文件描述符,在和目標IP進行tcp的通信的時候只需要對著文件描述符讀寫就可以了。
但是linux 對可打開的文件描述符的數量分別作了三個方面的限制。"系統級:當前系統可打開的最大數量,通過 cat /proc/sys/fs/file-max 查看[root?@muyu? ~]# cat /proc/sys/fs/file-max95861用戶級:指定用戶可打開的最大數量,通過 cat /etc/security/limits.conf 查看[root?@muyu? ~]# cat /etc/security/limits.conf...* soft nproc 20* hard nproc 50進程級:單個進程可打開的最大數量,通過 cat /proc/sys/fs/nr_open 查看[root?@muyu? ~]# cat /proc/sys/fs/nr_open1048576
當然這個數字是可以修改的,(這也是系統管理員優化操作系統的一個重點)
修改的方法如下:[root?@muyu? ~]# echo 1000 > /proc/sys/fs/nr_open[root?@muyu? ~]# cat /proc/sys/fs/nr_open1000
三、線程對連接數的限制
說到這兒就繞不開一個大名鼎鼎的C10K問題了,問題產生的原因就是當服務器連接數達到 1 萬且每個連接都需要消耗一個線程資源時,操作系統就會不停地忙于線程的上下文切換,最終導致系統崩潰。每建一個TCP連接就創建一個線程的方式,是傳統的多線程并發模型,早期的操作系統只支持這種方式。現在的操作系統都支持 IO 多路復用的方式,簡單說就是一個線程可以管理多個 TCP 連接的資源,這樣就可以用少量的線程來管理大量的 TCP 連接了,所以只要采用IO 多路復用的方式就可以解決這個問題。
四、內存對連接數的限制
每一個TCP連接本身以及這個連接所用到的緩沖區,都需要占用一定空間的內存,大量的連接非常消耗內存空間。
想把這個問題討論清楚,最好咱們先把客戶端和服務器兩種角色分開來看。你上面舉的QQ 的例子,是當操作系統作為服務器角色在工作。
這個時候,還沒有到你糾結 65535 問題的時候呢。服務器一般都監聽在某個固定的端口上。例如 Nginx,一般監聽 80。所有來自客戶端的連接都是和服務器的 80 端口保持連接的。你沒看錯,服務器上只消耗 80 這一個端口。但卻完全可以支撐下面這些連接
連接1:客戶端IP1 10000 服務器IP 80連接2:客戶端IP2 10000 服務器IP 80連接3:......
非但如此,即使是只有一個客戶端,也可以向這個服務器建立多條連接的。只需要不停變換自己的端口號就行了。連接1:客戶端IP1 10000 服務器IP 80連接2:客戶端IP1 10001 服務器IP 80連接3:......
你看,對于服務器來說,一個 80 端口就可以包打天下了。根本不需要糾結什么 65535 的問題TG:li9047