정의되지 않은 iperf3 포트?

정의되지 않은 iperf3 포트?

iperf3 UDP 세션과 연결된 모든 포트를 식별하려고 하는데 TCP 핸드셰이킹이 iperf3 서버에서 정의되지 않은(?) 포트를 사용하는 것을 확인했습니다.

iperf3 테스트에 사용되는 모든 포트를 지정하는 방법이 있습니까?

예시:

이 예에서는 사용된 다음 IP 주소와 포트를 관찰합니다.

  • [클라이언트] 10.0.1.20, 포트 5222
  • [서버] 10.0.1.89, 포트 5205
  • [클라이언트] 10.0.1.20,포트 56039 ????

고객:

// iperf3 (v3.1.3) Client running on Ubuntu 16.04 IP address: 10.0.1.20, port 5222
$ iperf3 -c 10.0.1.89 -u -p 5205 --cport 5222 -B 10.0.1.20

섬기는 사람:

// iperf3 (v3.1.3) Server running on Ubuntu 16.04 IP address: 10.0.1.89, port 5205
$ iperf3 -s -p 5205
-----------------------------------------------------------
Server listening on 5205
-----------------------------------------------------------
Accepted connection from 10.0.1.20, port 56039
[  5] local 10.0.1.89 port 5205 connected to 10.0.1.20 port 5222
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
...

이는 클라이언트에서 실행되는 Wireshark 캡처로도 확인됩니다.

답변1

아니요, iperf API를 사용하거나 명령줄 인수를 통해 이 클라이언트 포트를 설정할 수 없습니다.

이는 적어도 현재 3.1 iperf 버전에 적용됩니다. 을 보면서소스 코드, 초기 TCP 연결 설정을 담당하는 기능을 찾을 수 있습니다.

/* iperf_connect -- client to server connection function */
int
iperf_connect(struct iperf_test *test)
{
[...]
    /* Create and connect the control channel */
    if (test->ctrl_sck < 0)
        // Create the control channel using an ephemeral port
        test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, 0, test->server_hostname, test->server_port, test->settings->connect_timeout);

    if (test->ctrl_sck < 0) {
        i_errno = IECONNECT;
        return -1;
    }
[...]

netdial()서버에 대한 연결 생성을 담당하는 함수 서명을 살펴보면 다음과 같습니다 .

netdial(int domain, int proto, char *local, int local_port, char *server, int port, int timeout)

보다 구체적으로, 우리는 그것이 설정되어 있음을 볼 수 있습니다넷다이얼()local_port 매개변수는 0. TCP 제어 채널을 생성할 때 클라이언트 측에 임의의 포트를 설정해야 합니다.

Thomas가 언급했듯이 --cport옵션은데이터 스트림포트를 보면 확인할 수도 있습니다.소스 코드UDP 데이터 스트림 설정을 담당하는 기능:

 if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->bind_port, test->server_hostname, test->server_port, -1)) < 0) 

이 함수는 옵션 에서 검색된 매개변수 test->bind_port로 옵션을 사용합니다 .local_port--cport

답변2

iperf3 웹사이트이 동작에 대한 설명이 있습니다.

...초기 TCP 연결은 테스트 매개변수 교환, 테스트 시작 및 종료 제어, 테스트 결과 교환에 사용됩니다. 이를 "제어 연결"이라고도 합니다. 실제 테스트 데이터는 클라이언트가 지정한 프로토콜에 따라 별도의 TCP 연결, UDP 패킷의 별도 흐름 또는 독립적인 SCTP 연결을 통해 전송됩니다.

man iperf3및 옵션을 살펴보면 --cport이는 다음에만 영향을 미치는 것으로 보입니다.데이터 스트림영향을 미치지 않으며제어 연결이는 정의되지 않은 포트로 식별되는 세 번째 포트입니다.

관련 정보