Linux가 'time_wait' 포트를 재사용하는 이유는 무엇입니까?

Linux가 'time_wait' 포트를 재사용하는 이유는 무엇입니까?

제가 아는 한 '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 필터가 중요한 정보를 숨기고 있을 수 있습니다. 이 테스트에서는 서버가 각 연결을 수락할 때 로컬에서 무언가를 인쇄하도록 할 수 있습니다.

관련 정보