제가 아는 한 'time_wait' 통계의 tcp 포트는 사용할 수 없습니다. 그러나 내 실험에서 서버는 "time_wait" 포트를 재사용했습니다. 왜?
먼저 클라이언트 컴퓨터에 명령을 입력합니다 ehco 40000 40001 > /proc/sys/net/ipv4/ip_local_port_range
. 따라서 최대 TCP 포트 수는 2개입니다.
서버 코드
while (1) {
int len = sizeof(struct sockaddr);
fd = accept(sfd, &remote, &len);
read(fd, buf, sizeof(buf));
close(fd);
}
고객 코드
for (i = 0; i < 3; i++)
{
sleep(1);
pid_t pid = fork();
if (pid == 0)
{
handler();
exit(0);
}
}
void handler()
{
* ............. */
res = connect(sfd, result->ai_addr, result->ai_addrlen);
if (res == -1) {
perror("error");
exit(1);
}
printf("connect\n");
}
전시하다
[root@livecd ~]# ./client
connect
[root@livecd ~]# connect
connect
최대 3개의 연결이 가능합니다. 제 생각에는 최대 2개의 연결이 가능합니다. 왜? 서버에는 2개의 timewait 연결이 있습니다.
[root@livecd ~]# netstat -anp | grep TIME
tcp 192.168.88.131:2016 192.168.88.132:40000 TIME_WAIT
tcp 192.168.88.131:2016 192.168.88.132:40001 TIME_WAIT
환경
Linux livecd.centos 2.6.32-642.el6.i686 #1 SMP Tue May 10 16:13:51 UTC 2016
서버 구성
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle
0
[root@livecd ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse
0
클라이언트 구성
[root@livecd ~]# cat /proc/sys/net/ipv4/ip_local_port_range
40000 40001
중요한 우분투 서버 14.04도 시도했지만 동일한 결과를 얻었습니다.
답변1
질문을 전사한 부분에는 오류가 많고 중요한 부분이 누락된 부분이 있는 것 같습니다만, 얼마든지 답변드릴 수 있을 것 같습니다. 실제로 포트 번호는 2개뿐이지만,아니요즉, 두 개의 연결만 있을 수 있습니다. 연결은 네 가지 값으로 구별됩니다.
- 소스 주소
- 소스 포트
- 목적지 주소
- 목적지 포트
따라서 일반적으로 클라이언트가 새 포트 번호로 새 연결을 열면 서버는 동일한 포트 번호를 사용할 수 있으며 여전히 다른 TCP 연결이 됩니다. 그게 다야최대서버는 작동하지만하나서버가 수신 대기하는 서버 측 포트(즉, 소위 서비스의 "잘 알려진 포트")와 이에 연결하는 모든 클라이언트는 클라이언트의 로컬 주소 + 포트가 다릅니다.
따라서 실제로 세 개의 연결이 표시되어야 합니다. 두 개만 표시되는 이유는 그 중 하나가 적절한 시간을 기다렸거나 아직 해당 상태에 도달하지 않았기 때문일 수 있습니다. grep 필터가 중요한 정보를 숨기고 있을 수 있습니다. 이 테스트에서는 서버가 각 연결을 수락할 때 로컬에서 무언가를 인쇄하도록 할 수 있습니다.