Mandoo’s WLAN story

[OpenWRT] TCP open fail 시 재전송 횟수 확인 본문

Mandoo's IT Story/OpenWRT

[OpenWRT] TCP open fail 시 재전송 횟수 확인

mandoo12 2024. 1. 2. 16:02

C언어로 만들어진 클라이언트에서 서버에게 TCP연결을 요청했을 때 실패하는 경우 syn패킷을 재전송하는 횟수를 확인 및 세팅 할 수 있다.
 
net.ipv4.tcp_syn_retries를 세팅하면된다.
 
TMI) 이 값은 커널 파라미터인데, 기본적으로 6으로 세팅되어 있는 듯 하다. (openwrt 기준)


1. 현재 설정된 재전송 횟수 확인

아래 커맨드를 입력해 재전송 횟수를 확인한다.

sysctl -a | grep "net.ipv4.tcp_syn_retries"

 

sysctl net.ipv4.tcp_syn_retries


2. tcpdump를 이용해 재전송 횟수 확인

이 값이 실제로 재전송에 쓰이는 값인지 확인해보자.
일부로 무의미한 주소를 이용해 connect 에러를 내고, tcpdump를 이용해 실제로 전송되는 패킷의 갯수를 확인했다.

tcpdump -i rmnet_data0 host 123.123.123.123&

 
tcp_syn_retries 만큼 재전송을 시도한다. 

(실제로 재전송되는 패킷은 6개이고, 1개는 최초 전송 패킷이다.)

테스트 시 재전송 주기는 다양하다.
2초 간격으로 재전송을 시도 할 때도 있고, 3-4초 간격일 때도 있고 재전송 주기가 매번 다를 때도 있다.


3. 재전송 횟수 수정

아래와 같이 커맨드를 입력한다.
재전송횟수는 무조건 1 이상이어야 한다.
0으로 설정 할 경우 SYN 패킷 전송 후 서버로부터의 응답을 기다리지 않고 즉시 연결 실패로 판단하기 때문이다.
(openwrt 기준)

sysctl -w net.ipv4.tcp_syn_retries=1

 

* 0으로 세팅하는 경우 아래와 같이 경고메세지가 출력되고,  저장도 불가능하다.

 
위에서 확인한 방법으로 세팅이 저장되었는지 확인한다.

sysctl net.ipv4.tcp_syn_retries

 
다시 무의미한 주소로 tcp connect을 시도하면 아래와 사진과 같이 1회만 재전송을 시도하는 것이 확인된다.


4. 소스코드에서 수정

나는 sysctl net.ipv4.tcp_syn_retries 값이 3으로 세팅된 펌웨어를 만들어야 하기 때문에 커널 소스코드에서부터 변경을 해주었다!
펌웨어의 전체 소스코드는 다들 다를테니 공통된 경로만 써놓겠다!
linux-4.4/include/net/tcp.h
tcp 헤더파일에 보면 6으로 선언되어있다!
나는 이 값을 3으로 세팅해서 펌웨어를 만들었당!

#define TCP_SYN_RETRIES  3  /* This is how many retries are done