TCP/IP stack 데이터 전송 과정

데이터 송/수신 과정

tcp/ip stack은 application - transport - internet - link 계층으로 구성된다.

TCP/IP stack을 기준으로 데이터가 어떻게 이동하는지를 간단하게 알아보자.

상위 계층의 데이터에 각 계층별 제어 정보(헤더, 트레일러 등)를 추가하여 하위 계층의 데이터 단위(PDU)로 변환하는 과정을 캡슐화(encapsulation)이라고 한다.

  • 캡슐화의 목적은 각 계층의 프로토콜이 제 기능을 수행할 수 있도록 필요한 제어 정보를 제공하는 것이다.

출발지 application layer

application layer에서 데이터를 주고받을 때, 그림과 같은 구조로 구성한다. 이것은 application layer에서 송/수신되는 데이터 혹은 메시지라고 부른다.

  • header: 프로토콜이 동작할 수 있도록 부가적인 정보가 포함된다.

  • data (payload): 프로토콜을 통해 송/수신되는 실제 데이터이다.

애플리케이션 계층에서 만든 데이터(메시지)를 하위 계층으로 전송한다.

출발지 transport layer (Multiplexing)

transport layer는 프로세스 간 어떻게 네트워크 통신을 할 것인지를 담당하는 계층이다.

여기서도 데이터가 transport layer의 프로토콜이 동작하게 하기 위해서는 추가적인 작업이 필요하다. 그래서 transport layer만의 header를 추가해야 한다.

TCP 프로토콜에서 이러한 구조를 TCP Segment라고 부르고, UDP에서는 UDP Datagram 이라고 칭한다. 둘의 구조는 다르지만 공통적으로 헤더에 출발지/목적지 포트 번호가 존재한다.

또, transport layer에서의 payload는 application layer에서 전달된 데이터 전체(data + application layer header)를 의미한다. 이렇듯 payload는 계층별로 상대적인 개념이다.

  • TCP Segment = Message(Data) + TCP Header

여러 socket 들로 부터 데이터를 수집해서 각각 segment나 datagram으로 만든 후 internet layer로 송신하는 것을 Multiplexing 이라고 한다.

출발지 internet layer

internet layer는 호스트 간 통신을 담당하는 계층이다. 실제로 host에서 나가는 데이터를 목적지 host까지 경로를 따라 전달하는 역할을 한다. 이것을 라우팅이라고 하며, 라우팅을 통해 최적의 경로로 목적지 host까지 전달한다.

대표적으로 IP 프로토콜이 있으며, 해당 프로토콜이 정상적으로 동작하게 하기 위해서는 IP header 붙인다. 이를 IP Datagram 또는 IP Packet 이라고 부른다. 짐작할 수 있듯이, 여기서의 payload는 전송 계층에서 전달받은 데이터 전체이다.

IP header에는 출발지/목적지 ip address 정보와 전송 계층에서의 프로토콜이 TCP 인지 UDP 인지에 대한 정보가 포함된다.

  • IPv4에서는 IP header에서 전송 계층의 프로토콜 정보를 Protocol 이라고 저장하고, IPv6에서는 Next header라고 저장한다.

  • Packet(Datagram) = (TCP/UDP)Segment + IP Header

link layer는 인터넷(네트워크)를 구성하는 수없이 많은 노드 중에서, 두 노드 사이의 데이터를 주고받는 역할을 담당한다.

link layer에서도 internet layer에서 전달받은 데이터(패킷)가 link layer 프로토콜에 따라 처리되고 전송되기 위해서는 특정 정보가 필요하다. 이를 위해 headertrailer가 붙으며, 이렇게 완성된 구조를 Frame이라고 부른다.

  • Frame = IP Packet + Frame Header & Trailer

router

router에서는 link layer의 fram을 수신하여 header와 trailer의 정보를 처리하고 link layer로 올려 역캡슐화 과정을 거친 후, IP Packet을 추출한다.

추출된 IP Packet의 목적지 주소를 분석하고 라우팅 테이블을 참조하여 다음 홉을 결정한 후, 해당 인터페이스로 패킷을 전달하기 위해 새로운 프레임으로 캡슐화하여 전송한다.

  • Frame → Packet → Frame 으로 만드는 과정을 거치고 목적지로 전송한다.

목적지 host의 link layer에서 역캡슐화를 진행하여 IP Packet을 상위 계층으로 전달한다.

목적지 internet layer

목적지 IP address와 호스트 IP addess를 확인하는 과정들을 거쳐 검증하고 역캡슐화 한다.

IP Header에는 transport layer에서 어떤 프로토콜을 사용했는지에 대한 정보를 저장하고 있다.

이게 IP Header에 존재하는 이유는 transport layer에서 수신한 IP Packet을 적절하기 처리하기 위해서 필요하기 때문이다.

  • 역캡슐화된 데이터(세그먼트)를 어떤 전송 계층의 프로토콜로 처리해야 할지 판단하기 위함

  • 세그먼트로 만들 때, IP Packet에서 추출한 프로토콜, 출발/목적 IP 주소는 별도로 저장한다.

목적지 transport layer (Demultiplexing)

목적지 전송 계층에서는 수신한 데이터를 어떤 애플리케이션 프로세스에게 전달할지 결정하는 역할을 한다.

circle-info

호스트에서는 다양한 애플리케이션이 동시에 실행될 수 있다. 그럼 이 데이터가 어떤 프로세스로 가야 하는지를 어떻게 식별할까?

정확히는 프로세스와 연결된 특정 소켓으로 보내야 하는데, 소켓을 어떻게 식별할 것인지

TCP와 UDP의 소켓 식별 방법이 다르다.

  1. UDP 일 때, Socket 식별 방법

UDP는 상대적으로 간단하다. [protocol, source ip addr, dest ip add] 정보에서 protocol이 UDP인 것을 확인하고 UDP Datagram에서 목적지 port 번호를 가지고 찾아간다.

  1. TCP 일 때, Socket 식별 방법

프로토콜이 TCP인 것을 확인하고 고려해야 할 것이 2가지가 있다.

TCP Segment가 처음 커넥션을 맺기 위한 요청이라면 Listening socket으로 보내고, 이미 커넥션이 성립된 상태라면 일반 TCP Socket 중 하나로 보낸다.

이를 판단하는 기준은 TCP Segment의 Header에 값을 참조함으로써 알 수 있다.

  • header에 포함된 정보 중, syn flag 값이 1이면 port를 확인하고 listening socket으로

  • 그렇지 않다면 [출발지 ip addr, 목적지 ip addr, 출발지 port, 목적지 port] 정보를 모두 활용하여 어떤 TCP Socket으로 전송할 지 판단한다.

이렇게 Internet layer로 부터 받은 segment/datagram에 있는 payload를 적절한 socket으로 전달하는 방식을 Demulitiplexing이라고 한다. 전송 계층의 기능이다.

전송 계층에서의 처리를 마치고 역캡슐화를 진행한다. 역캡슐화 과정에서 protocol 정보는 이제 필요가 없어서 제외하고 출발지/목적지 IP 주소 정보port를 따로 저장한다.

  • [출발지 ip addr, 목적지 ip addr, 출발지 port, 목적지 port] 정보를 따로 저장함.

목적지 application layer

application layer에서는 애플리케이션에서 처리해야 하는 프로토콜 정보를 transport layer에서 전달받은 데이터(메시지) header에서 추출하여 따로 저장하고 제거한다.

  • application protocol + [출발지 ip addr, 목적지 ip addr, 출발지 port, 목적지 port] 정보를 따로 저장함.

header를 제거하고 남은 실제 데이터를 애플리케이션 비즈니스 로직으로 전달된다.

용어 주의 사항

  1. Packet

Internet layer에서 송/수신되는 데이터를 IP Packet 혹은 IP Datagram이라고 불렀다.

그냥 Packet이라고 사용하는 경우가 많은데, 이 경우에는 Internet layer에서만 동작하는 것뿐만 아니라 추상적으로 인터넷을 통해 송/수신되는 데이터의 단위를 말할 때도 사용하기도 한다.

이렇게 Packet은 layer 구분 없이 범용적으로 사용되는 경우가 많다.

  1. Datagram

전송 계층에서의 UDP Datagram 인지 인터넷 계층에서의 IP Datagram 인지 잘 구분해야 한다.

문서에서 단순히 Datagram으로 나타내는 경우가 있는데, 이렇게 사용하는 이유는 인터넷 계층에서 동작하는 IP 프로토콜이 하는 일과 전송 계층에서 UDP 프로토콜이 하는 일이 거의 차이가 없기 때문이라고 추측한다.

  1. Segment

일부 문서나 책에서는 TCP Segment, UDP Datagram 구분 없이 일괄적으로 Segment라고 부르기도 한다.

Reference: 쉬운코드 - Socket 식별arrow-up-right

Last updated