나를 기록하다
article thumbnail
반응형

모두의 네트워크

전송 계층의 역할

네트워크에서 다른 네트워크로 데이터를 전송하려면 라우터가 필요하고 라우터의 라우팅 기능을 사용하여 전송할 수 있다.

물리 계층, 데이터 링크 계층, 네트워크 계층의 3계층이 있으면 목적지에 데이터를 보낼 수 있다. 하지만 데이터가 손상되거나 유실되더라도 이들 계층에서는 아무것도 해주지 않는다. 이를 방지해주는 역할을 이번에 소개할 전송 계층에서 수행한다.

전송 계층의 두 가지 역할

목적지에 신뢰할 수 있는 데이터를 전송하는 역할 수행

  1. 오류를 점검하는 기능
    오류가 발생하면 데이터를 재전송하도록 요청
  2. 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능
    예를 들어, 홈페이지에서 사용하는 데이터인데 메일 프로그램에 전송하는 것을 방지해준다.

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

전송 계층의 특징을 간단히 설명하면 신뢰성/정확성과 효율성으로 구분할 수 있다.

 

  1. 신뢰성/정확성 - 데이터를 목적지에 문제없이 전달하는 것
    연결형 통신: 신뢰할 수 있고 정확한 데이터를 전달하는 통신 
  2. 효율성 - 데이터를 빠르고 효율적으로 전달하는 것
    비연결형 통신: 효율적으로 데이터를 전달하는 통신

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

  • 신뢰성과 정확성이 보장되지 않는 비연결형 통신이 사용되는 경우 - 동영상 시청
    • 동영상은 신뢰할 수 있고 정확한 데이터 전송보다 빠른 전송이 필요
    • 데이터가 약간 유실되더라도 원활하게 보는 것이 낫기 때문
  • 전송 계층의 연결형 통신 프로토콜에는 TCP가 사용되고, 비연결형 통신 프로토콜에는 UDP가 사용
TCP와 UDP
TCP: Transmission Control Protocol(전송 제어 프로토콜)의 약어
UDP: User Datagram Protocol(사용자 데이터그램 프로토콜)의 약어

TCP의 구조

TCP란?

  • 캡슐화: 응용 계층부터 물리 계층까지 계층별로 데이터를 전달할 때 헤더를 붙이는 것
  • 역캡슐화: 데이터 수신 측에서 물리 계층부터 응용 계층까지 계층별로 데이터를 전달할 때 헤더를 제거하는 것
  • TCP로 전송할 때 붙이는 헤더를 TCP 헤더, 이 TCP 헤더가 붙은 데이터를 세그먼트(segment)라고 한다.(캡슐화)
여기서부터 나오는 블록이 쌓인 형태의 그림들은 실제로는 가로로 정보가 길게 나열되어 있는 것이지만 지면의 한계상 쌓아둔 것이다.
아래 그림을 예시로 들면 실제로는,
출발지 포트 번호(16비트) - 목적지 포트 번호(16비트) - 일련번호(32비트) - 확인 응답 번호(32비트) - 헤더 길이(4비트) - 예약영역(6비트) - 코드 비트(6비트) - 윈도우 크기(16비트) - 체크섬(16비트) - 긴급 포인터(16비트) - 옵션 순으로 가로로 나열되어 있다.

TCP 헤더

TCP는 연결형 통신에 사용되는 프로토콜이다. 연결형 통신은 꼼꼼하게 상대방을 확인하면서 데이터를 전송하는데 그 전에 연결(Connection)이라는 가상의 독점 통신로를 확보해야 한다.

연결(connection, 커넥션)
TCP 통신에서 정보를 전달하기 위해 사용되는 가상의 통신로로 연결을 확립하고 데이터를 전송한다

연결을 확인하기 위해서는 TCP 헤더의 코드 비트를 확인해야 한다. 코드 비트에는 연결의 제어 정보가 기록된다. 코드 비트는 각 비트별로 역할이 있는데 초깃값은 0이고 비트가 활성화되면 1이 된다. 연결을 확립하려면 이 중 SYN(연결 요청)ACK(확인 응답)가 필요하다.

TCP 헤더와 코드 비트


3-way 핸드셰이크란?(3-way handshake)

연결(connection)은 SYN과 ACK를 사용하여 확립할 수 있다.

신뢰할 수 있는 연결을 하려면 데이터를 전송하기 전에 다음 그림처럼 세 번 확인한다.

SYN과 ACK를 사용한 연결 확립

  1. 통신을 하려면 컴퓨터 2에게 허가를 받아야 하므로, 먼저 컴퓨터 1에서 컴퓨터 2로 연결 확립 허가를 받기 위한 요청(SYN)을 보낸다.
  2. 컴퓨터 2는 컴퓨터 1이 보낸 요청을 받은 후에 허가한다는 응답을 회신하기 위해 연결 확립 응답(ACK)을 보낸다.
    동시에 컴퓨터 2도 컴퓨터 1에게 데이터 전송 허가를 받기 위해 연결 확립 요청(SYN)을 보낸다.
  3. 컴퓨터 2의 요청을 받은 컴퓨터 1은 컴퓨터 2로 허가한다는 응답으로 연결 확립 응답(ACK)을 보낸다.

이처럼 데이터를 보내기 전에 연결을 확립하기 위해 패킷 요청을 세 번 교환하는 것을 3-way 핸드셰이크(3-way handshake)라고 한다.

핸드셰이크(handshake)
사람들이 상대방을 확인하고 악수하는 것처럼 데이터 통신에서도 확실하게 데이터가 전송되었는지 확인하면서 이루어지는 통신 수단

 

연결을 끊을 때는 FIN(연결 종료)ACK를 사용한다.

연결을 종료하기 위해 패킷 요청을 네 번 교환하는 것을 4-way-핸드 셰이크라고 한다.

FIN과 ACK를 사용한 연결 종료

  1. 컴퓨터 1에서 컴퓨터 2로 연결 종료 요청(FIN)을 보낸다.
  2. 컴퓨터 2에서 컴퓨터 1로 연결 종료 응답(ACK)을 반환한다.
  3. 컴퓨터 2에서도 컴퓨터 1로 연결 종료 요청(FIN)을 보낸다.
  4. 컴퓨터 1에서 컴퓨터 2로 연결 종료 응답(ACK)을 반환한다.
연결을 확립할 때는 SYN, 연결을 종료할 때는 FIN을 사용한다.

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

3-way 핸드셰이크가 끝나고 실제 데이터를 보내거나 상대방이 받을 때 아래 그림과 같이 TCP 헤더의 일련번호(sequence number)확인 응답 번호(acknowledgement number)를 사용한다.

TCP 헤더의 일련번호와 확인 응답 번호

  • 일련번호란?
    TCP는 데이터를 분할해서 보내는데 일련번호는 송신 측에서 수신 측에 이 데이터가 몇 번째 데이터인지 알려 주는 역할을 한다.
    전송된 데이터에 일련번호를 부여하면 수신자는 원래 데이터의 몇 번째 데이터를 받았는지 알 수 있다.
    일련번호는 '순서', '연속된 번호'라는 뜻이 있다.

  • 확인 응답 번호란?
    수신 측이 몇 번째 데이터를 수신했는지 송신 측에 알려주는 역할을 한다.
    이 번호는 다음 번호의 데이터를 요청하는 데도 사용된다.
    예를 들얼 10번 데이터를 수신하면 11번 데이터를 송신 측에 요청한다. 이 과정을 확인 응답이라고 한다.

아래 그림과 같이 일련번호 '3001'번은 지금 보내는 200바이트 데이터의 첫 번째 바이트의 번호고, 확인 응답 번호는 다음에 보냈으면 하는 데이터의 첫 번째 바이트 번호가 된다.

일련번호와 확인 응답 번호

그림의 데이터를 전송하기 전 단계에서 3-way 핸드셰이크로 연결 수립이 이루어질 때, 이번 통신에 사용하는 일련번호인 '3001'번과 확인 응답 번호인 '4001'번이 결정된다.

  1. 컴퓨터 1은 컴퓨터 2로 200바이트의 데이터를 전송
  2. 컴퓨터 2는 200바이트를 수신하고 다음에 수신하고자 하는 데이터 번호를 확인 응답 번호에 넣는다.
    다음에 수신하고자 하는 데이터는 3001 + 200 = 3201이므로 3201번부터 보내 달라고 요청한다.
  3. 컴퓨터 1은 컴퓨터 2로 3201번부터 200바이트의 데이터를 전송한다.
  4. 컴퓨터 2는 200바이트를 수신하고 다음에 수신하고자 하는 데이터의 번호를 확인 응답 번호에 넣는다.
    다음에 수신하고자 하는 데이터는 3201 + 200 = 3401번부터 보내 달라고 요청한다.

위 과정을 데이터 전송이 완료될 때까지 반복한다. 데이터가 항상 올바르게 전달되는 것은 아니므로 일련번호와 확인 응답 번호를 사용해서 데이터가 손상되거나 유실된 경우에 데이터를 재전송하게 되어 있는데, 잉것을 재전송 제어라고 한다.


윈도우 크기란?

이전에 설명한 것은 세그먼트(데이터) 하나를 보낼 때마다 확인 응답을 한 번 반환하는 통신이라서 비효율적이다. 매번 확인 응답을 기다리는 대신 세그먼트를 연속해서 보내고 난 다음에 확인 응답을 반환하면 효율이 높아진다.

 

수신 측에서 받은 세그먼트를 일시적으로 보관하는 장소를 버퍼(buffer)라고 한다. 이 버퍼 덕분에 세그먼트를 연속해서 보내도 수신 측은 대응할 수 있고 확인 응답의 효율도 높아진다. 하지만, 수신 측은 대량으로 데이터가 전송되면 세그먼트를 보관하지 못하고 넘쳐 버리는데 이것을 오버플로우(overflow)라고 한다.

 

오버플로우가 발생하지 않도록 버퍼의 한계 크기를 알고 있어야 한다. 그것이 TCP 헤더의 윈도우 크기(window size) 값에 해당한다.

윈도우 크기는 얼마나 많은 용량의 데이터를 저장해 둘 수 있는지를 나타낸다. 즉, 확인 응답을 일일이 하지 않고 연속해서 송수신할 수 있는 데이터 크기를 말한다.

TCP 헤더의 윈도우 크기

송수신측은 서로의 윈도우 크기를 어떻게 확인할 수 있을까? 바로 3-way 핸드셰이크를 하는 동안 서로의 윈도우 크기를 확인한다.

윈도우 크기 확인

컴퓨터 2는 컴퓨터 1의 윈도우 크기가 3000이라는 것을 알게 되고 컴퓨터 1은 컴퓨터 2의 윈도우 크기가 2000이라는 것을 알게 된다.

이제 상대방 버퍼의 한계 값을 알았으니 세그먼트(데이터)를 오버플로우되지 않도록 보내면 된다.

확인 응답에 의한 세그먼트 송신 / 확인 응답을 하지 않는 세그먼트 송신

오른쪽과 같은 방식으로 수신 측이 윈도우 크기를 가지고 있다면 확인 응답을 받지 않고도 세그먼트(데이터)를 연속적으로 전송할 수 있다.


포트 번호의 구조

포트 번호란?

전송 계층은 전송된 데이터의 목적지가 어떤 애플리케이션(웹 브라우저나 메일 프로그램 등)인지 구분하는 역할을 한다. 목적지가 어떤 애플리케이션인지 구분하지 못하면 사용자가 홈페이지를 보기 위해 웹 브라우저를 사용하는 데도 메일 프로그램으로 데이터가 전송될 수 있다. 즉, 어느 애플리케이션의 데이터인지 알 수 없기 때문에 일어나는 일이다.

 

이를 방지하고자 TCP 헤더의 출발지 포트 번호(source port number)목적지 포트 번호(destination port number)가 필요하다.

TCP 헤더의 출발지 포트 번호와 목적지 포트 번호

TCP 헤더에 포트 번호가 있기 때문에 애플리케이션을 구분할 수 있게 된다. 포트 번호를 사용해서 웹 브라우저인지 메일 프로그램인지 구분하는 것이다. 포트 번호는 0 ~ 65535번을 사용할 수 있는데 0 ~ 1023번 포트는 주요 프로토콜이 사용하도록 예약되어 있으며 잘 알려진 포트(well-known ports)라고 한다. 일반적으로 사용하는 서버 측 애플리케이션에서 사용된다. 1024번은 예약되어 있지만 사용되지는 않는 포트고, 1025번 이상은 랜덤 포트라고 해서 클라이언트 측의 송신 포트로 사용된다.

애플리케이션과 포트번호

이처럼 동작하는 애플리케이션은 각각 포트 번호가 있어서 다른 애플리케이션과 서로 구분된다. 데이터를 전송할 때는 상대방의 IP 주소가 필요하지만, 어떤 애플리케이션이 사용되고 있는지 구분하려면 TCP는 포트 번호가 필요하다. 포트 번호는 창구와 같은 존재로, 포트 번호를 붙이지 않고 통신하면 컴퓨터에 데이터가 도착하더라도 애플리케이션까지는 도착할 수 없다.

TCP는 포트 번호로 애플리케이션을 확인한다

위 그림과 같이 포트 번호를 붙여서 통신하면 확실하게 원하는 애플리케이션까지 데이터를 보낼 수 있다. 컴퓨터 1의 웹 브라우저로 1025번 포트 번호가 할당되는 이유는 웹 브라우저로 접속할 때 웹 브라우저에는 임의의 포트가 자동으로 할당되기 때문에 서버 측에서는 포트 번호를 정해둬야 하지만 클라이언트 측은 정하지 않아도 된다.


UDP의 구조

UDP란?

TCP와 다르게 비연결형 통신으로 데이터를 전송할 때 시간이 걸리는 확인 작업을 일일이 하지 않는다.

또한, 신뢰성과 정확성을 요구하는 TCP와 달리 효율성을 중요하게 여기는 프로토콜이다.

 

장점은 데이터를 효율적으로 빠르게 보내는 것이라서 스트리밍 방식으로 전송하는 동영상 서비스와 같은 곳에서 사용된다.

동영상을 TCP 데이터 통신으로 전송하면 수신을 확인하는 데 시간이 너무 오래 걸려 동영상을 원활하게 볼 수 없다.


UDP 헤더란?

TCP에서는 TCP 헤더가 붙은 데이터를 세그먼트라고 했다.

UDP에서는 UDP 헤더가 붙은 데이터를 UDP 데이터그램이라고 한다.

UDP 헤더

UDP 헤더에는 올바른 목적지의 애플리케이션으로 데이터를 전송하기 위해 필요한 정보가 기록되어 있다.

또한 UDP를 사용하면 랜에 있는 컴퓨터나 네트워크 장비에 데이터를 일괄로 보낼 수 있는데 이것을 브로드캐스트(broadcast)라고 한다.

TCP는 3-way 핸드셰이크와 같이 데이터를 전송할 때도 확인 응답을 하나씩 보내야 하기 때문에 브로드캐스트와 같이 불특정 다수에게 보내는 통신에 적합하지 않다. UDP에서의 브로드캐스트는 목적지에 관계없이 랜에서 일괄적으로 보내지만, TCP는 목적지를 지정하지 않으면 안되기 때문에 일괄 통신을 할 수 없다.

TCP vs UDP

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...