TCP 소켓


  • 전송 계층 프로토콜의 핵심 기능은 호스트 안에서의 프로세스 식별을 통한 데이터의 배달이라고 볼 수 있다.

  • 네트워크를 통해 배달된 데이터가 어떤 프로세스에게 배달된 것인지를 확인한 후 적절한 프로세스에게 전달하는 것이 전송 프로토콜의 메인 임무이다.

- 회사에는 우편 업무를 담당하는 직원 A가 있다.
- 우편물을 보내야하는 직원들은 직원 A에게 우편물 배달을 의뢰한다.
- 직원 A는  직원들이 이뢰한 우편물을 모아서, 우체국에 배달을 의뢰한다.
- 직원 A는 우체국으로부터 배달된 우편물을 해당 직원이 소속되어 있는 부서의 서류함에 넣는다.
  • 위의 비유에서 우편 업무 담당 직원 A가 바로 전송 계층 프로토콜에 해당한다.

  • 우체국은 네트워크 계층 프로토콜에 해당하며 직원 A에게 배달을 의뢰하는 다른 직원들은 응용 계층에 해당한다.

직원 역할은 크게 두 가지로 볼 수 있다.

  • 다른 직원의 우편물을 수거하여 우체국에 전달 -> 프로세스 데이터를 IP 계층으로 전달
  • 도착한 우편물을 각 부서의 서류함으로 분배 -> IP 계층으로부터 받은 데이터를 프로세스에게 전달
  • 우편물을 각 부서의 서류함으로 정확하게 배달하려면 우편물에 적혀있는 주소 정보를 확인해야하는데. 여기서 주소는 각 부서의 이름일 것이며 이에 해당하는 것이 포트번호이다.

  • 직원 A의 역할이 여기까지라고 볼 수 있고, TCP 통신에서는 다음과 같은 역할이 추가된다.

  1. 우편물이 목적지까지 제대로 갔는지를 확인한다.
  2. 우편물이 목적지까지 순서대로 갔는지 확인한다.
  3. 목적지 우편함이 가득 차 있어서 우편물이 반송되는 것을 방지할 것.
  4. 우체국이 너무 바쁘면 적절히 우편물의 양을 조절 할 것.
  • 이러한 작업은 혼자서 하기 힘들고 누군가의 도움이 필요하다. 바로 목적지 회사의 직원 A와 유사한 일을 수행하는 직원들이 이러한 일을 돕는다.

  • 직원 B와 협력한다면 위의 역할을 해결할 수 있다.

  1. 직원 B가 A에게 우편물을 잘 받았다는 메시지를 전달할 수 있다.
  2. 직원 A가 우편물에 번호를 부여한다면 직원 B는 메시지가 순차적으로 도착했는지를 판단할 수 있다.
  3. 직원 B가 우편함의 여유공간을 직원 A에게 알려준다면 우편함이 가득차서 우편물이 반송되는 현상을 방지할 수 있다.
  • 위의 기능들은 TCP 통신의 기능들을 비유로 설명한 것이다. TCP 통신은 다음과 같은 기능을 제공한다.
  1. 신뢰성 있는 데이터의 전달 보장
  2. 데이터의 순차적인 전달 보장
  3. 흐름제어, 및 혼잡 제어
  • 정리하자면 TCP는 호스트 안에서의 프로세스 식별을 통산 데이터의 배달이라는 전송 계층 프로토콜의 기본 기능을 지원하는 프로토콜이며 부가적으로 신뢰적이고 순차적인 데이터의 전달을 보장하며 흐름제어 / 혼잡 제어를 수행하는 전송 계층 프로토콜이라고 볼 수 있다.

TCP의 기능

  • 호스트 안에서의 프로세스 식별을 통한 데이터의 배달

  • 신뢰적이고 순차적인 데이터 전달

  • 흐름제어와 혼잡제어

TCP 헤더


  • 이전의 비유에서 직원 A와 B는 정보를 주고 받아야한다.

  • 정보를 주고 받는다는 이야기는 둘 사잉에 연결 관계가 형성되어 공유하는 정보가 있다는 의미로 해석할 수 있다.

  • 정보를 공유하는 가장 쉬운 방법은 우편물 봉투에 해당 내용을 적어보내는 것이다.

  • 계층별로 카운터 파트끼리 주고 받는 정보를 주고 받기 위해서 정보를 전송해야할 데이터의 앞에 붙여보낸다. 이를 프로토콜 헤더라고 한다.

  • Source Port, Destionation Port: TCP 세그먼트를 보내는 프로세스가 사용하는 포트번호와 TCP 세그먼트를 받는 프로세스가 사용하는 포트번호이다.

  • Sequence Number: TCP는 데이터를 바이트 스트림(바이트의 흐름)으로 처리한다. TCP 세그먼트 중 헤더 다음에 오는 데이터 부분은 바이트 스트림을 순차적으로 잘라서 구성한다.

  • Acknowledgement Number: 성공적인 데이터 전달 여부를 상대방에게 알리기 위해서 사용하는 번호이다. 다음에 전달 받을 데이터의 Sequence Number가 들어간다.

  • Header Length: 기본적인 TCP 헤더의 길이는 20 바이트이지만 가변적인 옵션이 붙을 수 있다. 이 필드는 TCP 헤더 길이를 32비트 (4바이트) 단위로 나타낸다. 헤더의 최소 길이는 20바이트이기 때문에, 이 필드의 최소 값은 5(5 * 4 = 20) 이다.

  • Reserved Filed: 미래에 기능이 추가되었을 때 사용할 수 있도록 예약 해둔 비트들이다.

  • TCP Flags: TCP 세그먼트들의 기능을 표기하기 위한 8가지의 플래그이다.

    • CWR: 혼잡 제어 관련 플래그이다.
    • ECE: 혼잡 제어 관련 플래그이다.
    • URG: 긴급 데이터의 포함 여부를 나타낸다.
    • ACK: Acknowledgement 필드의 유효성을 나타낸다.
    • PHS: 긴급한 데이터 처리를 요청한다.
    • RST: 연결을 리셋한다.
    • SYN: 연결을 시작한다.
    • FIN: 연결을 종료한다.
  • Window Size: 수신 버퍼의 크기를 알린다.

  • Tcp Checksum: 세그먼트의 데이터 무결성을 검사하기 위한 필드이다.

  • Urgent Pointer: 긴급 데이터를 가리키는 포인터이다.

TCP의 상태


연결

  • TCP는 연결 지향형 프로토콜이다. 이 말은 통신을 하는 두 호스트에서 실행중인 TCP 모듈은 연결되어 있다는 것을 뜻한다.

  • 연결이 되어 있다는 것은 TCP 모듈끼리 몇몇 수치들을 공유한다는 이야기일 뿐이니 연결이란 자체에 많은 의미를 부여할 필요는 없다.

  • 위는 TCP 상태 다이어그램이다. 맨 처음 TCP 모듈은 CLOSED 상태로 존재한다. 여기서 Passive Open(수동형 열기)를 하면 LISTEN 상태로 전이되고, Active Open(능동형 열기)를 하면 SYN_SENT 상태가 된다.

  • 수동형 열기 : TCP 연결을 위해서 대기 상태로 돌입한다.

  • 능동형 열기: TCP 연결을 위해서 연결 요청 세그먼트(SYN 세그먼트)를 전송한다.

TCP는 양방향 통신이기 때문에 양방향 모두 연결 요청이 완료되고 나서야 비로서 ESTABLISHED 상태가 된다. 두 페어가 SYN을 보내고 해당 SYN에 대한 ACK를 수신했을 떄 비로서 연결 완료 상태가 된다.

  • 이러한 연결 과정은 보통 세번의 세그먼트 교환을 통해서 이루어지기 때문에 3방향 핸드 쉐이크라고 한다.

종료

  • TCP는 연결 종료를 요청하기 위해서, FIN 세그먼트를 전송한다. SYN_RCVD, ESTABLISHED 상태에서 FIN 전송을 통해 연결 종료 요청을 할 수 있다.

  • 호스트 A가 TCP 연결을 끊기 위해서 FIN을 전송하면 호스트 B는 FIN을 기다리게 되는 FIN_WAIT_1 상태에 돌입한다. 이 상태는 FIN을 보내기만 한 상태이다.

  • FIN에 대한 ACK를 수신하게 되면 FIN_WAIT_2 상태로 이동한다. 이 상태는 내 FIN이 상대방에게 도달된 상태를 말한다. 만약 FIN_WAIT_1 상태에서 FIN+ACK를 수신하게 되면 FIN에 대한 ACK를 전송하고 TIME_WAIT 상태로 들어간다.

  • 이 상태는 상대방이 자신의 FIN을 받았다는 것을 확인한 상태이며, 상대방도 자신과의 연결을 끊기 원한다는 것까지 확인한 상태라고 볼 수 있다. 만약 FIN_WAIT_1 상태에서 FIN을 수신하게 된다면 FIN에 대한 ACK를 전송하고 CLOSING 상태로 이동한다.

  • 이 상태는 자신이 보낸 FIN에 대한 ACK는 받지 못했지만, 상대방이 보낸 FIN은 받은 상태이다. CLOSING 상태에서 자신이 보낸 FIN에 대한 ACK를 수신하면 TIME_WAIT 상태로 이동한다. 상태가 많아서 어려워 보이지만 단순하게 생각하자.

  • 연결이 끊어지는 CLOSED 상태가 되기 위해서는 양단 모두가 FIN을 수신해야하면 FIN에 대한 ACK도 수신해야 한다.

TCP 흐름 제어

  • TCP는 수신 받은 데이터를 운영체제가 제공하는 버퍼에 순서대로 채운다. 버퍼에 있는 데이터들은 해당 포트에서 대기하고 있는 응용 프로그램들이 그것을 가져갈 때 까지 유지된다.

  • 버퍼에 사용되는 메모리는 컴퓨터의 중요한 리소스 중 하나이기 때문에, 무한한 크기의 버퍼를 사용할 수는 없다. 따라서 버퍼의 크기는 유한하며 데이터가 가득 찬 경우에는 TCP는 더는 데이터를 받을 수 없다.

  • 이러한 상황을 방지하기 위해서 TCP는 상대방의 버퍼에 공간이 있을 떄만, 데이터를 전송한다. 이러한 절차와 행동 양식을 흐름제어라고 한다.

  • TCP는 흐름제어를 위해 슬라이딩 윈도우라는 개념을 사용한다. TCP 헤더를 살펴보면 윈도우라는 필드가 있는데, 이 원도우 필드의 값에 따라서 보낼 수 있는 공간의 크기가 결정된다.

  • 윈도우는 수신하는 TCP 쪽의 남은 버퍼를 의미하며, 스트림이 프로세스에 의해서 처리되어 버퍼가 빌 경우, 윈도우 버퍼가 이동하게 된다. 따라서 옆으로 이동한 윈도우에 의해서 아직 전송하지 못한 바이트 스트림에 대한 전송 공간이 발생하면 그때 전송을 시도한다.

참고 문헌


>> Home