TCP 성능 변조 실현 원리 및 프로 세 스 분석

세 번 악수 단계

클 라 이언 트 SYN 패키지 의 재 시도 횟수sysctl -w net.ipv4.tcp_syn_retries=6관련 소개
1 차 재 시 는 1 초 뒤에 발생 한 뒤 이 어 2·4·8·16·32 초 에 총 6 차례 재 시 도 를 두 배로 하고,마지막 재 시 도 는 64 초 를 기다 리 며 여전히 ACK 로 돌아 오지 않 으 면 세 차례 악 수 를 종료 한다.따라서 총 소모 시간 은 1+2+4+8+16+32+64=127 초 로 2 분 이 넘는다.
서버 세 미 연결 풀 크기sysctl -w net.ipv4.tcp_max_syn_backlog=16384
서버 의 반 연결 풀 이 가득 찬 후에 syncookie 체 제 를 시작 할 지 여부 입 니 다.sysctl -w net.ipv4.tcp_syncookies=1관련 소개
SYN 세 미 접속 대기 열 이 가득 차 면 기본적으로 연결 을 버 립 니 다.그렇지 않 습 니 다.syncookies 기능 을 켜 면 SYN 대기 열 을 사용 하지 않 고 연결 을 성공 적 으로 만 들 수 있 습 니 다.
syncookies 는 이렇게 합 니 다.서버 는 현재 상태 에 따라 값 을 계산 하여 우리 측 이 보 낸 SYN+ACK 메시지 에 보 냅 니 다.클 라 이언 트 가 ACK 메시지 로 돌아 갈 때 이 값 검증 을 꺼 냅 니 다.합 법 적 이면 연결 이 성공 적 이 라 고 생각 합 니 다.다음 그림 과 같 습 니 다.
  • 0 은 이 기능 을 닫 는 것 을 나타 낸다
  • 4.567917.2 는 무조건 오픈 기능 을 나타 낸다
  • 1 은 SYN 반 연결 대기 열 이 내 려 가지 않 을 때 만 사용 하 는 것 을 나타 낸다
  • 메모:syncookie 는 SYN 범 홍 공격(공격 자가 악의 적 으로 대량의 SYN 메 시 지 를 서버 에 보 내 SYN 반 연결 대기 열 이 넘 쳐 정상 적 인 클 라 이언 트 의 연결 이 이 루어 지지 않 음)에 대응 하 는 데 만 사용 되 기 때문에 많은 TCP 기능 을 사용 할 수 없습니다.그래서 tcpsyncookies 는 1 로 설정 되 어 있 으 며,대기 열 이 가득 찼 을 때 만 사용 합 니 다.
    서버 SYN+ACK 패키지 의 재 시도 횟수net.ipv4.tcp_synack_retries=5관련 소개
    tcp_synack_retries 의 기본 재 시도 횟수 는 5 회 입 니 다.클 라 이언 트 가 SYN 을 다시 보 내 는 것 과 유사 합 니 다.재 시 도 는 1,2,4,8,16 초 를 거 칩 니 다.마지막 재 시도 후 32 초 를 기다 리 고 ACK 를 받 지 못 하면 연결 을 닫 습 니 다.그래서 모두 63 초 를 기 다 려 야 합 니 다.
    서버 전체 연결 대기 열의 크기
    min(backlog,/proc/sys/net/core/somaxconn)에 따라 Liux 커 널 2.2 버 전 이후 listen 함수 의 backlog 인 자 는 accept 대기 열의 크기 를 설정 할 수 있 습 니 다.
    또한 backlog 매개 변 수 는 Linux 시스템 급 의 대기 열 길이 상한 선 에 도 제한 되 어 있 습 니 다.물론 이 상한 한도 값 은 somxconn 매개 변 수 를 통 해 수정 할 수 있 습 니 다.somxconn 은 커 널 의 매개 변수 이 고 기본 값 은 128 입 니 다.
    sysctl -w net.core.somaxconn=32768
    4 회 스윙 단계
    그 다음 에 우 리 는 먼저 연결 을 닫 는 쪽 을 주동 적 인 측 이 라 고 부 르 고 나중에 연결 을 닫 는 쪽 을 수 동적 인 측 이 라 고 부른다.
    네 번 손 을 흔 드 는 절차:
    사실 네 번 의 손 흔 들 기 는 두 가지 메시지 만 언급 된다.FIN 과 ACK.FIN 은 Finish 가 연결 을 끝 낸다 는 뜻 으로 FIN 메 시 지 를 보 낸 사람 은 더 이상 데 이 터 를 보 내지 않 고 이 방향의 전송 채널 을 닫 겠 다 는 뜻 이다.ACK 는 Acknowledge 가 확인 한 뜻 으로 상대방 에 게 알 리 는 데 사 용 됩 니 다.당신 측의 전송 채널 이 이미 닫 혔 습 니 다.주동 자가 연결 을 닫 을 때 FIN 메 시 지 를 보 냅 니 다.이때 주동 자의 연결 상 태 는 ESTABLISHED 에서 FIN 으로 변 합 니 다.WAIT1。수 동적 인 측 이 FIN 메 시 지 를 받 은 후에 커 널 은 자동 으로 ACK 메 시 지 를 답장 하고 연결 상 태 는 ESTABLISHED 에서 CLOSE 로 변 합 니 다.WAIT 는 말 그대로 프로 세 스 가 close 함수 로 연결 을 닫 기 를 기다 리 고 있 습 니 다.주동 자가 이 ACK 메 시 지 를 받 은 후 연결 상 태 는 FINWAIT 1 이 FIN 으로 변경WAIT 2,능 동적 인 송신 채널 이 닫 혔 습 니 다.수 동적 인 송신 채널 이 어떻게 닫 혔 는 지 살 펴 보 자.패 시 브 측 이 CLOSE 에 들 어 갈 때WAIT 상태 에서 프로 세 스 의 read 함 수 는 0 으로 되 돌아 갑 니 다.그러면 개발 자 는 close 함 수 를 맞 춤 형 으로 호출 하여 커 널 에서 FIN 메 시 지 를 보 냅 니 다.이때 수 동적 으로 연 결 된 상 태 는 LAST 로 변 합 니 다.ACK。주동 자가 이 FIN 메 시 지 를 받 았 을 때 커 널 은 자동 으로 ACK 에 답장 을 하고 연결 상 태 는 FIN 입 니 다.WAIT 2 TIMEWAIT,Linux 시스템 에서 약 1 분 후 TIMEWAIT 상태의 연결 이 완전히 꺼 집 니 다.반면 패 시 브 측 이 ACK 메 시 지 를 받 으 면 연결 이 꺼 진다.

    능 동적 최적화
    ACK 대기,FIN 가방 재발 급 횟수
    주동 자가 FIN 메 시 지 를 보 낸 후 연결 은 FIN 에 있 습 니 다.WAIT 1 상태 에서 이 상 태 는 보통 수 십 밀리초 내 에 FIN 으로 전환 해 야 한다.WAIT2。상대방 이 돌아 오 는 ACK 를 늦게 받 지 못 할 때 만 netstat 명령 으로 FIN 을 관찰 할 수 있 습 니 다.WAIT 1 상태.이때 커 널 은 정시 에 FIN 메 시 지 를 다시 보 냅 니 다.그 중에서 재발 급 횟수 는 tcp 입 니 다.orphan_retries 매개 변수 제어(주의,orphan 은 고아 라 는 뜻 이지 만 이 매개 변 수 는 고아 연결 에 만 효과 가 있 는 것 이 아니 라 사실상 모든 FINWAIT 1 상태 에서 의 연결 이 모두 유효 합 니 다)기본 값 은 0 입 니 다.8 번 을 말 합 니 다.net.ipv4.tcp_orphan_retries = 0고아 연결 수량net.ipv4.tcp_max_orphans = 16384관련 소개
    tcp_max_orphans 는 고아 연결 의 최대 수량 을 정의 했다.프로 세 스 가 close 함 수 를 호출 하여 연결 을 닫 으 면 이 연결 은 FINWAIT 1 상태 에서 이 연결 은 이 프로 세 스 와 무관 하 게 고아 연결 이 되 었 습 니 다.Linux 시스템 은 고아 의 연결 이 너무 많아 서 시스템 자원 이 장기 적 으로 점용 되 는 것 을 방지 하기 위해 tcp 를 제공 합 니 다.max_orphans 인자.고아 연결 이 그 보다 많 으 면 새로 추 가 된 고아 연결 은 네 번 더 손 을 흔 들 지 않 고 RST 리 셋 메 시 지 를 직접 보 내 강제 폐쇄 된다.
    고아 연결 의 정의:프로 세 스 가 close 로 닫 힌 연결 을 고아 연결 이 라 고 부 릅 니 다.또한 shutdown 함수 도 연결 을 닫 을 수 있 습 니 다.이 두 사람 은 모두 상대방 에 게 FIN 메 시 지 를 보 냅 니 다(shutdown 매개 변 수 는 SHUT 로 전송 해 야 합 니 다.WR 혹은 SHUTRDWR 에서 만 FIN 을 보 냅 니 다)close 호출 후 상대방 이 반 닫 힌 상태 에서 보 낸 데이터 가 주동 적 인 곳 에 도착 하 더 라 도 프로 세 스 가 받 아들 일 수 없다 는 차이 가 있 습 니 다.netstat-p 명령 을 사용 하면 연결 에 대응 하 는 프로 세 스 이름 이 비어 있 습 니 다(프로 세 스 와 무관 합 니 다!).shutdown 함수 가 호출 되면 연결 이 FIN 에 들 어가 도WAIT 1 또는 FINWAIT 2 상 태 는 고아 연결 도 아니 고 프로 세 스 는 데 이 터 를 계속 받 을 수 있 습 니 다.
    FIN 을 기다 리 는 시간.net.ipv4.tcp_fin_timeout = 60관련 소개
    연결 이 ACK 를 받 으 면 FIN 에 들 어 갑 니 다.WAIT 2 상태 가 되면 주동 자의 송신 채널 이 닫 혔 다 는 뜻 으로,그 다음 에는 상대방 이 FIN 메 시 지 를 보 내 기 를 기다 리 며 송신 채널 을 닫 을 예정 이다.이때 연결 이 shutdown 함수 로 닫 히 면 연결 은 계속 FIN 에 있 을 수 있 습 니 다.WAIT 2 상태.그러나 close 함수 가 닫 힌 고아 연결 에 대해 서 는 이 상태 가 오래 지속 되 지 않 습 니 다.tcpfin_timeout 은 이 상태 에서 연결 의 지속 시간 을 제어 합 니 다.
    TIME_WAIT 관련 매개 변수
    관련 소개
    TIME_WAIT 는 주동 자가 네 차례 손 을 흔 드 는 마지막 상태 다.수 동적 인 측 에서 보 내 온 FIN 메 시 지 를 받 았 을 때 주동 적 인 측은 ACK 에 답장 을 보 내 상대방 의 전송 채널 이 이미 닫 혔 음 을 확인 하고 연결 이 TIME 에 들 어 갔다 고 밝 혔 다.WAIT 상태,대기 60 초 후 종료.
    TIME_WAIT 상태 최대 연결 수
    해당 TIMEWAIT 의 연결 수가 이 인 자 를 초과 하면 새로 닫 힌 연결 은 TIME 를 거치 지 않 습 니 다.WAIT 로 바로 닫 습 니 다.net.ipv4.tcp_max_tw_buckets = 5000TIME 재 활용 여부WAIT 상태의 포트
    복용 TIMEWAIT 상태의 포트 입 니 다.서버 가 상류 서버 에 자발적으로 연결 하면 tcptw_reuse 매개 변 수 는 1 로 설정 되 어 있 으 며 클 라 이언 트 의 새로운 연결 을 허용 합 니 다.안전 한 조건 에서 TIME 을 사용 합 니 다.WAIT 상태의 포트 입 니 다.net.ipv4.tcp_tw_reuse = 1물론 tcptw_reuse 가 유효 합 니 다.timestamps 인 자 를 1 로 설정 해 야 합 니 다.안전 재 활용 의 선 결 조건 을 만족 시 켜 야 합 니 다(상대방 도 tcp 를 열 어야 합 니 다.timestamps ):net.ipv4.tcp_timestamps = 1오래된 버 전의 Linux 는 tcp 도 제공 합 니 다.tw_휴지통 매개 변 수 는 TIME 를 요구 하지 않 습 니 다.WAIT 상 태 는 60 초 간 존재 해 데이터 착란 을 초래 하기 쉬 우 므 로 1 로 설정 하 는 것 을 권장 하지 않 습 니 다.net.ipv4.tcp_tw_recycle = 0그래서 리 눅 스 4.12 버 전에 서 이 인 자 를 직접 취소 했다.
    기타 설정
    시스템 이 열 수 있 는 포트 범위sysctl -w net.ipv4.ip_local_port_range=1024 65000시스템 전역 에서 할당 할 수 있 는 최대 파일 핸들 수
    sysctl -w fs.file-max=2097152
    sysctl -w fs.nr_open=2097152
    echo 2097152 > /proc/sys/fs/nr_open
    현재 세 션 이나 프로 세 스 가 파일 핸들 수 를 열 수 있 도록 합 니 다.ulimit -n 1048576이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기