Skip to content

Instantly share code, notes, and snippets.

@mug896
Last active August 17, 2023 19:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mug896/0bf81933ba3874a207098e23674dfb3c to your computer and use it in GitHub Desktop.
Save mug896/0bf81933ba3874a207098e23674dfb3c to your computer and use it in GitHub Desktop.

TCP/IP 에 대해 설명할때 나오는 packet, connection-oriented (연결지향), virtual-circuit (가상회선), datagram 과 같은 용어들은 사실 네트워크에서 사용되는 용어들입니다. 따라서 용어에 대한 이해를 돕기 위해서는 먼저 네트워크에 대해 알아볼 필요가 있습니다.

Packet 을 이용하는 네트워크가 나오기 전에는 직접 물리적으로 회선을 연결해 사용하는 circuit switched network 가 사용되었습니다. 물리적으로 회선이 연결되므로 User-A 가 회선을 점유해 사용중일 경우 User-B 는 사용할 수 없는 단점이 있습니다.

Packet 을 이용하는 packet switched network 은 User-A 와 User-B 가 동시에 회선을 사용하는 것이 가능합니다.

Packet switched network 을 이용하는 방식에는 두 가지가 있는데 첫 번째는 virtual circuit (가상회선) 방식입니다. 가상회선 방식은 위의 circuit switched network 에서처럼 물리적으로 회선을 연결하는 것이 아니고 네트워크를 구성하는 스위치 장비들의 routing table 을 설정해서 가상의 경로를 만드는 것입니다. 이렇게 하면 데이터를 보낼때 항상 같은 경로로만 전달이 되므로 데이터 전송 order 가 유지됩니다. 그러나 경로 중에 있는 노드들 중에 하나라도 고장이 나면 우회로 보낼 수 있는 경로가 있어도 더이상 데이터를 보낼 수 없게 됩니다.

두 번째는 datagram 입니다. datagram 은 따로 가상의 경로를 설정하지 않고 데이터를 보내는 방식인데 스위치 장비들이 그때그때 최적의 경로를 판단해서 데이터를 전달합니다. 따라서 중간에 어떤 경로에서 트래픽이 증가한다거나, 또는 노드가 고장날 경우 다른 경로로 패킷을 전달할 수가 있습니다.

가상회선을 이용하는 방식을 connection-oriented 네트워크 라고 하고 datagram 방식을 connectionless 네트워크 라고 합니다.

이제 네트워크에 대해 알아보았으니 TCP/IP 에서 사용되는 용어에 대해 알아보겠는데요. 그에 앞서 먼저 알아두어야 할것은 TCP 는 IP 프로토콜 위에 위치하고 (다시 말해서 IP 를 이용해 동작하는 프로토콜), IP 프로토콜 자체는 datagram 방식을 이용하는 connectionless 네트워크에서 동작한다는 것입니다. 따라서 TCP 에 대해 설명할때 연결지향 적이고 (connection-oriented), 가상회선 방식 (virtual-circuit) 을 이용한다 라고 해서 실제 네크워크에 가상회선이 만들어지는 것은 아니라는 것입니다.

IP 가 datagram 네트워크에서 동작하므로 전송자가 1, 2, 3, 4 패킷을 보내면 받는 쪽에서는 2, 1, 4, 3 순서로 도착할 수 있고, 이것을 TCP 가 받아서 1, 2, 3, 4 재정렬 해서 상위의 application 레이어로 보내면 application 은 실제 가상회선을 사용하는 것과 같은 효과(order)를 보게 되는 것입니다.

TCP 가 연결지향적 (connection-oriented) 이다 라는것도 실제 네크워크에 가상회선이 만들어지는 것이 아니므로 3-way handshake 을 통해 상대방이 현재 온라인 상태인 것을 확인하면 연결된 것으로 간주하는 것입니다. 그리고 매번 패킷을 보낼 때마다 acknowledgement 를 받아서 확인하므로 상위 application 레이어에서는 실제 가상회선을 사용하고 있는 것과 차이가 없게 됩니다.

UDP 에서 말하는 datagram 과 IP 에서의 datagram 은 같은 방식을 말합니다. datagram 의 특징은 message boundary 가 유지된다는 것인데 이것은 전송자가 1, 2, 3 세 번에 걸쳐 데이터를 보내면 수신 측에서도 정확히 세 번에 걸쳐서 데이터를 수신할 수 있다는 것입니다. 이에 반해 byte stream 방식을 사용하는 TCP 의 경우는 전송자가 1, 2, 3 세 번 데이터를 전송했어도 데이터가 작으면 받는 쪽에서 한번에 모두 받을 수도 있게 됩니다. 이것이 중요한 이유는 가령 나만의 프로토콜을 만든다고 할경우 보내는 데이터마다 상단에 헤더를 붙여서 보내게 되는데 이때 datagram 의 경우는 수신 측에서 정확히 세 번에 걸쳐서 데이터를 수신하고, 앞부분에서 헤더를 읽어들여 처리할 수 있지만 TCP 로는 message boundary 가 유지가 안되므로 안되겠죠. TCP 는 단순 byte stream 으로 전달되므로 application 이 직접 데이터 경계를 구분하는 작업을 해줘야 합니다 ( 예를 들어 Content-Length 헤더나 HTTP/2 에서 사용되는 binary frame 같은 개념 ). Google 에서 새로 만든 HTTP 프로토콜인 HTTP/3 은 QUIC 이라는 프로토콜을 기반으로 하는데, 이 QUIC 은 UDP 를 기반으로 합니다.

QUIC 도 TCP 와 같은 byte stream 입니다. TCP 는 IP datagram 을 이용해 stream 을 구현하는 것이고 QUIC 은 UDP datagram 을 이용해 자기가 직접 byte stream 을 구현하는 것입니다. 따라서 QUIC 에서는 TCP 를 사용하는 HTTP/2 에서 볼 수 있는 패킷 재전송으로 인한 HOL-blocking 도 없습니다. stream ID 를 구분할 수 있기 때문에 만약에 stream #2 에 해당하는 datagram 이 손실되어 재전송해야 될 경우 TCP 를 사용할 때와 달리 나머지 stream #1, stream #3 ... 데이터는 계속 전송할 수가 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment