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
이는 다음에만 영향을 미치는 것으로 보입니다.데이터 스트림영향을 미치지 않으며제어 연결이는 정의되지 않은 포트로 식별되는 세 번째 포트입니다.