(3) TCP 3방향 핸드셰이크 및 연결 큐 - 네트워크 프로그래밍

1) 예비 지식:

1.1) 컴퓨터 네트워크 아키텍처

        원칙적으로 시스템 네트워크:

        1) 물리 계층: 비트 전송에 어떤 신호를 사용할 것인지의 문제를 해결합니다.

        2) 데이터 링크 계층: 네트워크(또는 한쪽 끝의 링크)에서 패킷 전송 문제를 해결합니다.

        3) 네트워크 계층: 여러 네트워크에서 패킷 전송(라우팅) 문제를 해결합니다.

        4) 전송 계층: 프로세스 간의 네트워크 기반 통신 문제를 해결합니다.

        5) 애플리케이션 계층: 애플리케이션 프로세스의 상호 작용을 통해 특정 네트워크 애플리케이션을 구현하는 문제를 해결합니다.

 1.2) 전송 계층

        컴퓨터 네트워크 구조의 물리적 계층, 데이터 링크 계층 및 네트워크 계층은 호스트에서 호스트로의 통신을 공동으로 구현하지만 실제로 컴퓨터 네트워크에서 통신하는 실제 엔터티는 양단의 호스트에 위치한 프로세스입니다. 통신의. 전송 계층은 애플리케이션 프로세스 간의 논리적 통신을 위한 서비스를 직접 제공합니다.

        전송 계층은 기본 네트워크 코어의 세부 정보로부터 상위 수준 사용자를 보호하여 애플리케이션 프로세스에 두 전송 계층 엔터티 간에 종단 간 논리적 통신 채널이 있는 것처럼 보이게 합니다.

        서로 다른 응용 프로그램 요구 사항에 따라 인터넷의 전송 계층은 연결 지향 TCP와 연결 없는 UDP라는 두 가지 전송 프로토콜을 제공합니다.

  1.3) TPC/UDP      

        UDP(User Datagram Protocol)는 유니캐스트, 멀티캐스트 및 브로드캐스트를 지원하고 상위 계층에 연결이 없고 신뢰할 수 없는 전송 서비스를 제공하며 IP 전화 통신 및 화상 회의와 같은 실시간 응용 프로그램에 적합합니다.

        유니캐스트만 지원하는 TCP(Transmission Control Protocol) 전송 제어 프로토콜은 상위 계층에 연결 중심의 안정적인 전송 서비스를 제공하며, 파일 전송과 같이 안정적인 전송이 필요한 응용 프로그램에 적합합니다.

        TCP/IP 시스템 응용 프로그램 계층의 공통 프로토콜에서 사용하는 전송 계층의 잘 알려진 포트 번호입니다.

         

2) TCP 3방향 핸드셰이크

2.1) 간단한 프로세스:

        1) 클라이언트는 SYN 플래그와 함께 연결 요청 데이터그램을 서버로 보냅니다.

        2) 서버는 SYN+ACK 플래그와 함께 연결 요청 및 응답 데이터그램을 클라이언트로 보냅니다.

        3) 클라이언트는 ACK 플래그와 함께 응답 데이터그램을 서버로 보냅니다(데이터를 전달할 수 있음).

2.2) 세부 프로세스:

        1) 서비스 프로세스가 특정 포트를 수신 대기하고 있는 상태입니다.

        2) 클라이언트 프로세스는 TCP 연결 요청 세그먼트를 서비스 프로세스로 보내고 동기 전송 상태로 들어갑니다. TCP 연결 요청 세그먼트의 헤더에 있는 동기화 비트 SYN=1은 이것이 TCP 연결 요청 세그먼트임을 나타냅니다. 시퀀스 번호 필드 seq는 임의로 초기 값 x를 초기 시퀀스 번호(client_isn)로 설정합니다. TCP는 SYN=을 규정합니다. 1 세그먼트는 데이터를 전달할 수 없지만 시퀀스 번호를 사용합니다.

        3) 서비스 프로세스는 TCP 연결 요청 세그먼트를 수신한 후 연결 설정에 동의하면 TCP 클라이언트 프로세스에 TCP 연결 요청 확인 세그먼트를 보내고 동기화 수락 상태에 들어갑니다. Set SYN=1, ACK=1은 이것이 SYN 핸드셰이크 및 ACK 확인 응답 메시지임을 나타냅니다. 임의의 초기 시퀀스 번호(server_isn) seq=y, ack=x+1은 클라이언트가 보낸 TCP 연결 요청 메시지 세그먼트입니다. 확인 시퀀스=x.

        4) 클라이언트 프로세스는 TCP 연결 요청 확인 메시지 세그먼트를 수신한 후 정상적인 TCP 확인 메시지 세그먼트를 TCP 서비스 프로세스로 보내고 연결 설정 상태로 들어갑니다. ACK=1은 이것이 응답 메시지임을 의미하고 ack=y+1은 서버에서 보낸 seq=y 메시지의 확인입니다. TCP 연결 요청 메시지 세그먼트의 초기 시퀀스 번호는 seq=x이며 하나의 시퀀스 번호를 소비하므로 이 메시지 seq=x+1입니다. 이 메시지는 데이터를 전달할 수 있으며, 데이터를 전달하지 않으면 시퀀스 번호가 사용되지 않습니다.

        5) 서비스 프로세스도 확인 세그먼트를 수신한 후 연결 설정 상태로 진입합니다.

2.3) 3자 악수를 하는 이유:

        주된 이유: 과거 연결 방지

        네트워크 정체의 경우 클라이언트 프로세스의 첫 번째 핸드셰이크의 SYN 메시지가 서비스 프로세스에 도달하지 않았고 클라이언트 프로세스가 서비스 프로세스의 SYN+AKC 메시지를 수신하지 않아 시간 초과 재전송을 트리거한 다음 SYN 메시지는 이전에 보낸 SYN 메시지보다 먼저 서버에 도착하고 이때 서비스 프로세스는 클라이언트 프로세스에 SYN+ACK 메시지를 보냅니다.

        1) 두 개의 메시지 연결인 경우 현재 연결이 과거 연결인지 판단할 수 없으므로 오류 및 자원 낭비가 발생합니다. 서비스 프로세스가 이전에 전송된 SYN 메시지를 수신한 경우 서비스 프로세스는 SYN+ACK 메시지를 전송한 후 직접 연결 설정 상태로 진입하게 되는데, 이때 클라이언트 프로세스는 마지막 TCP 연결을 완료하고 닫힌 상태일 수 있으며 , 두 메시지 또한

 

        2) 3개 메시지 연결인 경우 클라이언트 프로세스가 아직 열려 있으면 자체 컨텍스트에 따라 이 연결이 과거 연결(일련 번호 또는 시간 초과)인지 판단하고 서비스 프로세스에 RST 메시지를 보낼 수 있습니다. 이 연결을 종료합니다. 클라이언트 프로세스가 닫히고 서비스 프로세스가 오랫동안 ACK 메시지를 받지 못한 경우 연결이 해제됩니다.

 3) 연결 대기열

        커널은 수신 대기 상태의 소켓에 대해 두 개의 대기열을 유지합니다. 하나는 불완전한 연결 요청 대기열(SYN_RECV 상태)이고 다른 하나는 소켓을 설정하기 위해 수락을 기다리는 대기열(ESTABLISHED 상태)입니다.

        listen() 함수는 다음과 같이 선언됩니다.

int listen(int socket, int backlog);

        두 번째 매개변수 백로그는 수락의 완전히 설정된 소켓(ESTABLISHED 상태)을 기다리는 대기열의 길이를 나타냅니다.

        불완전한 연결 요청 대기열의 길이는 다음 파일에서 설정됩니다(기본값은 128).

/proc/sys/net/ipv4/tcp_max_syn_backlog

4) 보충

4.1) SYN 공격

        SYN 공격은 DoS(Denial of Service Denial of Service) 공격의 일종으로, 소스 IP를 위조하여 첫 번째 핸드셰이크 SYN 패킷을 대량으로 전송하여 불완전한 연결 요청 큐를 채워 정상적인 연결 요청이 실패하는 공격입니다.

        해결책:

        1) IP 연결 수 제한

        2) 불완전 연결 상태의 대기열 용량 증가: 메모리 리소스 사용량 증가, 권장하지 않음

        3) 연결 자원 할당 지연. 전통적으로 불완전한 연결 큐에서는 연결마다 해당 자원이 할당되고, 완전한 연결 큐에서는 자원 할당이 지연될 수 있습니다. SYN은 서버가 해당 자원을 할당하지 않는 한 많은 수의 SYN 요청을 보내므로 심각하게 손상되지 않습니다.

4.2) 초기 일련번호가 임의로 생성되는 이유

        네트워크 통신의 보안을 보장하십시오. 그렇지 않으면 해커가 귀하와 다른 호스트 간의 초기 통신 일련 번호를 쉽게 획득하여 일련 번호를 위조하여 공격할 수 있습니다.

4.3) SYN이 데이터를 전달하지 않고 일련 번호를 소비하는 이유

        SYN 세그먼트는 상대방의 확인이 필요하기 때문에 확인이 모호하지 않도록 일련번호만 사용할 수 있습니다.

4.4) 각 악수의 의미

        첫 번째 핸드셰이크: 클라이언트는 정보가 없으며 서버는 상대방이 정상적으로 전송했는지 확인하고 정상적으로 수락합니다.

        두 번째 핸드셰이크: 클라이언트는 자신의 송수신이 정상이며 상대방의 송수신이 정상임을 확인합니다.

        세 번째 핸드셰이크: 서버는 전송이 정상임을 확인하고 상대방은 정상적으로 수락합니다.

4.5) TCP 연결 과정에서 클라이언트가 중간에 다운되고 클라이언트가 복구된 후 서버에 SYN 패킷을 보내 연결을 다시 설정합니다. 이때 서버는 어떻게 합니까?

        TCP 연결은 주로 클라이언트 IP, 서버 IP 및 포트 번호에 의해 결정됩니다.

        1) 포트가 동일하지 않습니다. 이때 서버의 임무는 새로운 연결을 맺는 것이므로 3방향 핸드셰이크를 통해 새로운 연결을 맺는다. 이전 연결은 TCP 연결 유지 메커니즘을 트리거하고 클라이언트가 활성 상태가 아님을 감지한 후 서버는 이전 연결을 해제합니다.

        2) 포트는 동일합니다. TCP는 SYN 패킷을 보내고 서버는 마지막 메시지의 확인 번호와 일련 번호로 응답합니다. 이 ACK를 Challenge ACK라고 합니다. Challenge ACK를 받은 후 클라이언트는 일련 번호가 수신할 것으로 예상한 것과 다르다는 것을 알게 됩니다. 따라서 RST 메시지를 보내고 서버는 수신 후 연결을 해제합니다.

추천

출처blog.csdn.net/weixin_43284996/article/details/128127264