Computer Science/Network

Linux - Network 1 / 3

서린이1 2024. 8. 29. 21:35

1. TCP,  UDP,  ICMP

TCP, UDP, ICMP는 네트워크 통신에서 중요한 역할을 하는 프로토콜입니다. 이들은 각각의 목적과 동작 방식에 따라 특정한 기능을 제공합니다.


1. TCP (Transmission Control Protocol)

  • 설명: TCP는 신뢰성 있는 데이터 전송을 보장하는 연결 지향 프로토콜입니다. 연결을 설정하고 데이터 전송 전에 세 가지 단계를 통해 상대방과 연결을 가집니다.
  • 특징:
    • 신뢰성: 데이터가 전송되었는지 확인하고, 오류가 발생한 경우 재전송합니다.
    • 연결 지향: 데이터 전송 전에 연결을 설정해야 합니다. 이를 위해 3-way handshake라는 과정을 거칩니다:
      • 클라이언트가 SYN 패킷 전송
      • 서버가 SYN-ACK 패킷 응답
      • 클라이언트가 ACK 패킷 전송 1
  • 헤더 구조:
    • 소스/목적 포트: 통신을 위한 포트 번호.
    • 순서 번호: 전송된 데이터의 위치를 나타냅니다.
    • ACK 번호: 수신한 데이터의 다음 순서를 나타냅니다.
    • 체크섬: 데이터의 오류를 체크하는 데 사용됩니다.

2. UDP (User Datagram Protocol)

  • 설명: UDP는 비연결형 프로토콜로, TCP보다 간단한 구조를 가지고 있습니다. 신뢰성을 요구하지 않는 데이터 전송에 사용됩니다.
  • 특징:
    • 비연결성: 데이터 전송 전에 연결을 설정하지 않습니다.
    • 속도: 데이터그램을 즉시 전송하기 때문에 실시간 애플리케이션에 유리합니다 (예: 비디오 스트리밍).
    • 신뢰성 부족: 패킷 손실이나 오류에 대해 신경 쓰지 않으므로, 높은 속도가 필요한 상황에서 주로 사용됩니다.
  • 헤더 구조:
    • 소스/목적 포트: TCP와 동일하게 포트 번호가 포함됩니다.
    • 길이: UDP 헤더와 데이터의 길이.
    • 체크섬: 데이터의 오류를 검증하는 기능이 있지만, 필수는 아닙니다.

3. ICMP (Internet Control Message Protocol)

  • 설명: ICMP는 네트워크 장비 간의 오류 메시지와 운영 정보를 전달하는 데 사용됩니다. 주로 네트워크 진단 도구에서 사용됩니다.
  • 특징:
    • 오류 메시지: 데이터 전송 중 문제가 발생했을 때 이를 알리는 데 사용됩니다.
    • Ping 명령: ICMP Echo Request와 Echo Reply 메시지를 통해 네트워크 상태를 검사합니다.
    • 비연결형: 직접 데이터 흐름을 관리하지 않으며, 오히려 다른 프로토콜을 보조합니다.
  • 헤더 구조:
    • 타입 및 코드: 메시지의 종류와 세부적인 코드를 나타냅니다.
    • 체크섬: 오류 검증을 위해 사용됩니다.

4. 관련 주제: 프로토콜의 비교

  • 신뢰성:
    • TCP는 데이터의 전송 신뢰성을 보장하는 반면 UDP는 이를 보장하지 않습니다.
  • 연결 방식:
    • TCP는 연결 지향적이며 UDP는 비연결 지향적입니다.
  • 용도:
    • TCP는 웹 브라우징, 이메일 등에 사용되고, UDP는 온라인 게임, VoIP, 스트리밍 서비스 등에 많이 활용됩니다.

 

2. TIME_WAIT

TIME_WAIT 상태는 TCP 연결 종료 후 클라이언트 소켓이 일정 시간 동안 유지되는 상태로, 여러 가지 이유로 필요합니다.

1. 패킷 손실 처리

  • TCP는 신뢰성 있는 데이터 전송을 보장하기 위해 세그먼트의 전송 상태를 확인합니다. 클라이언트가 연결을 종료하고 소켓을 닫았을 때, 지연된 패킷이나 재전송된 패킷이 도착할 수 있습니다.
  • TIME_WAIT 상태는 이러한 지연된 패킷을 처리할 시간을 제공합니다. 만약 클라이언트가 닫힌 소켓에 지연된 FIN 패킷을 받으면, 이미 닫힌 연결이므로 해당 패킷은 무시하거나 적절히 처리할 수 있습니다.

2. 중복 연결 방지

  • TIME_WAIT 상태는 동일한 소켓 쌍(소스 IP, 소스 포트, 목적지 IP, 목적지 포트)으로 새로운 연결을 생성하기 전에 일정 시간을 대기하게 합니다. 이는 이전 연결이 완전히 종료될 수 있도록 보장합니다.
  • 이 시간 동안 새로운 연결이 발생하더라도, 이전 연결의 패킷이 혼동되지 않도록 하여 데이터의 무결성을 보장합니다.

3. 재전송 처리

  • 서버가 클라이언트의 마지막 ACK를 받지 못했을 경우, FIN 패킷을 재전송할 수 있습니다. 클라이언트가 TIME_WAIT 상태에 있을 때, 이 재전송된 FIN 패킷을 수신하게 되면 적절히 응답할 수 있습니다.
  • 이를 통해 재전송된 패킷이 정상적으로 처리되도록 하고, 연결이 완전히 종료되는 과정을 보장합니다.

4. 효율적인 연결 종료

  • TIME_WAIT 상태가 없었다면, 클라이언트는 즉시 소켓을 닫고 새로운 연결을 생성할 수 있었으나, 이로 인해 이전 연결의 패킷이 혼란을 일으킬 수 있었습니다.
  • 따라서 TIME_WAIT 상태는 네트워크 자원을 효율적으로 관리하고, 연결 종료 과정에서 발생할 수 있는 오류를 최소화하는 역할을 합니다.

 

3. TCP Half-open connection

TCP Half-open 연결은 두 통신 호스트 간의 상태가 비동기화된 TCP 연결을 의미하며, 일반적으로 한 쪽이 오류로 인해 정상적으로 종료되지 않았을 때 발생합니다. 이 상태는 연결의 한 쪽에서만 소켓이 종료되었고, 반대편은 여전히 연결된 상태로 남아 있는 상황입니다.


1. Half-open 상태의 정의

  • 정의: 한쪽 호스트(서버 또는 클라이언트)가 연결을 종료하거나 소켓을 삭제했지만, 다른 쪽 호스트가 이를 인지하지 못한 경우 발생합니다. 결과적으로 하나의 연결만 비활성화되고, 나머지 쪽은 여전히 활성 상태입니다.
  • 비정상적 종료: 이 상태는 통상적으로 다음과 같은 상황에서 발생할 수 있습니다.
    • 한 쪽 호스트가 충돌(crash)한 경우
    • 연결 종료를 통지하지 않고 소켓을 비활성화한 경우

2. Half-open 상태의 예

  • 서버 충돌 예시: 서버가 연결에 대한 FIN 패킷을 보내지 않고 갑자기 종료되면, 클라이언트는 서버에 대한 연결을 여전히 유지한 채로 남게 됩니다. 이 클라이언트는 이제 데이터를 보내려고 시도할 수 있지만, 서버는 해당 데이터를 수신할 수 없습니다.
  • 상태 비동기화: 이 상황에서 클라이언트는 여전히 정상적으로 작동하는 자원으로 인식하지만, 실제로는 서버가 응답하지 않기 때문에 연결이 이상 상태로 들어갑니다.

3. Half-open 연결의 원인

  • TCP 설정 처리 오류: 연결을 종료했지만 시간이 오래 걸린 경우, 이로 인해 않는 패킷 수신 잔액의 통신에 대한 기대가 일어날 수 있습니다.
  • Stateful Firewall Timeout: 상태를 관리하는 방화벽이 일정 시간 동안 통신이 없으면 연결 상태를 삭제하는 경우, 연결의 일쪽이 데이터 패킷을 전송하면 방화벽은 패킷을 버릴 수 있습니다. 이로 인해 연결이 half-open 상태로 남게 됩니다 1.

4. Half-open 연결의 문제점

  • 자원 낭비: Half-open 연결이 유지되는 동안, 시스템 자원(메모리 및 소켓 포트)이 낭비됩니다.
  • 데이터 전송 실패: 한쪽이 비정상적으로 종료되었기 때문에, 데이터 전송이 실패할 수 있습니다.
  • 보안 위험: 한쪽 연결이 더 이상 기능하지 않지만, 공격자는 이를 이용할 수 있는 가능성이 존재합니다.

5. 관련 주제: Embryonic Connection

  • 정의: Embryonic Connection은 TCP 연결이 설정 과정에 있는 상태를 의미합니다. 이 상태에서 클라이언트는 서버의 응답을 기다리고 있으며, 이 연결이 완전히 설정되지 않았습니다.
  • 상태 관리:
    • 클라이언트가 SYN 패킷을 전송하고, 서버가 SYN-ACK 패킷을 응답하면, 클라이언트는 최종 ACK 패킷을 전송하여 연결을 확립합니다. 이 상태에서 오류가 발생하면, 연결은 half-open 상태로 전환될 수 있습니다.

 

4. 네트워크 인터페이스 리스트와 라우팅

1. 네트워크 인터페이스 리스트

네트워크 인터페이스는 서버가 네트워크에 연결될 수 있도록 하는 하드웨어 또는 소프트웨어 구성 요소입니다. 일반적으로 다음과 같은 정보가 포함됩니다.

  • 인터페이스 이름: 예를 들어, eth0, wlan0, lo(루프백) 등.
  • IP 주소: 각 인터페이스에 할당된 고유한 IP 주소.
  • 서브넷 마스크: IP 주소의 네트워크 부분과 호스트 부분을 구분하는 데 사용되는 마스크.
  • MAC 주소: 물리적 네트워크 인터페이스에 할당된 고유 식별자.
  • 상태: 인터페이스가 활성화(active) 또는 비활성화(inactive) 상태인지 여부.

이 정보는 일반적으로 명령어를 통해 확인할 수 있으며, 예를 들어 Linux에서는 ifconfig 또는 ip addr 명령어를 사용할 수 있습니다.

2. 라우팅 설정

라우팅 설정은 패킷이 네트워크를 통해 이동하는 경로를 결정합니다. 라우팅 테이블은 각 목적지에 대한 경로 정보를 포함하고 있으며, 주요 항목은 다음과 같습니다.

  • 목적지 네트워크: 패킷이 전송될 대상 IP 주소 또는 네트워크.
  • 서브넷 마스크: 목적지 네트워크를 정의하는 데 사용되는 마스크.
  • 게이트웨이: 패킷이 전달될 다음 홉의 IP 주소. 일반적으로 라우터의 주소입니다.
  • 인터페이스: 패킷이 전송될 네트워크 인터페이스.
  • 메트릭: 경로의 우선 순위를 결정하는 값. 낮은 값일수록 높은 우선 순위를 가집니다.

라우팅 테이블은 route 또는 ip route 명령어를 통해 확인할 수 있습니다.

3. 예시

  • 네트워크 인터페이스:
    • eth0: 192.168.1.10, 서브넷 마스크 255.255.255.0, 상태: 활성화.
    • lo: 127.0.0.1, 서브넷 마스크 255.0.0.0.
  • 라우팅 테이블:
    • 목적지: 0.0.0.0, 서브넷 마스크: 0.0.0.0, 게이트웨이: 192.168.1.1, 인터페이스: eth0, 메트릭: 100.

4. 중요성

  • 네트워크 연결: 올바른 네트워크 인터페이스 설정은 서버가 네트워크에 제대로 연결되도록 보장합니다.
  • 효율적인 데이터 전송: 라우팅 설정은 데이터 패킷이 최적의 경로를 통해 전달되도록 하여 네트워크 성능을 향상시킵니다.

5. 서브넷 마스크

서브넷 마스크는 IP 주소에서 네트워크 부분과 호스트 부분을 구분하는 데 사용되는 값입니다. 네트워크의 크기를 정의하고, 어떤 IP 주소가 동일한 네트워크에 속하는지를 판단하는 데 중요한 역할을 합니다.

서브넷 마스크의 구성

서브넷 마스크는 일반적으로 32비트의 이진수로 표현되며, 1로 설정된 비트는 네트워크 부분을, 0으로 설정된 비트는 호스트 부분을 나타냅니다. 예를 들어, 서브넷 마스크가 255.255.255.0인 경우:

  • 이진수: 11111111.11111111.11111111.00000000
  • 네트워크 부분: 24비트 (첫 3옥타브)
  • 호스트 부분: 8비트 (마지막 옥타브)

예시

  1. IP 주소와 서브넷 마스크:
    • IP 주소: 192.168.1.10
    • 서브넷 마스크: 255.255.255.0
    여기서 192.168.1.10의 네트워크 부분은 192.168.1이고, 호스트 부분은 10입니다. 이 설정은 192.168.1.0 네트워크 내에서 최대 254개의 호스트(192.168.1.1 ~ 192.168.1.254)를 지원합니다.
  2. 다른 서브넷 마스크 예시:
    • IP 주소: 10.0.0.5
    • 서브넷 마스크: 255.0.0.0
    이 경우, 네트워크 부분은 10이고, 호스트 부분은 0.0.5입니다. 이 설정은 10.0.0.0 네트워크 내에서 약 1천7백만 개의 호스트를 지원합니다.
  3. 서브넷 마스크 계산 방법 :
    1. IP 주소와 서브넷 마스크 이해하기
      • IP 주소는 32비트로 구성되며, 보통 4개의 옥텟(예: 192.168.1.1)으로 표시됩니다.
      • 서브넷 마스크도 32비트이며, 네트워크 부분은 1로, 호스트 부분은 0으로 표시됩니다.
    2. 네트워크 요구 사항 결정하기
      • 네트워크에서 필요한 호스트 수를 결정합니다. 예를 들어, 50개의 호스트가 필요하다면 서브넷 마스크를 계산해야 합니다.
    3. 필요한 비트 수 계산하기
      • 필요한 호스트 수에 따라 2의 거듭제곱을 사용하여 필요한 비트 수를 계산합니다.
      • 예: 50개의 호스트가 필요하다면, (2^6 = 64) (6비트)로 설정할 수 있습니다. (64는 50보다 크므로 적합)
    4. 서브넷 마스크 비트 수 결정하기
      • 전체 비트 수 32에서 필요한 호스트 비트 수를 뺍니다.
      • 예: 32 - 6 = 26. 따라서, 서브넷 마스크는 26비트가 됩니다.
    5. 서브넷 마스크 작성하기
      • 26비트의 서브넷 마스크를 작성합니다. 1로 설정된 비트는 네트워크 부분, 0으로 설정된 비트는 호스트 부분입니다.
      • 26비트 서브넷 마스크는 255.255.255.192입니다. (255.255.255.192 = 11111111.11111111.11111111.11000000)
    예시
    • IP 주소: 192.168.1.0
    • 필요한 호스트 수: 50
    • 서브넷 마스크: 255.255.255.192 (/26)