[CS] 네트워크 3. TCP/IP

최민길(Gale)·2023년 8월 15일
1

CS 탐구

목록 보기
12/13

안녕하세요 이번 시간에는 TCP/IP 및 TCP와 UDP에 대해 알아보는 시간을 갖도록 하겠습니다.

TCP/IP에 대해 알아보기 전에 먼저 프로토콜과 데이터 교환 방식에 대해 먼저 알아보겠습니다.

프로토콜이란 컴퓨터나 통신 장비 사이에 메시지를 주고 받는 양식 혹은 규칙의 체계입니다. 프로토콜은 형식, 의미, 타이밍으로 구성되어 있으며 형식의 경우 데이터의 구조나 형식, 의미의 경우 형식에 따라 담긴 데이터를 어떻게 해석할 것인지에 대한 정보, 타이밍의 경우 형식에 맞춘 의미를 담은 데이터가 어떤 순서로 오고 가야 하는지에 대한 정보를 의미합니다.

데이터 교환 방식의 경우 크게 회선 교환 방식과 패킷 교환 방식이 존재합니다.

회선 교환 방식은 데이터 통신을 할 사용자 간에 미리 연결을 설정하고 회선을 점유하여 데이터를 송수신하는 방식입니다. 사용자끼리 연결되어 있는 사이에는 대역폭을 온전히 연결된 사용자끼리만 사용하므로 안정적인 성능을 발휘하나 통신이 없는 사이에도 연결이 유지되기 때문에 낭비가 발생하며 다른 사용자는 해당 회선이 사용 중이 아닐 때까지 대기해야 한다는 단점이 존재합니다.

패킷 교환 방식은 데이터를 일정 크기로 분할한 패킷을 송수신하는 방식으로 여러 사용자의 패킷이 동시에 회선을 공유하여 전달할 수 있기 때문에 대역폭 이용 효율을 극대화할 수 있으며 패킷마다 우선순위를 부여하여 중요한 패킷이 먼저 도달할 수 있도록 합니다. 하지만 패킷을 생성하기 위한 헤더가 추가되기 때문에 오버헤드로 인한 성능 저하와 지연 현상이 발생할 수 있습니다.

패킷 교환 방식에는 데이터그램 방식과 가상 회선 방식이 존재합니다.

데이터그램 방식은 논리적 연결 설정 없이 패킷이 독립적으로 전송되는 방식으로 하나의 메시지에서 분할된 패킷들은 여러 라우터를 거칠 때마다 경로 설정을 수행하여 전달합니다. 각각의 패킷이 최적의 경로를 찾아 이동하기 때문에 혼잡하거나 장애가 있는 구간을 우회하여 이로 인해 더 빠른 통신이 가능하나 도착 순서가 섞일 수 있어 수신 측에서 재조합해야한다는 단점이 존재합니다.

가상 회선 방식은 논리적 연결을 먼저 설정하고 데이터를 전송하는 방식으로 경로 설정을 한 번만 수행하기 때문에 하나의 메시지에서 파생된 여러 패킷은 동일 경로를 통하여 전달되며 도착 순서가 보장됩니다. 하지만 경로 설정이 된 이후 유동적으로 장애 구간을 우회하여 진행할 수 없으므로 상대적으로 느린 통신이 진행된다는 단점이 있습니다.

TCP/IP는 근거리 통신망이나 인터넷에서 네트워크를 구현하기 위해 임의의 서브 네트워크에 접속한 장비들과 종단 호스트간의 연결과 라우팅을 제공하는 인터넷 프로토콜입니다. TCP/IP는 크게 네트워크 엑세스 계층, 인터넷 계층, 전송 계층, 응용 계층으로 구성됩니다.

응용 계층에서는 응용 프로그램 간 통신 접속을 위한 통신 프로토콜을 보유하며 전송 계층에서는 응용 계층에서 전송한 데이터를 세그먼트나 데이터그램으로 구성해 전송합니다. 인터넷 계층에서는 전송 계층에서 전달한 패킷을 서브 네트워크와 무관하게 목적지 주소까지 전달하는 역할을 맡으며 패킷이 정확히 도착하였는지 또는 손상되었는지를 확인하지 않고 상위 계층에 위임합니다. 네트워크 엑세스 계층에서는 실제 통신을 수행하는 하드웨어 인터페이스가 존재하여 실제 통신을 수행합니다.

전송 계층에는 TCP와 UDP가 존재합니다.

TCP는 연결을 먼저 설정하고 데이터를 주고 받는 연결 지향 전송 프로토콜입니다. 가상 회선 방식을 사용하여 신뢰성이 높으며 패킷의 순서가 보장되며 흐름 제어 및 혼잡 제어를 제공하지만 패킷 전송 후 ACK 패킷 수신 여부를 확인하기 때문에 속도가 느립니다.

TCP에서 연결을 설정 및 해제하는 프로세스는 다음과 같습니다.

먼저 연결 설정 프로세스는 3-way 핸드셰이크 과정을 거칩니다. 클라이언트가 서버에 접속을 요청하는 SYN 패킷을 전송합니다. 이 때 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됩니다. 이후 서버에서 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송합니다. 이 때 서버는 ACK 응답을 기다리는 SYN_RECEIVED 상태가 됩니다. 마지막으로 클라이언트가 서버에게 ACK를 전송하여 서버의 상태가 ESTABLISHED로 변경되며 통신이 시작합니다.

연결 종료 프로세스는 4-way 핸드셰이크 과정을 거칩니다. 클라이언트가 연결을 종료하겠다는 FIN flag를 전송합니다. 이후 서버는 확인메시지를 보내고 자신의 통신이 끝날 때까지 기다리는 CLOSE_WAIT 상태가 됩니다. 다음으로 서버의 통신이 종료되면 연결이 종료되었다고 클라이언트에게 FIN flag를 전송합니다. 마지막으로 클라이언트는 확인했다는 메시지를 보내며 연결이 종료됩니다. 이 때 클라이언트에서 세션을 종료시킨 후 서버에서 전송된 FIN flag보다 뒤늦게 도착하는 패킷이 있다면 데이터가 유실되기 때문에 클라이언트는 서버로부터 FIN flag를 수신하더라도 일정 시간 동안 세션을 남겨놓고 잉여 패킷을 기다리는 TIME_WAIT 상태가 됩니다.

UDP의 경우 비연결형 서비스로 데이터그램 방식으로 사용자의 데이터를 전달하는 프로토콜입니다. 데이터를 주고받을 때 데이터가 제대로 전송되었는지 확인하는 절차가 없어 신뢰성이 낮으다 UDP 헤더의 체크섬 필드를 통해 최소한의 오류만 검출하기 때문에 더 빠른 속도를 제공합니다.

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글