1. L3 Packet
L3 계층에서 통신을 할 때, 사용되는 데이터 단위를 패킷(Packet)이라고 합니다. 패킷은 크게 헤더와 페이로드 부분으로 나뉘며, 헤더에는 대표적으로 패킷을 보내는 호스트의 IP 주소와 패킷을 받는 호스트의 IP 주소가 들어있습니다. 패킷의 최대 크기(MTU)는 약 1500Byte입니다.
2. Encapsulation VS Decapsulation
2.1. Encapsulation
Encapsulation(캡슐화)은 송신 측에서 수신 측으로 데이터를 전송하기 위해 데이터를 포장하는 과정을 의미합니다. 데이터를 포장하는 과정에서 데이터에 새로운 헤더가 추가되는데, 이때 데이터의 단위가 바뀌게 됩니다.
2.2. Decapsulation
Decapsulation(역 캡슐화)은 수신 측에서 송신 측이 보낸 캡슐화된 데이터를 받아 포장된 데이터를 뜯는 과정입니다. 포장된 데이터를 뜯는 과정에서 헤더를 제거하는데, 이때 데이터의 단위가 바뀌게 됩니다.
3. 계층별 데이터 단위
3.1. Stream
User Mode Application(L5~L7계층)에서 사용되는 데이터 단위는 Stream입니다. Stream 데이터는 시작과 끝을 명확하게 정의하기 어렵다는 특징을 가지고 있습니다.
하지만, 데이터를 네트워크로 전송하기 위해서는 데이터를 일정한 크기로 제한할 필요가 있습니다. 따라서, Stream 데이터를 네트워크로 전송하기 전 일정한 크기로 자르는 과정이 필요합니다. 이 과정을 세그멘테이션(Segmentation)이라고 합니다.
3.2. Segment
TCP 계층(L3 전송 계층)에서 사용되는 데이터 단위는 Segment입니다. Segment 데이터의 최대 크기(MSS)는 약 1460Byte입니다. 또한, Segment는 전송 계층에서 수신 측과 송신 측 사이에서 데이터를 분할하는 단위입니다.
3.3. Packet
IP 계층(L4 네트워크 계층)에서 사용되는 데이터 단위는 Packet입니다. Packet 데이터의 최대 크기(MTU)는 약 1500Byte입니다. 또한, Packet은 네트워크 계층에서 수신 측과 송신 측 사이에서 데이터를 전송하는 단위입니다.
3.4. Data Frame
데이터 링크 계층에서 사용되는 데이터 단위는 Data Frame입니다. 또한, 데이터 프레임은 물리적인 네트워크 매체에서 전송되는 데이터의 단위입니다.
4. TCP/IP 송수신 구조
4.1. TCP/IP 데이터 송신 과정 (서버 측)
- 서버 애플리케이션이 하드 디스크나 SSD카드에서 파일을 블록 단위(Stream)로 메모리에 복사
- 서버 애플리케이션이 Socket API를 호출하여, 메모리에 복사된 파일 데이터(Stream)를 소켓 버퍼에 복사
- L4 계층에서 소켓 버퍼에 들어있는 Stream을 일정한 크기로 잘게 자름(Segmentation)
- Segmentation이 완료된 Stream에 TCP Header를 붙여 Segment를 생성
- L3 계층에서 Segment에 IP Header를 붙여 Packet을 생성
- L2 계층에서 Packet에 Ethernet Header를 붙여 Data Frame을 생성
- Data Frame이 비트열로 변환되어 상대방 컴퓨터에 데이터 전송
4.2. TCP/IP 데이터 수신 과정 (클라이언트 측)
- 비트열이 클라이언트에 도착하면, L1~L2 계층에서 비트열이 데이터 프레임으로 변환
- L3 계층에서 Ethernet Header를 제거하여, 데이터 프레임을 Packet으로 변환
- L4 계층에서 IP Header를 제거하여, Packet을 Segment로 변환
- Segment에서 TCP Header를 제거하여, 남은 페이로드를 클라이언트 소켓 버퍼에 저장
- 클라이언트 애플리케이션은 Socket API를 호출하여, 소켓 버퍼에 남아있는 데이터를 메모리에 가져와 저장
클라이언트 측에서 데이터를 받은 후, TCP 계층에서는 데이터 순서의 정확성과 데이터의 완정성을 보장하기 위해 확인 응답(ACK)을 전송합니다. ACK 메시지를 전송할 때 다음에 기대되는 데이터의 순서 번호와 Window Size가 함께 전송됩니다.
서버 측은 ACK 메시지와 Window Size를 수신하여 데이터의 전송 상태 및 클라이언트 소켓 버퍼 용량을 체크합니다. ACK 메시지가 일정 시간 동안 도착하지 않는다면, 송신 측은 해당 데이터를 재전송합니다. 또한, 클라이언트 소켓 버퍼 용량이 부족하면, 다음 데이터 전송을 잠시 보류(Wait)합니다.
하지만, 서버 측이 ACK 메시지를 정상적으로 수신받고, Window Size도 여유롭다는 것을 확인하면, 서버 측은 다음 데이터를 클라이언트에게 전송합니다.
4.3. TCP/IP 데이터 송수신 과정 중 발생할 수 있는 Network 장애
4.3.1. LOSS
네트워크 상에서 데이터가 분실된 경우로, 네트워크 오류로 인해 발생하는 네트워크 장애입니다.
4.3.2. Re-Transmission
클라이언트가 서버 측으로부터 데이터를 잘 전송받아 ACK 메시지를 보내려는 순간, 서버 측에서 ACK이 빨리 오지 않아 다시 한번 중복된 데이터를 클라이언트에게 보내는 상황을 의미합니다.
이 경우, 클라이언트 측은 지속적으로 ACK 전송을 시도하고, 서버 측은 중복된 데이터를 지속적으로 클라이언트에게 보내게 됩니다. 해당 에러 상황은 네트워크 오류 또는 End-Point오류로 인해 발생하는 네트워크 장애입니다.
4.3.3. Out Of Order
데이터가 순서대로 오지 않아 생기는 네트워크 장애입니다. 해당 에러 상황이 발생하면, 클라이언트 TCP 계층에서 보정을 합니다.
4.3.4. Zero Window
클라이언트 소켓 버퍼 용량이 부족한 경우로, 네트워크 송수신 속도가 Process가 Socket I/O Buffer를 비워내는 속도보다 더 빠를 때 발생합니다. 해당 에러 사항은 클라이언트 애플리케이션 문제일 가능성이 매우 높습니다.
댓글