歡迎光臨郝學武的blog。

          2013年12月17日

          因為TCP端口號是16位無符號整數, 最大65535, 所以一臺服務器最多支持65536個TCP socket連接.” – 一個非常經典的誤解! 即使是有多年網絡編程經驗的人, 也會持有這個錯誤結論.

          要戳破這個錯誤結論, 可以從理論和實踐兩方面來.

          理論

          系統通過一個四元組來唯一標識一條TCP連接. 這個四元組的結構是{local ip, local port, remote ip, remote port}, 對于IPv4, 系統理論上最多可以管理2^(32+16+32+16), 2的96次方個連接. 如果不僅僅考慮TCP, 則是一個五元組, 加上協議號(TCP, UDP或者其它).

          實踐

          服務器綁定一個ip:port, 然后accept連接, 所有accept的連接使用的本地地址也是同樣的ip:port.

          擴展內容

          如果某個客戶端向同一個TCP端點(ip:port)發起主動連接, 那么每一條連接都必須使用不同的本地TCP端點, 如果客戶端只有一個IP則是使用不同的本地端口, 該端口的范圍在*nix系統上的一個例子是32768到61000, 可以通過如下命令查看:

          [root@benegg.com ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768   61000 

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

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

          系統支持的最大打開文件描述符數(包括socket連接):

          [root@benegg.com ~]# cat /proc/sys/fs/file-max 580382 

          單個進程所能打開的最大文件描述符數:

          [root@benegg.com ~]# ulimit -n 1024 

          結論

          無論是對于服務器還是客戶端, 認為”一臺機器最多建立65536個TCP連接”是沒有根據的, 理論上遠遠超過這個值.

          posted @ 2013-12-17 14:10 陜西BOY 閱讀(390) | 評論 (0)編輯 收藏


          posts - 17, comments - 65, trackbacks - 0, articles - 28

          Copyright © 陜西BOY

          主站蜘蛛池模板: 湛江市| 汕头市| 张掖市| 青铜峡市| 江城| 梨树县| 明光市| 乐平市| 临泉县| 科技| 永宁县| 黄石市| 常宁市| 石家庄市| 湄潭县| 阜阳市| 西充县| 阿拉善盟| 望谟县| 闵行区| 志丹县| 当涂县| 平谷区| 醴陵市| 曲水县| 金坛市| 洛宁县| 秦安县| 罗甸县| 银川市| 渭南市| 泸州市| 略阳县| 澄城县| 庆城县| 鹤山市| 德化县| 巴彦淖尔市| 宜黄县| 宁安市| 德化县|