[CS] TCP/IP

giggle·2023년 8월 6일
0

TCP/IP란 데이터가 의도된 목적지에 닿을 수 있도록 보장해주는 통신 규약을 말합니다. 컴퓨터 네트워크에서 데이터를 전송하는 데 사용되는 프로토콜로 인터넷과 다양한 네트워크에서 표준적으로 사용되는 프로토콜의 집합입니다.

📌 인터넷 프로토콜 4계층

프로토콜이란?
서로다른 하드웨어와 운영체제 등이 서로 통신을 하기위해 모든 요소에 규칙이 필요합니다. 이런 규칙을 프로토콜이라고 부릅니다.


Application layer: 프로그램(브라우저)이 데이터를 처음으로 받는 곳입니다. HTTP, SMTP 등의 프로토콜을 가집니다.

Transport layer: TCP가 있는 계층입니다. 포트를 통하여 애플리케이션 계층이 TCP에게 데이터를 전송합니다. 각각의 포트에 프로토콜을 지정할 수 있습니다. 즉 사용자 간의 연결을 생성하고 데이터를 얼마나 보냈는지 얼마나 받았는지 등을 확인합니다.

Internet layer: 패킷들이 인터넷 레이어에 push됩니다. IP를 사용하여 데이터의 원천지(origin)와 목적지(destination)에 관한 정보를 첨부합니다.

Network layer: 패킷들은 네트워크 레이어로 전송됩니다. 알맞은 하드웨어로 데이터가 전달되도록 MAC 주소를 핸들링하는 것뿐 아니라, 데이터 패킷을 전기신호로 변환하여 선로를 통하여 전달할 수 있게 준비해줍니다.

📌 IP란?

IP는 컴퓨터 네트워크에서 데이터를 패킷 단위로 전송하는 프로토콜로, 데이터의 경로 선택과 패킷의 전달을 담당합니다. IP는 패킷을 주고받는 장치들 간의 주소를 정의하고, 데이터가 올바른 목적지로 전달되도록 합니다. IP 주소는 인터넷 상에서 호스트와 네트워크를 고유하게 식별하는 역할을 합니다.

하지만 IP에는 몇 가지 한계가 있습니다.
1. 먼저 클라이언트에서는 대상 서버가 패킷을 받을 수 있는 상태인지 확인할 수 없습니다. 따라서 받을 대상이 없거나 서비스가 불가능해도(연결이 되지 않은 상태) 패킷을 전송합니다(비연결성).
2. 인터넷 망 내 노드에 문제가 생기는 경우 패킷이 안전하게 도달하지 못하거나 전송 순서가 바뀔 수 있습니다(비신뢰성).
3. 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이라면 IP만으로는 이를 구분할 수 없다는 단점이 있습니다.

-> 이런 문제를 해결해주는 것이 TCP입니다.

📌 TCP란?

TCP는 많은 양의 데이터를 가져 와서 패킷으로 컴파일 한 다음 동료 TCP 계층에서 수신하도록 전송하여 패킷을 유용한 정보 / 데이터로 바꾸는 역할을 합니다. TCP는 전달받은 패킷을 재조립하고, 패킷에 손상이 있거나 손실된 패킷이 있다면 재전송을 요청하는 패킷을 전송하여 재전송 받습니다. 즉, 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 에러 없이 교환할 수 있게 합니다.

흐름제어 (Flow Control)

흐름제어는 데이터 수신자의 처리 능력을 고려하여 데이터의 흐름을 제어하는 메커니즘입니다. 수신자의 처리 속도보다 전송자의 속도가 빠를 경우, 수신자는 처리하지 못하는 데이터를 저장하게 되어 메모리가 과도하게 소비될 수 있습니다. 따라서 흐름 제어는 이러한 현상을 방지하고 효율적인 데이터 전송을 보장하기 위해 사용됩니다.

해결방안

  • Stop and Wait : 매번 전송한 패킷에 대해 확인 응답을 받아야만 그 다음 패킷을 전송하는 방법

  • Sliding Window (Go Back N ARQ) : 수신측에서 설정한 윈도우 크기만큼 송신측에서 확인응답없이 세그먼트를 전송할 수 있게 하여 데이터 흐름을 동적으로 조절하는 제어기법

    • 전송은 되었지만, acked를 받지 못한 byte의 숫자를 파악하기 위해 사용하는 protocol
    • 동작방식 : 먼저 윈도우에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도우를 옆으로 옮김으로써 그 다음 패킷들을 전송
    • Window : TCP/IP를 사용하는 모든 호스트들은 송신하기 위한 것과 수신하기 위한 2개의 Window를 가짐. 호스트들은 실제 데이터를 보내기 전에 '3 way handshaking'을 통해 수신 호스트의 receive window size에 자신의 send window size를 맞춤

혼잡제어 (Congestion Control)

혼잡 제어는 네트워크 혼잡 상태를 감지하고 조절하여 네트워크의 과부하를 방지하는 메커니즘입니다. 네트워크 혼잡이 발생하면 데이터 패킷이 유실되거나 지연되는 등의 문제가 발생할 수 있습니다. 따라서 혼잡 제어는 네트워크 혼잡을 감지하고 조절하여 전체적인 성능을 유지하는 역할을 합니다. 흐름제어가 송신측과 수신측 사이의 전송속도를 다루는데 반해, 혼잡제어는 호스트와 라우터를 포함한 보다 넓은 관점에서 전송 문제를 다루게 됩니다.

해결방안

  • AIMD(Additive Increase / Multiplicative Decrease)
    • 처음에 패킷을 하나씩 보내고 이것이 문제없이 도착하면 window 크기(단위 시간 내에 보내는 패킷의 수)를 1씩 증가시켜가며 전송하는 방법
    • 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷의 보내는 속도를 절반으로 줄인다.
    • 공평한 방식으로, 여러 호스트가 한 네트워크를 공유하고 있으면 나중에 진입하는 쪽이 처음에는 불리하지만, 시간이 흐르면 평형상태로 수렴하게 되는 특징이 있다.
    • 문제점은 초기에 네트워크의 높은 대역폭을 사용하지 못하여 오랜 시간이 걸리게 되고, 네트워크가 혼잡해지는 상황을 미리 감지하지 못한다. 즉, 네트워크가 혼잡해지고 나서야 대역폭을 줄이는 방식이다.
  • Slow Start (느린 시작)
    • AIMD 방식이 네트워크의 수용량 주변에서는 효율적으로 작동하지만, 처음에 전송 속도를 올리는데 시간이 오래 걸리는 단점이 존재했다.
    • Slow Start 방식은 AIMD와 마찬가지로 패킷을 하나씩 보내면서 시작하고, 패킷이 문제없이 도착하면 각각의 ACK 패킷마다 window size를 1씩 늘려준다. 즉, 한 주기가 지나면 window size가 2배로 된다.
    • 전송속도는 AIMD에 반해 지수 함수 꼴로 증가한다. 대신에 혼잡 현상이 발생하면 window size를 1로 떨어뜨리게 된다.
    • 처음에는 네트워크의 수용량을 예상할 수 있는 정보가 없지만, 한번 혼잡 현상이 발생하고 나면 네트워크의 수용량을 어느 정도 예상할 수 있다.
    • 그러므로 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가시킨다.
  • Fast Retransmit (빠른 재전송)
    • 빠른 재전송은 TCP의 혼잡 조절에 추가된 정책이다.
    • 패킷을 받는 쪽에서 먼저 도착해야할 패킷이 도착하지 않고 다음 패킷이 도착한 경우에도 ACK 패킷을 보내게 된다.
    • 단, 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보내게 되므로, 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 된다. 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송 해줄 수 있다.
    • 중복된 순번의 패킷을 3개 받으면 재전송을 하게 된다. 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 window size를 줄이게 된다.
  • Fast Recovery (빠른 회복)
    • 혼잡한 상태가 되면 window size를 1로 줄이지 않고 반으로 줄이고 선형증가시키는 방법이다. 이 정책까지 적용하면 혼잡 상황을 한번 겪고 나서부터는 순수한 AIMD 방식으로 동작하게 된다.

참고

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글