TCP/IP가 보이는 그림책(이정현, 임세진, 윤재웅)
제4장 트랜스포트층
본 포스팅은 ≪TCP/IP가 보이는 그림책≫을 참고해 공부한 후 정리하였습니다.
1. 트랜스포트층의 역할
트랜스포트층은 애플리케이션층과 네트워크층의 중개 역할을 함으로써 데이터를 상대에게 전달하는 역할을 한다. 단순히 상대 컴퓨터에 전달함으로써 그 역할을 다 하는 것이 아니라, 데이터 전송에 문제가 생긴 경우에는 통신 서비스에 맞는 방법으로 대처함으로써 상대 애플리케이션층에 있는 어떤 프로토콜에 전달할지까지 책임을 지고 전달해야 하는 것까지가 트랜스포트층의 역할이다.
트랜스포트층에는 TCP와 UDP라는 두 개의 프로토콜이 있는데 TCP는 신뢰성을, UDP는 속도를 중시하는 프로토콜이다.
2. 포트
2.1 개념
목적한 애플리케이션 프로토콜에 데이터를 확실히 전송하도록 애플리케이션층에 애플리케이션 프로토콜마다 데이터의 출입구가 마련되어 있는데, 이 출입구를 포트(port)라고 한다. 일반적으로는 컴퓨터나 통신 장비에서 다른 장치와 물리적으로 접속되는 부분을 말하며, 특히 TCP/IP에서는 클라이언트 프로그램이 네트워크 상의 특정 서버 프로그램을 지정하는 방법으로 사용된다. 각 포트에는 포트 번호라는 고유 숫자가 할당되어 있다. 포트가 여러 개 있는 이유는 프로토콜을 식별할 수 있고 다른 통신 서비스를 동시에 사용할 수 있다는 장점이 있기 때문이다.
2.2 포트 번호
각 포트에 붙어 있는 포트 번호를 사용해 통신을 수행할 때 어떤 프로토콜에게 전달할 지 지정한다. 포트 번호는 0~65535번까지 있는데, 그 중에서 0~1023번까지는 통신 서비스마다 미리 예약되어 있으며, 잘 알려진 포트 번호(well-known port number)라고 한다. 다음은 주요 서비스의 잘 알려진 포트 번호를 정리한 표이다.
이 외 포트 번호는 사용자가 임의로 설정가능하나, 통신하는 컴퓨터 간에 어떤 포트 번호를 사용할지에 대한 인식 통일이 필요하다.
3. TCP
- Transmission Control Protocol
- 데이터의 안전하고 확실한 전달, 즉 신뢰성을 중요시 함
- 전송 중 발생한 데이터의 파손 또는 상대에게 전달되지 못했을 경우 재전송
- 전자메일 서비스나 WWW 서비스 등에 사용
3.1 통신 과정
- 커넥션형 통신 : 데이터의 송신의 확실성을 높이기 위해 수신측과 일대일 통신
3.1.1 커넥션형 통신 단계
- 전송측
데이터 분할 시, 트랜스포트층에서 취급하는 데이터의 단위를 세그먼트(segment)라고 한다.
- 수신측
TCP 헤더에는 데이터의 순서를 가리키는 번호, 포트 번호, 데이터가 무사한지 확인하기 위한 값 등이 기재되어 있다.
필자는 수신측 내용을 공부할 때, 책의 설명대로 TCP 헤더 정보를 보고 데이터를 순서대로 맞춘 후에 TCP 헤더를 가지고 데이터를 다시 맞춘다는 것이 잘 이해가 가지 않았다. 그래서 고민을 했다. 팀원들과도 상의해 보았지만, 명쾌한 해답을 얻지 못했다. 현재까지 상의해서 도출한 결과는 아래의 그림과 같다. TCP는 데이터의 확실한 전달을 위해 이후(3.4 수송신 흐름)에 다시 설명하겠지만 미리 언급하자면, 수신측에서 시퀀스 번호를 확인해 순서대로 나열한다. 수신측에서 나열해 쌓아놓은 데이터들을 애플리케이션층에 전달하기 위해 TCP 헤더의 정보를 보고 데이터를 순서대로 정렬한 후, TCP 헤더를 제거하며 순서에 맞게 데이터를 조립한다. 이 부분에 대해서 더 공부해서 확실하게 알게 되면 추후 업데이트 할 예정이다. 혹시 알고 계시는 분이 있다면 설명 부탁드리며 넘어가겠다.
3.2 컨트롤 플래그
- 확실한 송수신을 위해 통신 상대에게 통신 상태를 전하는 수단으로 사용
- TCP 헤더에 있는 6 bit의 정보
- 상대에게 전하고 싶은 항목은 1, 그 이외는 0
플래그가 설정되었다 = 1이 들어간 상태
3.3 3-way 핸드셰이크
- 핸드셰이크(handshake) : 통신 세계에서 일반적으로 상대와 서로 확인해 가면서 주고받는 것
- 3-way 핸드셰이크
3.3.1 데이터량의 확인
실제로 통신을 시작하기 전 양쪽 모두 다룰 수 있는 데이터량(세그먼트 사이즈, 윈도 사이즈)을 확인하고 수치가 작은 쪽으로 사이즈를 맞춘다.
- 세그먼트 사이즈(segment size) : 트랜스포트층에서 취급하는 데이터의 단위의 크기
- 윈도 사이즈(window size) : 한 번에 받을 수 있는 양
예를 들어,
Computer 1 : 세그먼트 사이즈는 150Byte, 윈도 사이즈는 32KB
Computer 2 : 세그먼트 사이즈는 128Byte, 윈도 사이즈는 64KB
∴ 세그먼트 사이즈는 128Byte, 윈도 사이즈는 32KB
3.3.2 통신 해제
3.4 수송신 흐름
데이터가 무사히 전달되었는지 서로 하나씩 확인하는 것도 TCP의 특징이므로, 헤더를 확실히 받기 위해 시퀀스 번호를 사용해 송수신을 수행한다. 이 과정은 세그먼트가 없어질 때까지 계속 반복되는데, 효율은 다소 떨어질지라도 확실하게 데이터를 전달한다.
시퀀스 번호 : TCP 헤더에 적혀 있는 데이터의 순서를 나타내는 번호
위 그림에서는 세그먼트를 하나씩 보냈지만, 사실 몇 개씩 모아서 보내는 것이 효율적이다. 통신을 시작할 때 정한 윈도 사이즈까지는 확인 응답을 기다리지 않고 모아서 보낼 수 있다. 송신측에서 보낸 세그먼트에 대해 수신측은 각각 확인 응답을 한다.
3.4.1 윈도 사이즈의 변경
통신을 시작할 때는 ‘이 정도 윈도 사이즈면 괜찮겠다’고 생각했는데, 막상 통신을 하다보니 사이즈가 부족하거나 남는 경우가 발생할 수 있다. 그래도 걱정할 필요가 없다. 윈도 사이즈는 통신 도중에 변경이 가능하다. 그래서 네트워크가 비어 있을 경우에는 사이즈를 크게, 혼잡할 때는 작게 하는 등 상황에 따라 조절이 가능하다.
이를 통해 TCP는 약속에 대해 세세한 처리가 가능함을 알 수 있다.
3.4.2 수신측의 처리
TCP 헤더에 기재된 포트 번호를 보고 지정된 애플리케이션 프로토콜에 데이터를 전달한다. 데이터를 전달할 때는 세그먼트의 묶음 상태에 따라 절차가 다음과 같이 분류된다.
- 하나의 세그먼트로 묶인 경우 : 헤더를 제거 후 전달
- 두 개 이상으로 분할된 경우 : 헤더에 적힌 시퀀스 번호를 보고 세그먼트를 조립한 후 전달
조립한 데이터를 지정된 애플리케이션 프로토콜에 전달하면 TCP의 임무는 끝이 난다.
- TCP 헤더
TCP 헤더의 작성 순서는 다음과 같으며 색이 진한 부분은 수신측이 작성하는 부분이다.
3.5 문제 발생 시 처리
TCP는 데이터의 정확한 전달을 중요시 하는 프로토콜이므로 송수신 중 문제가 발생할 경우, 세그먼트를 재전송한다라는 약속이 있다. 따라서 송신측은 일정 시간을 기다려도 확인 응답이 없다면 이유와 상관없이 세그먼트를 재전송한다. 확인 응답이 없는 경우는 다음의 3가지 상황이 있다.
3.5.1 세그먼트의 지연 및 분실
송신 도중 세그먼트가 행방불명이 되면 세그먼트를 전달 받지 못한 수신측은 확인 응답을 보낼 수 없다.
3.5.2 확인 응답의 지연 및 분실
세그먼트는 정상적으로 도착했지만 확인 응답 자체가 네트워크 상에서 행방불명이 되는 경우도 발생할 수 있다. 이 경우, 송신측에서 재전송을 해 수신측에서 중복된 세그먼트가 확인되면 하나를 남기고 파기한다.
3.5.3 데이터의 파손
헤더에 있는 체크섬(checksum)이라는 값을 사용해 데이터의 데이터가 깨졌는지 확인 후 깨졌으면 수신측에서는 그 데이터를 파기 후 확인 응답은 보내지 않는다.
일정 횟수 이상 재전송해도 확인 응답이 오지 않는다면 송신측이 TCP 헤더의 컨트롤 플래그 ‘RST’를 1로 만들어 강제적으로 통신을 해제한다. 이를 통해 재전송 횟수는 무제한이 아님을 알 수 있다.
4. UDP
데이터의 정확한 전달을 중요시하는 TCP와 달리 UDP는 통신 속도를 중시한다.
4.1 비커넥션형 통신
사전 의논 없이 일방적으로 데이터 전송한다.
- 커넥션형 통신과 달리 송신측에서는 수신측이 받을 수 있는 상태인지 조사하지 않고 그냥 전송하며, 무슨 일이 있어도 재전송하지 않는다.
- 수신측에서는 정상적으로 데이터를 받아도 확인 응답을 보내지 않고, 만약 데이터가 파손되어 있다면 그냥 파기한다.
4.2 동시 전송
여러 상대에게 동시에 데이터 전송이 가능하다.
- 멀티캐스트(multicast) : 복수의 특정인에게 전송
- 브로드캐스트(broadcast) : 불특정 다수에게 전송
TCP로는 불가하다.
4.3 역할 및 사용
- 데이터 파손 여부 확인 후, 깨졌다면 파기
- UDP 헤더를 제거한 후 지정된 애플리케이션 프로토콜에 전달
- UDP 헤더
- 실시간성이 중시되는 통신이나 데이터가 작은 네트워크 관리의 통신 등에서 사용
5. netstat 명령
netstat는 통신에 관한 정보를 표시하는 명령으로 PC 접속 상태를 살펴볼 수 있다.
명령 프롬포트와 같은 CUI 환경에서 netstat
라고 입력하고 ENTER
키를 누르면 현재 설정된 통신 정보가 표시된다.
CUI(Character User Interface) : 표시 내용이나 입력 내용이 문자 베이스인 사용자 인터페이스
필자는 Cmder을 예로 들어 소개하겠다.
결과
Proto로 시작하는 줄은 항목명을 나타내며 각 항목이 나타내는 것은 다음과 같다.
- Proto : 사용되고 있는 프로토콜
- Local Address : 자신의 컴퓨터의 IP/호스트명과 포트 번호
- Foreign Address : 상대의 IP/호스트명/도메인과 포트 번호
- State : 통신 상태
그 다음 줄부터는 통신 상태의 결과를 나타낸다. 필자는 Windows 환경에서 실습했으며, OS에 따라 표시되는 항목이 다를 수 있다.
모든 정보를 표시한다
netstat
만 사용하면 원래 통신 연결을 수행하지 않는 UDP 정보는 보이지 않으므로 모든 정보를 보기 위해서는 netstat
다음에 -a
라고 입력한다(Linux, UNIX도 동일). 필자의 컴퓨터 통신 정보가 너무 길어 약간의 편집을 거쳤다. 대략적으로 이렇게 나타난다는 것 정도는 살펴볼 수 있다.
명령 다음에 쓰는 문자를 옵션(option)이라고 한다.
위의 경우에서
-a
는 옵션이다.
netstat 기본 옵션
netstat 상태값
6. 마치며
이번 장에서는 트랜스포트층에 대해 알아보았다. 필자가 TCP/IP에 대한 개요 부분을 정리했던 터라 공부하고 정리하면서 연결지을 수 있는 부분이 종종 있어 한결 받아들이기 쉬웠다. 또한 마지막 netstat
명령은 현재 사용하고 있는 노트북으로 따라해보았다. 간단하지만 직접 명령어와 옵션을 실행해보는 것이 재밌게 느껴졌다. 가끔 이론만 공부하는 것이 지루할 때는 실습하면서 흥미를 얻는 방법이 효과적임을 체감했다. 다음 장에서는 네트워크층에 대해서 알아보겠다.