패킷(Packet)이란 네트워크에서 데이터를 주고받을 때 사용되는 데이터 조각을 뜻해요. 패킷의 원래 정의는 소포, 통이기도 한데요. 하나의 완전한 데이터를 나눠서 각 조각을 소포같이 포장한 것이 바로 네트워크에서 가리키는 패킷이죠.
인터넷을 통해서 우리가 주고받는 데이터는 모두 패킷으로 전달되고 수신돼요. 이메일을 보낼 때, 웹페이지에 접속할 때, 영상을 스트리밍할 때 모두 패킷으로 데이터가 오고 가고 있어요. 각 패킷에는 수신자가 요청한 데이터뿐만 아니라 데이터가 잘 도착하기 위해 필요한 IP 주소, 패킷의 개수, 인터넷 프로토콜 등 다양한 정보도 같이 있어요. 이런 정보가 있어야 패킷으로 나뉜 데이터를 수신자가 다시 합칠 수 있어요.
패킷은 어떻게 구성되어 있을까요? 일반적으로 패킷은 1,000에서 1,500 byte의 크기이고 아래 세 가지 요소로 이루어져 있습니다.
- 헤더(Header)에는 패킷에 대한 메타정보가 있어요. 패킷의 길이, 번호, 네트워크 프로토콜, 수신자 및 발신자의 IP 주소 등 데이터가 잘 전달되기 위해 필요한 정보가 있습니다. 사용하는 IP 버전에 따라 헤더 내용은 조금씩 바뀌고요.
- 페이로드(Payload)는 수신자가 요청한 데이터입니다. 이메일을 받는 수신자라면 이메일 본문 내용이고 이미지를 클릭한 사용자라면 이미지 데이터입니다. 페이로드는 Body라고 표현하기도 합니다.
- 트레일러(Trailer)는 패킷의 끝을 나타내기 때문에 여러 패킷의 경계를 뚜렷하게 알리는 역할을 하는데요. 트레일러는 오류 검출 역할을 하기도 합니다. 체크섬(Checksum) 또는 CRC(Cyclic Redundancy Check)와 같은 오류 검출 코드가 트레일러에 포함되어 있으면 전송 중에 데이터 손실과 같은 오류가 발생했는지 판단할 수 있어요.
"안녕하세요, 토스페이먼츠 개발자센터입니다."
라는 메일 본문 데이터를 3개의 패킷으로 나눈다고 생각해볼게요.
각 패킷의 헤더에는 발송자의 IP 주소, 수신자의 IP 주소, TCP와 같은 프로토콜 정보, 그리고 패킷 번호(1~3) 등 메타데이터가 있어요. 페이로드에는 이메일 내용이 나뉘어 포함돼요. 트레일러에는 CRC 값과 같은 오류 검출 코드가 있어요. 수신자가 패킷을 받은 다음에 CRC 값을 계산하고 트레일러에 있는 값과 같은지 확인해요. 만약에 일치하지 않는다면 수신자는 발송자에게 다시 패킷 전송을 요청해요.
근데 왜 데이터를 통째로 보내지 않고 번거롭게 나누었다가 다시 합칠까요?
먼저 데이터를 하나로 보내면 여러 문제가 일어날 수 있어요. 만약에 전송 과정에서 오류가 일어나면 전체 데이터가 손실될 위험이 있어요. 그리고 손실의 경우 전체 데이터를 다시 전송해야 되기 때문에 시간이 오래 소요되고 네트워크 자원이 낭비됩니다. 또 대용량 데이터를 전송하려면 네트워크가 혼잡해지고 네트워크를 사용하는 모든 사용자의 속도가 저하될 수 있습니다.
반면 데이터를 작은 용량의 패킷으로 나누어 발송하면 패킷을 여러 서버로 분산시킬 수 있죠. 특정 네트워크에 부담이 되지 않고 트래픽을 균일하게 분배할 수 있어요. 여러 서버를 사용하기 때문에 데이터 전송을 병렬로 처리하기도 용이합니다. 데이터 전송 시간을 줄이고 사용자에게 좋은 경험을 제공할 수 있죠. 그리고 만약에 발송 중에 특정 패킷의 데이터가 손실되어도 해당 패킷의 데이터만 재전송하면 되기 때문에 효율적이에요.