TCP/IP 프로토콜에서 패킷은 인터넷을 통해 데이터를 전송하는 기본 단위다. 인터넷이 데이터 패킷을 사용하는 이유와 이를 기반으로 어떻게 효율적으로 통신이 이루어지는지 간략하게 설명하겠다.
인터넷이 데이터 패킷을 사용하는 이유
인터넷에서 모든 데이터를 한 번에 보내지 않고, 작은 단위의 데이터(패킷)로 나누어 전송하는 이유는 대표적으로 세가지 이유가 있다.
- 효율성: 데이터를 작은 패킷으로 나누어 전송하면 네트워크 자원을 보다 효율적으로 사용할 수 있다. 패킷 단위로 데이터를 보내면 여러 사용자들이 동시에 네트워크를 사용할 수 있어 회선의 대역폭을 효과적으로 분배할 수 있다. 이는 서킷 스위칭에서 설명 하겠다.
- 오류 처리 용이성: 대량의 데이터를 한 번에 보내는 대신 작은 패킷으로 나누면, 패킷 중 일부가 손실되거나 손상되더라도 전체 데이터를 다시 보내지 않고 해당 패킷만 재전송할 수 있다. 이를 통해 데이터 전송의 신뢰성을 높일 수 있다.
- 혼잡 제어 및 흐름 제어: 네트워크는 부하가 걸리거나 혼잡할 수 있다. 패킷 전송 방식에서는 이러한 혼잡을 탐지하고 제어하는 메커니즘을 구현할 수 있어, 네트워크 상태에 맞게 데이터를 조정하며 전송할 수 있다.
회선 교환 방식 (Circuit Switching) vs 패킷 교환 방식 (Packet Switching)
- 회선 교환 방식: 전화 통신과 같은 방식으로, 통신을 시작하기 전에 물리적으로 고정된 경로(회선)를 설정한 후 그 경로를 통해 데이터를 전송한다. 회선은 통신이 끝날 때까지 독점적으로 사용되며, 이 방식은 대역폭을 비효율적으로 사용하는 단점이 있다. 만약 경로가 한 번 설정되면 그 경로를 사용하는 동안 다른 데이터는 전송되지 못한다. 만약 패킷을 사용하지 않고 하나의 비트 스트림으로 통신하게 된다면, 통신 끝날때 까지 다른 컴퓨터와 통신을 하지 못한다.
- 패킷 교환 방식: 데이터는 고정된 경로가 아닌 여러 경로를 통해 작은 패킷으로 나뉘어 전송된다. 각 패킷은 독립적으로 최적 경로를 찾아가며, 다른 패킷과 섞여 전송될 수 있다. 패킷 교환 방식에서는 네트워크 자원이 동적으로 공유되기 때문에 대역폭을 효율적으로 사용할 수 있습니다. TCP/IP 프로토콜은 이 패킷 교환 방식을 사용한다.
패킷 구조
TCP/IP 패킷은 크게 세 부분으로 나눌 수 있다.
헤더 | 페이로드 | 트레일러 |
---|---|---|
출발지 IP 주소(10.10.10.5) | 실제 데이터를 포함 | 목적지에 도착했음을 알리거나 오류를 체크 |
목적지 IP 주소 (10.10.10.20) | ||
포트 번호 (80) | ||
시퀀스 (100/1) |
위 표는 패킷 헤더를 쉽게 이해하기 위해 실제 패킷 헤더를 극단적으로 줄이고 필수적인 내용만 적었다.
- 헤더 (Header): 패킷의 제어 정보를 담고 있다. 소스IP 및 목적지 IP 주소, 프로토콜 정보, 패킷의 순서(시퀀스 번호), 체크섬, 플래그 등이 포함된다.
- 시퀀스 번호: TCP에서 데이터를 나눈 패킷의 순서를 관리하기 위한 번호다. 수신 측은 시퀀스 번호를 통해 패킷이 어떤 순서로 조립되어야 하는지를 파악할 수 있으며, 만약 누락된 패킷이 있다면 이를 요청할 수 있다.
- 체크섬: 전송 중 패킷이 손상되었는지 확인하기 위한 값이다. 수신자는 체크섬을 확인하여 패킷이 손상되었는지 여부를 판단한다.
- 페이로드 (Payload): 실제 데이터가 포함된 부분으로, 전송하려는 메시지나 파일이 이 부분에 실려 전송된다. 페이로드의 크기는 상황에 따라 달라질 수 있지만, 일반적으로 패킷 크기는 네트워크의 최대 전송 단위(MTU)에 따라 제한된다.(일반적으로 1500 byte보다 큰 경우 패킷으로 나눈다.)
- 트레일러 (Trailer): 주로 데이터 무결성을 확인하는 정보를 포함한다. 이 부분은 네트워크에서 사용하는 프로토콜에 따라 있을 수도, 없을 수도 있다.
최적 경로와 라우팅
인터넷에서 패킷이 전송될 때, 패킷은 고정된 경로를 따라가는 것이 아니라 라우팅 알고리즘을 통해 최적 경로를 찾아간다.
- 네트워크 혼잡 회피: 특정 경로가 혼잡할 경우, 다른 경로로 패킷을 우회시켜 전송한다. 이를 통해 네트워크 부하를 분산시킬 수 있다.
- 장애 복구: 네트워크의 일부가 고장나거나 사용할 수 없을 때, 라우터는 패킷을 대체 경로로 보내서 데이터 전송이 지속될 수 있도록 한다.
- 짧은 전송 시간: 라우팅 알고리즘은 대개 경로상의 홉(hop) 수, 대기 시간, 대역폭 등을 고려하여 패킷을 가장 빠르게 전송할 수 있는 경로를 찾는다.
추가적으로 왜 TCP/IP 프로토콜만 이러한 원리로 작동하는지 궁금한 사람이 있을 수 있다.
TCP/IP 프로토콜과 UDP/IP 프로토콜 모두 데이터를 “패킷”으로 전송한다. 두 프로토콜의 차이는 데이터 전송 방식에 있다.
- TCP(Transmission Control Protocol)는 연결 지향적 프로토콜이다. 신뢰성 있는 데이터 전송을 보장하기 위해 패킷이 손실되면 재전송하고, 데이터가 제대로 전달되었는지 확인하는 과정(예: 확인 응답, 흐름 제어)을 거친다.
- UDP(User Datagram Protocol)는 비연결 지향적 프로토콜로, 데이터를 패킷(UDP에서는 ‘데이터그램’이라고도 부름)으로 보낸다. 하지만 TCP처럼 데이터의 신뢰성을 보장하지 않는다. 패킷이 손실되거나 순서가 뒤바뀌어도 재전송하지 않으며, 확인 응답도 하지 않는다.
또한 TCP와 UDP 모두 패킷 헤더를 가지고 있지만, 두 프로토콜의 헤더 구성 요소는 다르다. 특히, 시퀀스 번호는 TCP에만 존재하며, UDP 헤더에는 시퀀스 번호가 없다.
- TCP 헤더에는 시퀀스 번호(Sequence Number) 필드가 있다. 이 필드는 패킷의 순서를 추적하기 위해 사용된다. TCP는 데이터의 신뢰성 있는 전송을 위해 각 패킷에 시퀀스 번호를 붙이고, 수신자가 패킷을 올바르게 재조립할 수 있도록 도와준다. 또한, 패킷이 손실되거나 순서가 뒤바뀌었을 때 이를 감지하여 재전송을 요청할 수 있다.
- UDP 헤더에는 시퀀스 번호가 없다. UDP는 데이터를 연결 없이 빠르게 전송하는 것을 목표로 하기 때문에 패킷이 도착하는 순서나 신뢰성을 보장하지 않는다. 따라서, 패킷이 도착하는 순서를 추적할 필요가 없어 시퀀스 번호를 사용하지 않는다. UDP는 단순하게 포트 번호, 길이, 체크섬 등의 기본 정보만을 헤더에 포함하고 있다.
여기서 또 UDP에 시퀀스 번호가 없다고 해서 체크섬이 있어서 뭐하냐고 생각하는 사람들이 간혹 있다.
UDP에서 체크섬은 데이터의 무결성 검증을 위해 존재하며, 시퀀스 번호와는 다른 목적으로 사용된다. UDP는 연결을 설정하거나 데이터의 순서를 보장하지 않기 때문에 시퀀스 번호를 포함하지 않는다. 하지만 데이터가 손상되지 않고 전달되는지 확인하는 기초적인 오류 검출 기능이 필요하다. 이때 사용하는 것이 체크섬이다.
체크섬은 비트 플립과 같은 데이터 손상을 발견한다. 기본적인 오류 검출만 수행하며, 그 이상의 오류 복구는 하지 않는다.
UDP가 체크섬을 사용하는 이유는 순서 보장 및 흐름 제어는 필요하지 않지만, 데이터의 신뢰성은 어느 정도 확보하고자 하기 때문이다. UDP는 빠르고 간단한 전송을 목표로 하지만, 데이터 손상 여부는 확인해야 하기 때문에 체크섬을 사용해 오류를 검출한다.
- 시퀀스 번호는 데이터의 순서나 중복을 관리하기 위한 것이며, 주로 연결 지향 프로토콜인 TCP에서 사용된다.
- 체크섬은 데이터를 수신할 때 손상되지 않았는지를 확인하기 위한 무결성 확인 도구다.