네트워크

[네트워크] TCP/IP란?

취업 드가자잇 2024. 4. 7. 14:40

 

이번글에서는 이전글에서 소개만 한 TCP/IP에 관하여 이야기해보고자 한다.

TCP/IP

TCP는 HTTP를 포함한 많은 프로토콜의 기반으로 하는 전송 계층의 프로토콜이다.

쉽게 설명하자면 TCP는 네트워크상에서 데이터를 보다 신뢰성있게 효율적으로 전송하기 위한 하나의 방법이다.

그리고 TCP/IP를 함께 부르는 이유는 TCP는 IP위에서 작동하기 때문이다.

IP

IP는 그래도 친숙한 편일것이다. IP는 특정 컴퓨터의 고유한 주소값? 정도로 알고 있는 분들이 많을 것이다.

이또한 틀린 설명은 아니다. 하지만 IP는 Internet Protocol의 준말로 단순히 각각의 컴퓨터나 장치가 서로를 식별하기 위한 고유한 주소뿐만 아니라 데이터의 전송 방식또한 포함한다.

이에 대해 좀 더 자세하게 설명해보자면 IP는 데이터를 패킷이라는 작은 단위로 분할하여 전송한다. 이 패킷에는 목적지 주소, 송신지 주소 등의 정보가 포함되어 있으며, IP는 패킷을 인터넷을 통해 목적지까지 전달하는 역할을 한다. 그리고 데이터를 받는 쪽에서는 이러한 패킷들을 다시 조립하여 원래의 데이터를 복구하는 방식이다.

종합하자면, IP는

1. 통신을 위한 주소 지정라우팅을 담당한다

2. 네트워크상에서 디바이스를 식별한다

3. 라우터를 통해 패킷을 목적지까지 전달한다

 

TCP

자, 그럼 이제 다시 TCP로 돌아와보겠다.

TCP는 IP위에서 작동한다고 했듯이 세그먼트(Segement)단위로 데이터를 전송하는 방식이다. 그리고 TCP는 각각의 패킷에 순서 번호를 부여하여 패킷을 순서대로 보내 도착했을시 받은 순서대로 조립했을때 원본 데이터로 조립되도록 한다. 또한 전송된 데이터가 제대로 보내졌는지, 누실된 패킷은 없는지 확인하고, 만약 빠지거나 손상된 패킷이 있을시 이를 재전송하여 데이터 전송의 신뢰성을 보장하는 방식이다.

 

3-Way Handshake

TCP는 높은 신뢰성을 위해 3-Way Handshake라는 절차를 필요로한다. 

3-Way Handshake는 TCP 연결을 시작할 때 사용되는 절차로, 신뢰성 있는 연결을 설정하는 데 필요하다. 이 과정은 다음과 같이 세 단계로 이루어진다:

1. SYN: 클라이언트가 서버에 연결 요청을 보낸다(SYN 패킷 전송)

2. SYN-ACK: 서버가 그 요청을 받고, 연결을 수락할 준비가 되었다는 응답을 보낸다(SYN 패킷에 대한 ACK 패킷과 새로운 SYN 패킷 전송)

3. ACK: 클라이언트가 서버의 응답을 받고, 최종적으로 연결이 성립되었음을 확인하는 ACK 패킷을 보낸다.

 

흐름제어

TCP는 데이터의 정확한 전송을 위해 흐름제어와 혼잡제어라는 방식을 사용한다. 

쉽게 설명해보자면 흐름제어와 혼잡제어 모두 네트워크라는 도로위에서 교통체증을 완화하기 위한 방법이라고 이해하면 좀 더 와닿을 것이다. 두 방식 모두 크게 보면 네트워크상에서 효율적으로 안정성있게 데이터를 주고받기 위한 방식이지만, 이 문제를 해결하기 위해 네트워크의 서로 다른 측면을 관리한다.

흐름제어는 송신자와 수신자 사이의 데이터 전송 속도를 조절하는 매커니즘이다. 예를 들어, 데이터를 송신하는 속도보다 수신사측에서 데이터를 처리하는 속도가 현저히 느리다면 데이터의 전송이 정확하게 이루어지지 않고, 지연이 발생할 것이다. 그렇기에 흐름제어라는 방식을 사용하여 송신자와 수신자 사이에서 데이터 전송 속도를 조절하여 밸런스를 잡아가는 것이라고 이해할 수 있다.

그리고 TCP에서는 흐름제어를 Stop and Wait, Sliding Window와 같은 알고리즘을 사용하여 구현한다. 

 

Stop and Wait / Sliding Window

또 정체모를 용어가 등장했다. 모든 공부가 그렇겠지만 파고들수록 끝도 없는 것 같다는 생각이 든다...

Stop and Wait 알고리즘부터 살펴보자.

Stop and Wait이름에서부터 알 수 있듯이 멈추고, 기다린다는 뜻이다.

TCP통신의 관점에서 본다면 전송한 데이터 패킷에 대하여 잘 받았다는 확인 요청을 받기 이전까지는 새로운 데이터 패킷을 전송하지 않는 다는 것을 의미한다.

그렇다면 Sliding Window는 뭘까?

결론부터 말하자면 Sliding Window는 한번에 여러 패킷을 받아 순차적으로 처리할 수 있도록 '윈도우'라는 개념을 도입한다. 여기서 윈도우란 특정 범위 내에 있는 데이터의 집합을 나타낸다. 이 윈도우는 보통 일련의 순차적인 패킷을 포함하며, 그렇기에 Sliding Window의 핵심은 '윈도우 크기'와 '윈도우 이동'을 통해 여러개의 패킷을 수용하고 처리하는 것이다. 

 

혼잡제어

이제 혼잡제어에 대해 살펴보고자 한다. 우선 여기서 혼잡이란 네트워크 내의 라우터나 링크가 처리할 수 있는 것보다 더 많은 데이터가 전송되어 발생하는 상태를 의미한다. 그러한 맥락에서 혼잡제어는 흐름제어와 달리 전송하는 데이터의 양을 조절하여 네트워크의 혼잡 상태를 완화하는 방법이다. 

이를 위해 TCP는 윈도우 크기를 조절하는 방식을 사용합니다. 예를 들어, 네트워크 혼잡이 감지되면, TCP는 데이터 전송 속도를 줄이기 위해 윈도우의 크기를 줄인다.

예를 들어, TCP에서는 AIMD, 느린 시작(Slow Start), 빠른 재전송(Fast Retransmit), 빠른 회복(Fast Recovery) 등의 알고리즘을 통해 혼잡 제어를 구현하며 혼잡상황(전송한 패킷이 제대로 도착하지 못했을때)을 감지하는 방법은 두가지이다. 

 

1. 타임아웃(전송한 패킷에 대한 ACK(확인 응답)을 예상하는 시간내에 받지 못했을 경우)

2. 3중 중복 ACK 수신

 

AIMD

AIMD방식은 패킷을 하나씩 보내며 문제없이 도착한다면 '윈도우' 크기를 1씩 증가시키며 전송하는 방식이다. 그리고 이렇게 점진적으로 증가하다 만약 혼잡이 발생했을 경우, 현재 윈도우 크기를 절반으로 줄여 네트워크 혼잡을 줄인다. 

 

Slow Start (느린 시작)

느린 시작 방식또한 패킷을 하나씩 보내면서 시작하고 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 윈도우 크기를 1씩 늘려준다. 그리고 만약 모두 문제 없이 도착한다면 윈도우 사이즈는 두배가 된다. 

패킷이 문제없이 도착한다고 했을때 전송속도는 지수 함수로 증가한다.

그리고 앞서 밝힌 타임아웃이 발생했을 경우에 TCP는 이를 네트워크 혼잡의 신호로 간주하고, 느린 시작(Slow Start) 알고리즘을 재시작한다. 이때 윈도우 크기를 1로 감소시켜 느린 시작 단계로 다시 돌아가 윈도우 크기를 지수적으로 증가시키기 시작한다.

 

Fast Retransmit / Fast Recovery

네트워크에서 일부 패킷 손실이 발생했으나, 타임아웃에 이르지는 않은 상황에서, 수신자가 동일한 ACK를 세 번 연속으로 보내오면(3중 중복 ACK 수신), 이는 중간에 있는 패킷 하나가 손실되었음을 나타낸다. 이 경우, TCP는 손상된 패킷을 즉시 재전송하는데 이를 Fast Retransmit 알고리즘이라고 부른다. 

그리고 Fast Recovery 알고리즘은 Fast Retransmit이 발생한 후에 실행됩니다. Fast Recovery 동안, 윈도우 크기를 1로 줄이는 대신 현재 윈도우 크기의 절반으로 줄이고, 여기서부터 선형적으로 윈도우 크기를 증가시킨다. 즉, 혼잡 상황이 감지되었을 때 윈도우 크기를 바로 반으로 줄이고, 이후에는 각 ACK마다 윈도우 크기를 조금씩 증가시키는 방식을 취합니다. 이는 타임아웃을 통한 혼잡 상황에서와 달리, 네트워크 혼잡을 빠르게 극복하고 데이터 전송을 재개하기 위함이다.

 

이러한 과정을 통해 TCP는 두 통신 당사자 간에 신뢰성 있는 연결을 성공적으로 수립하고, 데이터의 정확한 전송을 보장한다.

 

 

TCP 통신의 단점

TCP통신은 높은 신뢰성을 보장한다. 그리고 높은 신뢰성은 그만큼의 절차와 노력이 추가적으로 필요하다는 것을 의미한다. 그리고 이것은 TCP의 단점으로 이어진다. 더 많은 절차와 노력이 필요하다는 의미는 네트워크에서 지연이 발생할 수 있다는 의미이며, 그만큼 구현하기 더 어려울 수 있다는 것을 의미하기도 한다. 그렇기에 이러한 TCP방식을 일부 보완한 다른 통신 방식도 존재한다. 이는 UDP방식이며 다른 글에서 다뤄보겠다.