CS/Network

[모두의 네트워크] 6장 전송 계층 : 신뢰할 수 있는 데이터 전송하기

F12:) 2024. 1. 3. 14:10

Lesson 23. 전송 계층의 역할

   전송 계층의 두 가지 역할

전송 계층에서는 두 가지 역할을 합니다. 

  • 오류를 점검하여 재전송을 요청하는 기능
  • 전송하는 데이터의 목적지가 어떤 애플리케이션에 해당하는지 식별하는 기능

 

   연결형 통신과 비연결형 통신

전송 계층에서의 특징은 신뢰성/정확성과 효율성으로 구분할 수 있습니다.

 

연결형 통신

연결형 통신은 신뢰할 수 있고 정확한 데이터를 전달하는 통신을 의미합니다. 따라서 연결형 통신은 데이터를 주고받을 때 여러번 확인하고 보내는 과정을 거칩니다. 연결형 통신에는 TCP 프로토콜이 사용됩니다.

 

비연결형 통신

비연결형 통신은 효율적으로 빠르게 데이터를 전달하는 통신을 의미합니다. 따라서 비연결형 통신은 데이터를 주고받을 때 확인하는 과정이 없이 일방적으로 데이터를 송신하게 됩니다. 이에 비연결형 통신은 비디오 같은 속도가 중요시 되는 부분에서 사용됩니다. 비연결형 통신에는 UDP 프로토콜이 사용됩니다.

 

 


 

Lesson 24. TCP의 구조

   TCP란?

OSI 계층에서는 애플리케이션 계층을 제외한 전송 계층, 네트워크 계층, 데이터 링크 계층에서 데이터에 헤더를 붙여줍니다. 전송 계층에서 또한 헤더를 붙여주게 되는데 TCP 프로토콜을 사용한다면 붙여지는 헤더는 TCP 헤더라고 합니다. 그리고 TCP 헤더와 데이터가 붙은 단위를 세그먼트라고 부릅니다.

 

TCP 헤더에는 다음과 같은 정보들이 순차적으로 담겨집니다.

  1. 출발지 포트 번호(16비트)
  2. 목적지 포트 번호(16비트)
  3. 일련번호(32비트)
  4. 확인 응답 번호(32비트)
  5. 헤더 길이(4비트)
  6. 예약 영역(6비트)
  7. 코드 비트(6비트)
  8. 윈도우 크기(16비트)
  9. 체크섬(16비트)
  10. 긴급 포인터(16비트)
  11. 옵션

 

우선 데이터를 통신하기 위해서는 가장 먼저 연결이라는 가상의 독점 통신로를 확보해야합니다.

 

연결을 위해서는 TCP 헤더에서 코드비트를 이용합니다. 코드비트는 앞서 보여지는 것처럼 6비트로써 각 비트마다 특정 상태의 활성화를 의미하게 됩니다. 6비트는 URG, ACK, PSH, RST, SYN, FIN으로 이루어져있으며 연결 확립을 위해서는 SYN과 ACK를 사용합니다.

 

   3-way 핸드셰이크란?

SYN연결 요청을 의미하고 ACK확인 응답을 의미합니다.

 

컴퓨터 1과 컴퓨터 2가 연결 확립을 위해 아래의 과정을 거칩니다.

  1. 컴퓨터 1이 연결 확립을 위해 컴퓨터 2에게 연결 확립 요청(SYN)을 보냅니다.
  2. 컴퓨터 2는 연결을 허가한다는 연결 확립 응답(ACK)를 보내고, 동시에 컴퓨터 1에게도 연결 확립 요청(SYN)을 보냅니다.
  3. 컴퓨터 1은 연결 확립을 허가한다는 연결 확립 응답(ACK)를 컴퓨터 2에게 보냄으로써 연결이 맺어집니다.

이렇게 연결 확립을 위해 패킷 요청을 3번 교환하는 것을 3-way 핸드셰이크라고 합니다.

 

   4-way 핸드셰이크란?

연결을 맺을 때와 다르게 연결을 끊을 때는 총 4번의 패킷 요청을 교환합니다. 이를 4-way 핸드셰이크라고 합니다. 연결을 끊을 때는 FIN과 ACK를 사용하고 아래와 같은 방식으로 연결을 종료하게 됩니다.

 

  1. 컴퓨터 1이 컴퓨터 2에게 연결 종료 요청(FIN)을 보냅니다.
  2. 컴퓨터 2는 연결 종료 응답(ACK)을 보냅니다.
  3. 컴퓨터 2는 연결 종료 요청(FIN)을 보냅니다.
  4. 컴퓨터 1은 연결 종료 응답(ACK)을 보냅니다.

 

 

여기서 연결 확립 과정과 동일하게 3-way를 사용하지 않는 이유는 송신자에게 FIN 요청을 받았을 때, 아직 수신자가 송신자에게 보낼 데이터가 남아있을 수 있기 때문입니다. 따라서 ACK와 FIN을 나누어서 전송하므로 4-way로 진행되게 됩니다.

 


 

Lesson 25. 일련번호와 확인 응답 번호의 구조

   일련번호와 확인 응답 번호란?

이제 실제 데이터를 보내는 과정을 알아봅시다. 실제 데이터를 보내고, 데이터를 받을 때에는 TCP 헤더의 일련번호와 확인 응답 번호를 사용합니다.

 

1장에서 우리는 데이터를 패킷 단위로 쪼개어 전송한다고 배웠습니다. 따라서 하나의 데이터는 여러 패킷으로 구성되어 있을 것이며 이러한 데이터 중 전송하는 데이터가 몇 번째 데이터인지를 알려주기 위해 송신 측에서는 TCP 헤더의 일련번호를 사용합니다. 이로써 수신자는 원래 데이터에서 어느 부분에 해당하는 데이터인지를 알 수 있게 되는 것이죠.

 

또한 수신자는 몇번째 데이터를 수신하였는지 확인하여 다음 요청할 데이터를 확인 응답 번호를 통해서 보내게 됩니다.

 

 

우선 통신을 하기 전, 연결 확립 과정에서 이번 통신에서 사용하는 일련 번호와 확인 응답 번호가 결정됩니다. 이번 예에서는 일련번호가 3001번이고 확인 응답 번호가 4001번으로 결정되었다고 해봅시다.

 

송신자는 일련번호에 보내고자하는 데이터의 순서를 표기하고, 확인 응답 번호에는 해당 데이터를 잘 받았는지 확인하는 번호를 넣습니다.

수신자는 송신자에게 받은 확인 응답 번호를 일련번호에 넣고, 다음 요청할 데이터를 확인 응답 번호에 넣습니다.

 

이러한 과정으로 통신하게 되는 것입니다.

 

 

또한 해당 과정을 통해서 데이터의 손상이나 유실된 경우를 파악하여 재전송을 요청할 수 있는데, 이러한 과정을 재전송 제어라고 합니다.

 

 

   윈도우 크기란?

앞서 다룬 방식은 하나의 세그먼트를 보낼 때마다 확인 응답을 한번 반환해야 데이터 하나의 교환이 이루어졌고 이러한 방식을 계속 반복해야하는 것입니다. 이 방식은 효율이 그닥 높지 않은 것으로 보입니다. 

 

이것보다 더 효율적인 방법은 바로 여러 개의 세그먼트를 한 번에 보내고, 그에 대한 응답을 한번에 받는 방식입니다. 서로의 응답이 오기까지의 대기 시간이 짧아지기 때문에 더 효율적이겠죠.

 

이렇게 여러 개의 세그먼트가 수신자에게 도착하여도 이 데이터들을 저장할 수 있는 작은 저장공간인 버퍼라는 공간이 존재합니다.

만약 송신자가 수신자의 버퍼 크기를 알지 못하고 대량의 세그먼트들을 보내게 된다면 버퍼 오버플로우 문제가 발생하게 됩니다.

 

따라서 버퍼의 크기를 사전에 확인하고 버퍼의 크기보다 넘치지 않게 데이터를 보내는 과정이 필요하게 됩니다.

 

 

이러한 과정은 TCP의 연결 확립 과정인 3-way handshake에서 이루어집니다. 여기서는 TCP 헤더의 윈도우 크기라는 공간을 사용하게 됩니다.

 

 

해당 과정을 거침으로써 연결 확립이 이루어지면 상대방의 버퍼 사이즈를 알게 되고, 버퍼 오버플로우를 방지할 수 있게 됩니다.

 

 

이제 데이터의 통신이 조금 더 빠르게 이루어집니다. 아래와 같은 방식으로 말이죠.

 


 

Lesson 26. 포트 번호의 구조

   포트 번호란?

전송 계층에서는 두 가지 기능을 담당했었습니다. 신뢰있는 데이터를 보내는 것뿐만 아니라 해당 데이터가 수신자 컴퓨터의 어떤 애플리케이션에 도착해야하는지를 결정하는 기능을 하였습니다.

 

포트번호는 어떤 애플리케이션에 도착해야하는지를 결정하는 기능을 담당합니다.

 

포트 번호는 0 ~ 65535까지 사용할 수 있으며 0 ~ 1024번은 주요 프로토콜이 사용하도록 예약되어 있으며 이러한 포트를 well-known ports라고 합니다.

 

1024번은 예약되어 있지만 사용되지 않는 포트고, 1025번 이상은 랜덤 포트라고 부르며 클라이언트 측의 송신 포트로 사용됩니다.

 

well-known ports 중에서 서버에서 주로 사용되는 애플리케이션과 포트번호는 아래와 같습니다.

 


 

Lesson 27. UDP의 구조

   UDP란?

UDP란 비연결형 통신으로 TCP와 달리 확인 작업을 일일이 하지 않는 프로토콜입니다.

 

앞서 말했듯이 데이터를 빠르게 보내는 것이 목적이므로 동영상 서비스와 같은 스트리밍 방식으로 전송하는 곳에서 사용됩니다.

 

 

   UDP 헤더란?

UDP 프로토콜에서는 데이터에 붙여지는 헤더를 UDP 헤더라고 합니다. 또한 데이터와 UDP 헤더가 결합된 형태UDP 데이터그램이라고 합니다.

 

UDP 헤더는 아래와 같이 구성되어 있습니다.

  1. 출발지 포트 번호(16비트)
  2. 목적지 포트 번호(16비트)
  3. 길이(16비트)
  4. 체크섬(16비트)

 

TCP 헤더와 달리 UDP 헤더는 데이터를 잘 수신했는지 확인하는 과정이 없기 때문에 헤더의 구성이 간단한 것을 알 수 있습니다.

 

 

UDP 프로토콜은 랜에 있는 컴퓨터나 네트워크 장비에 데이터를 일괄적으로 보내는 브로드캐스트 기능을 수행할 수 있습니다.

 

반면 TCP는 수신자에게 데이터를 잘 수신했는지 확인하는 과정이 필요하므로 불특정 다수에게 데이터를 보내는 브로드캐스트 기능에 적합하지 않은 것입니다.