client和server,如果server的port number已经确定,两者之间最大的TCP连接数是多少?工程上有什么需要注意的(1)

1. TCP基础

TCP connection的四元组为“”;TCP port占用2个Bytes,有效的TCP port号为1~65535。

<10.0.0.1, 4321, 10.0.0.2, 80> 和 <10.0.0.1, 4321, 10.0.0.2, 8181>是不同的连接,也是可以同时存在的连接。


2. 实验环境和实验前需要注意的

Client IP: 10.200.132.131;
Server IP: 10.200.132.135; Server Port: 9090

需要注意的:
1) Linux 默认一个进程只能打开 几千个socket(在Linux下,一切皆是文件,socket也不例外),需要提高这个配置。
用如下命令来检查当前系统"open files“:
ulimit -a |grep open
open files                      (-n) 1024

如何提高“open files"?
在/etc/sysctl.conf添加:
fs.file-max = 6553500
fs.nr_open = 6553500
执行"sysctl -p"使上面配置生效。

在/etc/security/limits.conf添加:
* soft nofile 3276800
* hard nofile 3276800
退出当前ssh session并重新登陆,使上面配置生效。

再次检查当前系统“open files":
ulimit -a |grep open
open files                      (-n) 3276800

这些参数的具体含义,请自行Google之。

2)用于连接远端server特定端口时,Linux随机选择本地剩余空闲端口,但是 默认不是从1~65535,而是由如下配置决定:
sysctl -a |grep port_range
net.ipv4.ip_local_port_range = 32768 60999
可以看到是从32768~60999,总数为28232。

3. 实验

server.cpp代码:

https://github.com/lzueclipse/learning/blob/master/c_cpp/tcp_64k_ports/server.cpp

主线程负责监听指定端口,通过accept()和client建立TCP 连接。

client.cpp代码:
https://github.com/lzueclipse/learning/blob/master/c_cpp/tcp_64k_ports/client.cpp
主线程向指定IP+指定Port发起连接,直到connect()耗尽所有本地Port.

在Server端(10.200.132.135)启动测试程序:
./server -p 9090
Binding TCP socket ...
Listening on ANY:9090 ...

在Client端(10.200.132.131)启动测试程序:
./client -s 10.200.132.135 -p 9090
Connect error:: Cannot assign requested address
Connection Number: 28232

可以用如下命令在Client或Server验证连接数是28232:
netstat -anp|grep 9090 |grep ESTABLISH |wc -l
28232


这是第1部分,工程上需要注意的在第2部分。











你可能感兴趣的:(C/C++,TCP/IP)