1. 程式人生 > 其它 >為什麼埠號最大為65535?

為什麼埠號最大為65535?

一.誤區

因為TCP埠號是16位無符號整數, 最大65535, 所以一臺伺服器最多支援65536個TCP socket連線

這句話是錯誤的,實際上可監聽的最大埠號是65536。就像一臺伺服器安裝了一個nginx,他的預設埠是80,但可以改為65535,但支援的TCP連線可以是7萬個。

二.原理

系統通過一個四元組來唯一標識一條TCP連線,這個四元組的結構是{local ip, local port, remote ip, remote port}。

對於IPv4, 系統理論上最多可以管理2^(32+16+32+16), 2的96次方個連線。如果不僅僅考慮TCP, 則是一個五元組, 加上協議號(TCP, UDP或者其它)。

某個客戶端向同一個TCP端點(ip:port)發起主動連線, 那麼每一條連線都必須使用不同的本地TCP端點, 如果客戶端只有一個IP則是使用不同的本地埠, 該埠的範圍在unix系統上的一個例子是32768到61000, 可以通過如下命令檢視:

[root@linkops ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768   61000

也就是說, 一個客戶端連線同一個伺服器的同一個ip:port(比如進行壓力測試), 最多可以發起30000個左右的連線

TCP客戶端(TCP的主動發起者)可以在同一ip:port上向不同的伺服器發起主動連線, 只需在bind之前對socket設定SO_REUSEADDR選項

系統支援的最大開啟檔案描述符數(包括socket連線):

[root@linkops ~]# cat /proc/sys/fs/file-max
580382

單個程序所能開啟的最大檔案描述符數:

[root@linkops ~]# ulimit -n
1024

三.埠號超過65535

下圖顯示的終端埠為78650 ,因為TCP PORT大小為16bit,所以不能超過65535

不過Windows會有一個問題,telnetwww.sina.com.cn 65616大家可以測試一下,這實際上是訪問 www.sina.com.cn 的80埠,為什麼呢?
注:65616-65536=80

以下是引用片段:

main()
{
    unsigned short int tcp_port=65616;
    printf("%u",tcp_port);
}

有些軟體,比方說Windows的 Telnet ,可能用了32 bit的資料型別記錄port ,這樣port表面上看到是可以超過65535,但是tcp header明確定義了tcpport為16bit,那即便某些應用程式使用了32bit的資料型別,最終結果也是被強制轉換。

簡單的來說就是:
1.在應用程式裡邊可以使用4位元組或更多位元組來儲存埠號

2.當呼叫了系統的tcp/ip通訊之後,系統底層強制將大於65536的埠轉換回正常範圍

3.並且在轉換過程中,不會返回任何錯誤資訊,一切都悄然進行了,所以應用層的程式不會有任何特別反應,這一切都在系統底層悄然完成了

4.轉換的方式為:埠號 - 65536 = ?,問號處既是轉換結果

5.如果轉換後的埠還超過65535呢?那就繼續轉換,直到小於等於65535為止,所以telnet www.baidu.com 131152也是可以完美執行的,(65536 + 65536 + 80 = 131152)

本文版權歸作者所有,歡迎轉載,請務必新增原文連結。