[네트워크] 전송 계층

박성재·2021년 1월 17일
1

네트워크

목록 보기
6/10
post-thumbnail

참고:
모두의 네트워크 - 미즈구치 카츠야 저

배너: godori님이 만드신 배너 메이커 활용


전송 계층의 역할

전송 계층의 두 가지 역할

OSI에서 물리 계층, 데이터 링크 계층, 네트워크 계층의 3계층이 있으면 목적지에 데이터를 보낼 수는 있지만, 데이터가 손상되거나 유실되더라도 이들 계층에서는 아무것도 해주지 않는다.

OSI에서 4번째 계층은 전송 계층은 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요하다.
이를 위해 전송 계층은 다음의 두 가지 역할을 수행한다.

오류를 점검하는 기능

  • 데이터가 제대로 도착했는지 확인하여 오류가 발생하면 데이터를 재전송하도록 요청한다

전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 기능

  • 해당 데이터가 어떤 애플리케이션에서 사용하는 데이터인지 판단해서 알맞은 프로그램에 전송한다.

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

전송 계층은 신뢰성/정확성효율성으로 구분할 수 있다.

  • 신뢰성/정확성: 데이터를 목적지에 문제없이 전달하는 것
  • 효율성: 데이터를 빠르고 효율적으로 전달하는 것

신뢰할 수 있고 정확한 데이터를 전달하는 통신: 연결형 통신,
효율적으로 데이터를 전달하는 통신을 비연결성 통신이라고 함.

연결형 통신은 상대편과 확인해 가면서 통신하는 방식이고, 비연결형 통신은 상대편을 확인하지 않고 일방적으로 데이터를 전송하는 방식이다.
ex)

  • 연결형: 1) 데이터를 보내도 되나요? 2) 네, 보내도 됩니다. 3) 보냅니다! 4) 받았습니다 5) 확인했습니다.
  • 비연결형: 1) 데이터를 보냅니다!

일반적으로 신뢰성과 정확성이 보장되지 않는 통신은 사용하고 싶지 않을 것이다. 하지만 동영상을 볼 때는 비연결형 통신을 사용한다. 동영상은 신뢰할 수 있고 정확한 데이터 전송보다 빠른 전송이 필요하기 때문이다.

두 가지 통신 모두 장단점이 있다.
신뢰할 수 있고 정확한 데이터 전송이 필요한 애플리케이션에는 연결형 통신을 사용하고, 효율적인 데이터 전송이 필요한 애플리케이션에는 비연결형 통신을 사용하면 되는 것이다.

연결형 통신 프로토콜에는 TCP(Transmission Control Protocol)이 사용되고,
비연결형 통신 프로토콜에는 UDP(User Datagram Protocol)가 사용된다.

TCP의 구조

TCP란?

캡슐화 - 응용 계층부터 물리 계층까지 계층별로 데이터를 전달할 때 헤더를 붙이는 행위
역캡슐화 - 데이터 수신 측에서 물리 계층부터 응용 계층까지 계층별로 데이터를 전달할 때 헤더를 제거하는 행위

TCP로 전송할 떄 붙이는 헤더를 TCP 헤더라고 하고, 이 TCP 헤더가 붙은 데이터를 세그먼트(segment)라고 한다.
TCP 헤더도 IP 헤더처럼 다양한 정보가 나열되어 있다.
1) 출발지 포트 번호 2) 목적지 포트 번호 3) 일련번호 4) 확인 응답 번호 5) 헤더 길이 6) 예약 영역 7) 코드 비트 8) 윈도우 크기 9) 체크섬 10) 긴급 포인터 11) 옵션

연결형 통신은 꼼꼼하게 상대방을 확인해가면서 데이터를 전송하는데, 데이터 전송 전에 해야하는 작업이 있다.
데이터를 전송하려면 먼저 연결(connection)이라는 가상의 독점 통신로를 확보해야 한다.

연결(connection, 커넥션)

  • TCP 통신에서 정보를 전달하기 위해 사용되는 가상의 통신로로 연결을 확립하고 데이터를 전송한다.

TCP 헤더에서 7) 코드 비트 부분은 TCP 헤더의 107번째 비트부터 112번째 비트까지의 6비트로 연결의 제어 정보가 기록되는 곳이다.

  • 각 비트의 이름은 순서대로 URG, ACK, PSH, RST, SYN, FIN 이다
  • 코드 비트는 각 비트별로 역할이 있는데, 초깃값은 0이고, 비트가 활성화되면 1이된다.
  • 연결을 확립하려면 이 중 SYN(씬)ACK(애크)가 필요하다
  • SYN은 연결 요청, ACK는 확인 응답을 뜻한다.

3-way 핸드셰이크란?

SYN과 ACK를 통한 연결 확립

컴퓨터 1: 송신 측, 컴퓨터 2: 수신 측

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

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

핸드셰이크

  • 사람들이 상대방을 확인하고 악수를 하는 것처럼,
    데이터 통신에서도 확실하게 데이터가 전송되었는지 확인하면서 이루어지는 통신 수단

FIN과 ACK를 이용한 연결 종료

  1. 컴퓨터 1에서 컴퓨터 2로 연결 종료 요청(FIN)을 보낸다.
    • 000001 (FIN 1로 활성화)
  2. 컴퓨터 2에서 컴퓨터 1로 연결 종료 응답(ACK)을 보낸다.
    • 010000 (ACK 1로 활성화)
  3. 컴퓨터 2에서도 컴퓨터 1로 연결 종료 요청(FIN)을 보낸다.
    • 000001 (FIN 1로 활성화)
  4. 컴퓨터 1에서 컴퓨터 2로 연결 종료 응답(ACK)을 반환한다.
    • 010000 (ACK 1로 활성화)

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

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

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

TCP는 데이터를 분할해서 보내는데, 일련번호는 송신 측에서 수신 측에 '이 데이터가 몇번째 데이터인지' 알려주는 역할을 한다.
이를 통해 수신자는 원래 데이터의 몇 번째 데이터를 받았는지 알 수 있는 것이다.

확인 응답 번호는 수신 측이 몇 번째 데이터를 수신했는지 송신 측에 알려주는 역할을 한다.
그래서 이 번호는 다음 번호의 데이터를 요청하는 데에도 사용된다.
예를 들어, 10번 데이터를 수신하면 11번 데이터를 송신 측에 요청하는 것이다. 이를 확인 응답이라고 한다.

일련 번호와 확인 응답 번호를 통한 데이터 전송

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

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

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

1~4의 과정을 데이터 전송이 완료될 때까지 반복한다.

데이터가 항상 올바르게 전달되는 것은 아니므로, 일련 번호와 확인 응답 번호를 사용해서 데이터가 손상되거나 유실된 경우에는 데이터를 재전송하게 되어 있다.

이를 재전송 제어라고 한다.
데이터를 전송하는 도중에 오류가 발생하면 일정 시간 대기한 후에 재전송한다.

윈도우 크기란?

위에서 설명한 방식은 세그먼트(데이터) 하나를 보낼 때마다 확인 응답을 한 번 반환하는 통신인데, 이와 같은 통신은 효율이 높지 않다.

하지만 매번 확인 응답을 기다리는 대신 세그먼트를 연속해서 보내고 난 다음에 확인 응답을 반환하면 효율이 높아진다.

이렇게 하면 상대방에게 세그먼트가 점점 쌓이긴 하지만, 받은 세그먼트를 일시적으로 보관하는 장소가 있기 때문에 괜찮다.

버퍼(buffer):

  • 받은 세그먼트를 일시적으로 보관하는 장소
  • 버퍼 덕분에 세그먼트를 연속해서 보내도 수신 측은 대응할 수 있고, 확인 응답의 효율도 높아진다.

하지만 수신 측이 세그먼트를 대량으로 전송받으면 이를 보관하지 못하고 넘쳐 버리게 되는 경우가 있는데, 이를 오버플로(overflow)라고 한다.

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

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

이 윈도우 크기의 초깃값은 3-way-핸드셰이크를 할 때 판단한다. 연결 확립 요청을 보내고 이에 응답하는 과정에서 윈도우 크기를 함께 보내 서로의 윈도우 크기를 확인하고 있던 것이다.

이제 상대방 버퍼의 한계 값을 알았으니 세그먼트를 오버플로되지 않도록 보내면 되는 것이다. 세그먼트를 연속적으로 전송함으로써 효율적인 데이터 전송이 가능해진다.

포트 번호의 구조

포트 번호란?

전송 계층에는 전송된 데이터의 목적지가 어떤 애플리케이션인지 구분하는 역할도 있다고 했다.
이를 위해 TCP 헤더의 1) 출발지 포트 번호(source port number)와 2) 목적지 포트 번호(desination port number)가 필요하다.

포트 번호는 0~65535번을 사용할 수 있다.

0~1023번 포트는 주요 프로토콜이 사용하도록 예약되어 있다. 이러한 포트를 잘 알려진 포트(well-known ports)라고 한다.
일반적으로 사용되는 서버 측 애플리케이션에서 사용되고 있다.

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

우리는 원룸 건물 전체를 컴퓨터에 비유할 수 있다.
이때 애플리케이션은 각 호실의 주민, 포트 번호를 각 방의 번호로 바꿔서 생각하면 이해하기 쉽다.

동작하는 애플리케이션은 각각 포트 번호가 있어서 다른 애플리케이션과 서로 구분된다. 데이터를 전송할 때는 상대방의 IP 주소가 필요하지만, 어떤 애플리케이션이 사용되고 있는지 구분하려면 TCP는 포트 번호가 필요하다.

그래서 포트 번호를 붙이지 않고 통신하면 컴퓨터에 데이터가 도착하더라도 애플리케이션까지는 도착할 수 없다.

웹 브라우저의 경우 접속할 때 임의의 포트가 자동으로 할당된다.
그래서 서버 측에서는 포트 번호를 정해 둬야 하지만 클라이언트 측은 정하지 않아도 괜찮다.

UDP의 구조

UDP란?

UDP(User Datagram Protocol)는 비연결형 통신이라서 데이터를 전송할 때 TCP처럼 시간이 걸리는 확인 작업을 일일이 하지 않는다.

UDP의 장점은 데이터를 효율적으로 빠르게 보내는 것이라서 스트리밍 방식으로 전송하는 동영상 서비스와 같은 곳에 사용된다.
동영상을 TCP 데이터 통신으로 전송하면 수신을 확인하는 데 시간이 너무 오래 걸려서 동영상을 원활하게 볼 수 없다.

UDP 헤더란?

UDP에서는 UDP 헤더가 붙은 데이터를 UDP 데이터그램이라고 한다.
올바른 목적지의 애플리케이션으로 데이터를 전송하기 위해 필요한 정보가 기록되어 있는 UDP 헤더의 구조는 다음과 같다.

  • 1) 출발지 포트 번호 2) 목적지 포트 번호 3) 길이 4) 체크섬

UDP는 효율성과 빠른 속도가 중요해서 상대방을 확인하지 않고 연속해서 데이터를 보낸다.

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

TCP는 3-way 핸드셰이크와 같이 데이터를 전송할 때도 확인 응답을 하나씩 보내야 하기 때문에 브로드캐스트와 같이 불특정 다수에게 보내는 통신에는 적합하지 않다.

UDP에서 브로드캐스트는 목적지에 관계없이 랜에서 일괄적으로 보내지만, TCP는 목적지를 지정하지 않으면 안 되기 때문에 일괄 통신을 할 수 없다.


더 알아보기

참고:
TCP 3-way handshake 란?, TCP 4-way handshake 란?,
정보통신기술용어해설 - TCP 제어 플래그, 정보통신기술용어해설 - TCP 연결 종료

TCP 제어 플래그 (Control Flags)의 의미

TCP 헤더 중 7) 코드 비트 부분은 6비트로 연결의 제어 정보가 기록된다고 했다.
이때 각 비트를 제어 플래그라고 한다. 각각의 제어 플래그의 의미에 대해 순서대로 알아보자.

해당 비트를 1로 세팅할 때 그 제어 플래그를 세운다고 표현한다.

URG (Urgent) 긴급.

  • 10) 긴급 포인터(Urgent Pointer) 필드에 값이 채워져 있음을 알림.
  • 이 플래그가 세워지면 수신자에게 다른 패킷보다 해당 패킷을 먼저 처리하도록 요청한다.
    - 송신 측 상위 계층이 긴급 데이터라고 알려주면
    • 긴급비트 URG를 1로 설정하고
    • 순서에 상관없이 먼저 송신됨
  • 긴급 데이터의 마지막 바이트 위치가 Urgent Pointer로 가리켜짐

ACK (Acknowledgment) 확인.

  • 4) 확인응답번호(Acknowledgement number) 값이 설정되어 유효하다는 것을 의미한다.
    - 1로 세팅되면 확인번호 유효함을 뜻함.
    • 0으로 세팅되면 확인번호 미포함
  • SYN 플래그를 받으면 이 플래그를 보내며, 이후 모든 세그먼트에는 항상 이 플래그가 세워져 있다. 즉, SYN 세그먼트 전송 이후(TCP 연결 시작 후) 모든 세그먼트엥는 항상 이 비트가 1로 세팅되어 있음.

PSH (Push)

  • 버퍼링된 데이터를 가능한 한 빨리 상위 계층 응용프로그램에 즉시 전달하도록 요청한다.
    - 수신 측은 버퍼가 찰 때가지 기다리지 않고, 수신 즉시 버퍼링된 데이터를 응용프로그램에 전달
  • 때론, 서버 측에서 더 이상 전송할 데이터가 없음을 나타내기도 함

RST, SYN, FIN은 TCP 연결설정 및 TCP 연결종료에 주도적으로 사용된다.

RST (Reset) [강제 연결 초기화 용도]

  • 연결이 확립(Established)된 회선에 강제로 리셋을 요청한다.
    강제 리셋: RST = 1 (RST 세그먼트 또는 RESET 세그먼트)
  • 반 개방 또는 연결 문제 등의 상황 처리를 위한 특별한 초기화용 제어 비트

SYN (Synchronize) [연결 시작, 회선 개설 용도]

  • TCP 연결을 시작하며 회선을 개설하는 용도. 연결을 요청하고 허락할 때 세워진다. 즉 3-Way Handshake를 시작하는 플래그이며 두 호스트의 첫 번째 세그먼트에만 세워진다.
  • TCP 연결설정 초기화를 위한 송수신 간에 1) 일련번호의 동기화
    - 연결 요청: SYN = 1, ACK = 0 (SYN 세그먼트)
    • 연결 허락: SYN = 1, ACK = 1 (SYN+ACK 세그먼트)
    • 연결 설정: SYN = 0, ACK = 1 (ACK 세그먼트)

FIN (Finish) [연결 해제, 회선 종결 용도]

  • 연결을 해제하며 회선을 종료한다. 송신 측에서 데이터 송신을 마친다. 이 플래그가 세워진 세그먼트를 받아 ACK 플래그를 세워 응답하면 연결이 종료된다.
    - 종결 요청: FIN = 1 (FIN 세그먼트)
    • 종결 응답: FIN = 1, ACK = 1 (FIN+ACK 세그먼트)
  • 즉, 연결을 종료하고 싶다는 뜻을 상대에게 보내는 것

4-way 핸드셰이크란? (TCP 연결 종료)

TCP 연결 확립을 할 때에 3-way 핸드셰이크를 수행한다고 하였다.
반대로, TCP 연결 종료를 할 때에는 4-way 핸드셰이크를 수행한다.

1. TCP 연결 종료

TCP는 안정적이고 연결지향적인 전송 계층용 프로토콜로서,

  • 3-way 핸드셰이크를 통해 회선을 개설한 후(Established)
  • 해당 세션에서 데이터 전송을 완료한 후
  • 보통 4번의 패킷 교환으로 회선 연결을 정상적으로 종료하게 된다.

2. TCP 연결 종료 특징

TCP 연결 종료는 양방향 2개 연결을 각 측이 독립적으로 닫게 된다.

  • 'FIN 세그먼트와 그에 대한 응답인 FIN-ACK 세그먼트' 2쌍(4개 세그먼트)으로, 즉, 4-way 핸드셰이크로 종료한다.

TCP 연결 설정보다는 복잡하다.

  • 여러 종료 상황이 있을 수 있다.
  • 한 방향 연결이 종료 되어도, 다른 방향은 계속 오픈 상태일 수 있다.

3. TCP 연결 종료 구분

정상 종료 (Normal Close)

  • 4-way 핸드셰이크에 의해 양방향 모두 종료되는 것
  • 실제로는 자주 있는 경우가 아니고 반 종료 등이 오히려 일상적임

반 종료 (Half Close)

  • 양측이 동시에 회선 종료하지 않고, 한쪽 연결이 열린채로 놔두고 종료하는 것
  • 즉, 송신은 가능하지만 수신은 불가능 혹은 수신은 가능하지만 송신을 불가능

**동시 종료 (Simultaheous Close)

  • 거의 동시에 양측에서 FIN 세그먼트를 보내는 경우

강제 종료

  • TCP Reset 요구 기능

4. TCP 연결 종료: 4-way 핸드셰이크 (정상 종료인 경우)

1) FIN 세그먼트: (클라이언트 연결 종료 요청) (능동 종료 요청 측에서 발송)

  • TCP 제어 플래그: FIN 제어 비트 = 1

2) ACK 세그먼트: (연결 종료 요청에 대한 서버 측의 응답)

  • TCP 제어 플래그: ACK 제어 비트 = 1

3) FIN+ACK 세그먼트: (서버 측의 종료 알림)

  • TCP 제어 플래그: FIN 제어 비트 = 1

4) ACK 세그먼트: (클라이언트 측의 최종 종료 알림)

  • TCP 제어 플래그: ACK 제어 비트 = 1

2개의 댓글

comment-user-thumbnail
2021년 1월 26일

와 정리 진짜 잘하셨네요 ㅎㅎ

1개의 답글