장미정원
[NETWORK] 패킷이 나에게 오기까지 본문
들어가며
네트워크에서 가장 유명하고 중요한 프로토콜 중 하나인 TCP, IP 프로토콜 통신에 대한 정리를 간단하게 해보려고 합니다. 내 컴퓨터에서 다른 컴퓨터로 데이터를 전송할 때 네트워크 상에서는 어떤 일 들이 일어나고 있는지 간단한 구조를 설명해보겠습니다.
본 내용은 널널한 개발자님의 네트워크 강의를 많이 참고하였습니다!
네트워크?
시작하기 앞서 네트워크라는 단어의 개념에 대해 정리하고 넘어가도록 하겠습니다. 네트워크는 수 많은 노드들이 그물망처럼 연결되어 서로 상호작용하는 논리적인 집합체라고 생각할 수 있습니다. 여기서 노드는 컴퓨터라고 생각하면 편합니다.
OSI 7계층과 간단한 데이터 전송
네트워크를 한 번이라도 공부 해본적이 있다면 OSI 7계층에 대해 들어봤을겁니다. 만약 내 컴퓨터에서 다른 컴퓨터로 데이터를 보내거나 데이터를 받아오는 등의 통신을 한다면 내 컴퓨터에서 보낼 데이터를 OSI 상위 계층에서 하위 계층으로 내려가면서 여러 프로토콜들에 의해 캡슐화가 되어 네트워크 상으로 보내지게 되고 이걸 수신한 컴퓨터에서 반대로 하위 계층에서 상위 계층으로 올라가면서 역캡슐화가 이루어져 데이터를 받게 됩니다.
만약 L7인 HTTP 통신을 한다면 전송할 HTTP 메시지를 만들고 하위 계층으로 내려가면서 L4 TCP 프로토콜의 데이터 단위인 세그먼트로 잘게 쪼개어지고, 세그먼트가 L3 IP 프로토콜의 단위인 패킷으로 또 캡슐화 됩니다. L2로 내려가면서 최종적으로 프레임이라는 단위로 캡슐화되어서 네트워크 상으로 보내지긴 하지만 네트워크 상에 돌아다니는 데이터의 단위는 대부분 패킷이라고 부릅니다.
TCP/IP 통신으로 패킷이 나에게 오기까지
먼저 내 컴퓨터에서 친구 집에 있는 컴퓨터에 사진 파일 하나를 전송하는 상황이라고 가정해보겠습니다.
프로세스 버퍼에 전송할 데이터 적재
먼저 컴퓨터에서 통신을 하는 주체는 정확히 말하자면 실행 중인 프로세스입니다. 전송하고자 하는 사진 파일 데이터를 프로세스 버퍼에 옮깁니다.
TCP Layer에 접근하기 위해 소켓 버퍼에 적재
TCP 계층은 커널모드 프로토콜이므로 유저모드 프로세스가 접근할 수 있도록 추상화한 인터페이스가 소켓입니다. 소켓은 일종의 File이며 Read, Write할 수 있습니다. 하지만 소켓은 네트워크에 관련된 File이므로 Send, Receive라는 용어를 사용합니다.
사진 데이터를 네트워크 상으로 전송하기 위해 프로세스 버퍼에 적재되어있는 사진 데이터를 소켓 버퍼에 적재하게 됩니다.
Layer 4 TCP 프로토콜에서 일어나는 Segementaion
소켓에서 다루는 데이터 단위는 스트림입니다. 스트림은 끝을 정할 수 없는 데이터의 흐름이라고 생각할 수 있습니다. 이렇게 소켓이 사진 데이터들이 작성되면 TCP Layer에서 Segementaion(분해)이/가 일어납니다. 소켓에 작성된 데이터들을 일정 단위로 쪼개서 TCP 헤더를 붙히게 됩니다. TCP에 대해서 자세하기 이야기하지 않았지만 순서가 있는 프로토콜이기 때문에 sequence 값과 같은 여러 meta-data를 붙혀 세그먼트라는 단위로 만들게 됩니다.
Layer 3 IP 프로토콜에서 만들어내는 패킷
TCP 프로토콜에서 만들어낸 세그먼트를 IP 프로토콜에서 받아 IP 헤더를 붙혀 패킷이라는 단위로 만들게 됩니다. IP 헤더의 정보는 출발지 IP, 목적지 IP와 같은 meta-data들이 들어갑니다.
참고로 패킷의 최대 크기는 MTU로 header와 payload를 포함하여 일반적으로 1,500 byte입니다.
Layer 2, 1를 거쳐 네트워크로 나가는 패킷
이렇게 만들어진 패킷은 Layer 2, 1를 거쳐 전기신호로 바뀌어 네트워크 세상으로 나가게 됩니다. 추가로 최종적으로 패킷은 Layer 2를 거치며 이더넷 헤더가 추가로 붙어 세그먼트라는 단위가 됩니다.
목적지에 도착한 패킷, Decapsulation
수 많은 노드들을 거쳐 목적지 호스트에 도착한 패킷입니다. 이제 패킷은 하위 Layer부터 상위 Layer까지 올라가면서 Decapsulation이 진행됩니다. 패킷을 만들었던 순서 반대로 헤더를 벗겨내 전송하고자 했던 데이터를 꺼냅니다.
이렇게 받은 사진 데이터 일부분의 조각을 다시 소켓 버퍼에 적재합니다. 그리고 해당 사진 데이터를 수신 받고자 하는 프로세스는 해당 소켓 버퍼에 적제된 데이터를 퍼올리게 됩니다.
결과적으로 수만개의 패킷을 전송하여서 사진 파일 하나를 수신하는데 성공했습니다.
네트워크 장애
네트워크는 생각보다 불안정합니다. 그렇기 때문에 장애 상황이 자주 발생하는데요. 자주 발생하는 4가지 장애 상황에 대해 간단하게 알아보겠습니다.
패킷 유실
패킷 유실(LOSS)은/는 패킷이 목적지 Host에 도달하지 못하고 유실된 상황을 의미합니다. 주로 네트워크 신호 감쇠, 혼잡 등의 이유로 목적지에 패킷이 도달하지 못할 수 있습니다. 이런 상황에서는 TCP 프로토콜의 수신 응답인 ACK로 유실된 패킷을 확인했다면 재전송 하는 등의 작업으로 해결할 수 있습니다.
데이터 중복 전송
데이터 중복 전송은 이미 수신 받은 패킷을 또 수신 받는 상황을 의미합니다. 네트워크 지연 등의 이유로 ACK의 지연된 전송 등의 이유로 송신 측에서 타임아웃 상황이라 판단하고 패킷을 중복해서 전송하는 상황이 발생할 수 있습니다. 이런 상황이 발생한다면 TCP Layer에서 패킷의 sequence 번호로 중복 패킷을 확인하고 제거합니다.
Out Of Order
Out of Order은 TCP 통신 중 패킷의 순서가 올바르지 않게 수신된 상태를 의미합니다. 네트워크의 지연 혼잡 등의 이유로 패킷이 순서대로 도착하지 않는 상황이 발생할 수 있습니다. 이런 상황에서는 TCP Layer에서 sequence 번호로 패킷의 순서를 확인하여 순서대로 패킷을 조립하게 됩니다.
Zero Window
Zero Window는 수신 측의 소켓 버퍼가 가득 찬 상황을 의미합니다. 수신을 하는 주체인 프로세스가 소켓 버퍼의 데이터를 퍼오는 속도가 소켓 퍼버에 데이터가 적재되는 속도보다 느릴때 일어납니다. TCP 헤더에 수신 측의 윈도우 사이즈를 보내 데이터를 적재할 수 없는 상황이 된다면 (Zero Window) 송신을 중단하고 수신 측에서 여유공간이 생긴다면 패킷을 보내 다시 송신을 재개합니다.
마무리 총총
TCP/IP 프로토콜의 통신 방식을 아주 간단하게 알아보았습니다. TCP의 논리적 연결을 수립하는 과정이나 네트워크 통신과 관련된 자세한 내용은 제거하고 간단하게 큰 그림을 그려보는 목적으로 글을 작성했습니다. 평소 서버를 개발해서 배포하고 네트워크 상에서 서버로부터 데이터를 주고 받는 작업이 정확히 어떻게 이루어지는지 알게 되어 재밌었고 이러한 작동 방식에 대해 자세히 알고 있어야 나중에 닥칠 큰 문제를 미연에 방지할 수도 있다고 생각합니다.
'NETWORK' 카테고리의 다른 글
HTTPS는 어떻게 동작하는거지? (0) | 2024.11.25 |
---|