SDU(Service Data Unit, 서비스 데이터 단위)

SDU(Service Data Unit) 는 ISO/IEC 7498-1 에 정의된 OSI 참조 모델의 핵심 개념으로, 계층화된 네트워크 아키텍처에서 인접 계층 간 서비스 전달의 기본 단위를 나타낸다. 각 계층 (N-layer) 은 상위 계층 (N+1) 으로부터 N-SDU 를 받아 자신의 프로토콜 제어 정보 (PCI) 를 추가하여 N-PDU 를 생성하고, 이를 하위 계층 (N-1) 에 N-1-SDU 로 전달한다.

SDU 의 핵심은 계층 간 서비스 인터페이스의 명확한 분리다. 각 계층은 상위 계층에게 서비스를 제공하는 서비스 제공자 (service provider) 역할을 하며, 하위 계층의 서비스를 사용하는 서비스 사용자 (service user) 역할을 동시에 수행한다. 이러한 계층별 역할 분리는 프로토콜 독립성과 모듈화를 가능하게 한다.

SDU 와 PDU 의 구별은 네트워크 프로토콜 이해의 시작점이다. N-SDU 는 N 계층이 제공하는 서비스의 페이로드이며, N-PDU 는 N 계층의 프로토콜 헤더가 추가된 완전한 프로토콜 메시지다. 예를 들어, 전송 계층의 관점에서 애플리케이션 데이터는 T-SDU 이며, 이에 TCP/UDP 헤더가 추가되면 T-PDU(세그먼트/데이터그램) 가 된다. 이 T-PDU 는 다시 네트워크 계층에 N-SDU 로 전달된다.

기본 개념과 배경

이 섹션은 SDU 의 공식 정의, 주요 특성, 역사적 발전, 해결 문제, 흔한 오해, 필수 용어를 다루며 개념적 출발점을 정렬한다.

정의 (Definition)

SDU(Service Data Unit, 서비스 데이터 단위) 는 OSI 참조 모델에서 특정 계층 (N) 이 상위 인접 계층 (N+1) 으로부터 받아서 처리해야 할 데이터 단위를 의미한다. 각 계층은 상위에서 전달받은 SDU 를 자신만의 헤더를 추가하여 PDU 로 변환 후 하위 계층으로 전송한다.
ISO/IEC 7498-1 표준에서는 SDU 를 " 서비스 사용자가 서비스 제공자에게 전달하는 정보의 단위이며, 서비스 제공자가 투명하게 (transparently) 전달해야 하는 데이터 " 로 정의한다.

각 계층은 자신만의 SDU 를 가지며, 계층 번호 N 을 접두사로 붙여 N-SDU 로 표기한다.
예시:

특징 (Characteristics)

SDU 는 각 계층이 하위 계층에 전달하는 실제 데이터이며, PDU 의 페이로드 역할을 한다. 데이터는 계층마다 캡슐화·분할·조합되어 전달된다.

SDU 의 주요 특징:

  1. 투명성 (Transparency): SDU 는 서비스 제공 계층에서 내용이 해석되거나 수정되지 않고 그대로 전달되어야 한다. 각 계층은 SDU 를 불투명한 (opaque) 데이터로 취급한다.
  2. 서비스 경계 (Service Boundary): SDU 는 계층 간 서비스 인터페이스의 경계를 정의한다. 서비스 액세스 포인트 (SAP, Service Access Point) 를 통해 전달된다.
  3. 크기 가변성: SDU 의 크기는 상위 계층이 결정하며, 하위 계층은 이를 수용해야 한다. 단, 하위 계층의 MTU(Maximum Transmission Unit) 제약으로 인해 분할 (segmentation) 또는 단편화 (fragmentation) 가 발생할 수 있다.
  4. 계층 독립성: 각 계층의 SDU 는 다른 계층의 구현이나 프로토콜과 독립적이다. 이는 프로토콜 스택의 모듈화를 가능하게 한다.

구별점:

등장 배경 (Background)

SDU 개념은 1970 년대 후반 ISO(International Organization for Standardization) 가 OSI 참조 모델을 개발하면서 체계화되었다. 이전의 네트워크 시스템들은 계층 간 경계가 불명확하여 프로토콜 간 상호운용성과 독립적 개발이 어려웠다.

역사적 맥락:

발전 과정:
초기에는 단순히 " 계층 간 데이터 " 로만 인식되었으나, 점차 서비스 추상화 (service abstraction) 와 캡슐화 (encapsulation) 원칙의 핵심으로 자리잡았다.
TCP/IP 프로토콜 스위트의 실용적 성공으로 인해 OSI 모델의 엄격한 계층 구조는 완전히 구현되지 않았지만, SDU/PDU 개념은 네트워크 교육과 프로토콜 설계의 기본 원리로 남아있다.

해결하려는 문제 (Problem)

SDU/PDU 개념 도입 이전, 각 계층간 데이터 인계 방식이 모호하여 네트워크 오류, 성능 저하, 문제 진단이 어려웠다.
이를 계층별로 명확히 분리함으로써 트러블슈팅, 데이터 추적, 성능 개선, 혼선 방지에 도움을 제공한다.

SDU 개념 도입 효과

문제 영역Before (부재 시)After (적용 시)
인터페이스 명확성계층 간 인터페이스가 임의적이고 불명확명확한 서비스 경계와 책임 분리
변경 영향 범위프로토콜 변경 시 인접 계층까지 영향프로토콜 독립성으로 계층별 독립 개발
복잡성 관리서비스와 프로토콜의 혼재로 인한 복잡성서비스 추상화로 구현 세부 은폐
결합도/재사용성계층 간 의존성↑ → 낮은 재사용성계층 간 계약 (contract) 명시화로 재사용성↑
상호운용성/검증상호운용성 검증의 어려움표준화된 인터페이스로 상호운용성 확보·검증 용이

구체적 문제 해결 예시:

문제 영역BeforeAfter (SDU 적용)
프로토콜 교체전체 스택 재설계 필요해당 계층만 수정
디버깅경계 불명확으로 어려움SAP 기준 명확한 추적
성능 최적화계층 간 간섭 발생독립적 최적화 가능
표준 준수해석의 모호성명확한 규격 기준

흔한 오해 (Misconceptions)

오해 1: SDU 와 PDU 는 같은 개념이다

오해: SDU 와 PDU 를 동의어로 사용하거나, 단순히 " 데이터 단위 " 로만 이해한다.
원인:

반례:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
상황: 웹 브라우저가 HTTP 요청을 전송

L7 (Application):
  HTTP Request (100 bytes) 
  → L7-SDU (100 bytes) for Transport Layer

L4 (Transport):
  받은 L4-SDU (100 bytes) + TCP Header (20 bytes)
  → L4-PDU (TCP Segment, 120 bytes)
  → L4-PDU는 동시에 L3-SDU가 됨

L3 (Network):
  받은 L3-SDU (120 bytes) + IP Header (20 bytes)
  → L3-PDU (IP Packet, 140 bytes)

올바른 개념:

오해 2: SDU 는 항상 단일 PDU 로 매핑된다

오해: 하나의 SDU 는 항상 하나의 PDU 가 된다고 생각한다.

원인:

반례:

  1. Segmentation (분할):

    • 큰 L4-SDU (10,000 bytes) → 여러 개의 L3-PDU 로 분할
    • TCP 에서 큰 애플리케이션 데이터를 MSS 크기로 분할
  2. Fragmentation (단편화):

    • L3 에서 큰 IP 패킷이 작은 MTU 링크를 만나면 단편화
    • 하나의 L3-PDU 가 여러 개의 L2-SDU 로 나뉨
  3. Concatenation (연결):

    • 작은 여러 SDU 를 하나의 PDU 로 결합 (효율성)
    • ATM 에서 여러 AAL5 SDU 를 하나의 셀 그룹으로 결합

올바른 개념: SDU 와 PDU 의 매핑은 M:N 관계이며, 계층의 세그멘테이션/리어셈블리 메커니즘에 따라 결정된다.

오해 3: 모든 PDU 는 ’ 패킷 ’ 이다

오해: ’ 패킷 ’ 이라는 용어를 모든 계층의 PDU 에 적용해도 무방하다.
원인: 교육이나 실무에서 데이터 단위를 일괄적으로 ’ 패킷 ’ 으로 지칭하는 관례.
반례: 네트워크 계층만 ’ 패킷 ‘, 전송 계층은 ’ 세그먼트 ‘, 데이터링크 계층은 ’ 프레임 ‘, 물리 계층은 ’ 비트 ’ 등 각기 구분 필요.
올바른 개념: 각 계층별 데이터 단위 (PDU) 의 명칭을 정확히 사용하여 문제 분석·트러블슈팅의 정확도를 높인다.

오해 4: 모든 계층이 명시적 SDU/PDU 를 가진다

오해: OSI 7 계층 모든 레벨에서 SDU/PDU 가 명확히 구분된다.
원인:

반례:

올바른 개념: SDU/PDU 는 계층 간 인터페이스를 이해하기 위한 개념적 모델이며, 실제 구현은 프로토콜마다 다르다. 중요한 것은 " 서비스 경계 " 와 " 캡슐화 원칙 " 의 이해다.

핵심 개념 정의·용어 정합

사전 지식 (Prerequisites):

핵심 용어 관계도:

graph TD
    A[상위 계층 N+1] -->|N-SDU 전달| B[계층 N]
    B -->|N-PCI 추가| C[N-PDU 생성]
    C -->|N-1 SDU로 전달| D[하위 계층 N-1]
    
    E[Service] -.제공.-> B
    F[Protocol] -.사용.-> B
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style D fill:#e1f5ff
    style C fill:#ffe1e1

계층 N 은 상위 계층 (N+1) 으로부터 N-SDU 를 서비스 인터페이스를 통해 받는다.
계층 N 은 자신의 프로토콜 제어 정보 (N-PCI, 헤더/트레일러) 를 N-SDU 에 추가하여 N-PDU 를 생성한다.
이 N-PDU 는 하위 계층 (N-1) 에게 (N-1)-SDU 로 전달된다. 각
계층은 상위에 서비스를 제공하고, 하위의 서비스를 사용하는 이중 역할을 수행한다.

핵심 용어 비교표:

용어정의역할예시 (TCP/IP)
SDU서비스 데이터 단위계층 간 페이로드HTTP 요청 → TCP 의 SDU
PDU프로토콜 데이터 단위헤더 포함 완전 메시지TCP 세그먼트 (헤더 + 데이터)
PCI프로토콜 제어 정보프로토콜 헤더/트레일러TCP 헤더 (20 bytes)
SAP서비스 액세스 포인트계층 간 인터페이스Port 번호 (TCP/UDP)
ICI인터페이스 제어 정보서비스 요청 파라미터우선순위, QoS 플래그

요약 표: 계층별 SDU→PDU 명칭 대응

계층/도메인상위가 내리는 SDU하위/동일 계층 PDU 명칭
OSI L3(네트워크)NSDUNPDU(패킷)
OSI L2(데이터링크)DL‑SDUDL‑PDU(프레임)
IEEE 802.11 MACMSDUMPDU, A‑MPDU(집계)
3GPP RLCRLC‑SDURLC‑PDU(UM/AM/TM)
3GPP PDCPPDCP‑SDUPDCP‑PDU
ATM AAL5AAL5‑SDUAAL5‑PDU
6LoWPANIPv6 SDULoWPAN PDU(fragment 가능)

프로토콜 구조 및 계층의 역할

SDU 가 어떻게 각 계층 간에 전달되고 처리되는지, 네트워크 구조에 따라 구체적으로 캡슐화되는 과정을 설명한다.

핵심 개념 요약

OSI 7 계층에서의 SDU

각 OSI 계층마다 상위 계층이 전달한 SDU 는 하위 계층에서 헤더/트레일러를 덧붙여 PDU 로 변환되며, 이 과정에서 캡슐화 (Encapsulation) 가 반복된다.
PDU 최대 크기 (MTU) 를 넘으면 분할되어 다수 PDU로 전송 후 수신 측에서 재조립된다.
이 과정에서 오류/혼잡/재전송 정책은 해당 계층의 PDU 단위로 적용되며 SDU 의미는 보존된다.
물리 계층에서는 최종적으로 비트스트림으로 전송되어 모든 제어 정보가 해체된다.

계층별 SDU 특성

계층이 계층이 받는 SDU (상위→하위)이 계층이 생성하는 PDU일반 크기/제약대표 프로토콜·데이터실무 비고
L7 응용응용 메시지/객체 (예: HTTP 메시지, RPC 호출)APDU 또는 응용 메시지응용 정의 (수 B ~ MB+)HTTP, DNS, gRPC, SMTPL5/L6 기능을 자체 포함하는 경우 많음
L6 표현L7 APDU/메시지PPDU가변 (인코딩/암복호 영향)ASN, XDR, 역할상 TLS엄밀히 TLS 는 L4.5~L7 사이지만 표현 기능(암·무결성) 수행
L5 세션L6 PPDUSPDU가변NetBIOS Session, RPC현대 TCP/IP 에선 분리 구현 드묾
L4 전송L7 데이터 바이트 스트림TCP Segment / UDP Datagram / SCTP PDUTCP MSS 기준 (예: 1460 IPv4, 1440 IPv6)TCP, UDP, SCTP세그멘테이션/흐름/혼잡/재전송
L3 네트워크L4 PDUIP PacketPath MTU(IPv6 ≥1280)IPv4/IPv6, ICMP, IPsecIPv4: 라우터/호스트 단편화, IPv6: 라우터 단편화 금지
L2 데이터링크L3 PacketFrame이더넷 IP MTU 1500(프레임 1518: H14+F4)Ethernet, 802.11, PPPVLAN(+4)·QinQ(+8)·무선 오버헤드 고려
L1 물리L2 Frame(비트열)심볼/비트 스트림라인 코딩·대역폭 제약전기/광/무선 신호SDU 개념 미약(비트 전송)

주의: 표의 “MTU 1500” 은 IP MTU(L3 페이로드 상한) 를 의미. 이더넷 프레임 전체는 헤더 14B + FCS 4B 가 더해져 1518B(프리앰블/IFG 제외).

SDU/PDU 명칭 매핑

OSI 계층이 계층의 SDU 명칭이 계층의 PDU 명칭 (OSI)TCP/IP 현실 용어 (주요 예)주요 기능
L7 응용데이터/메시지APDUHTTP 메시지, RPC 메시지, DNS 질의/응답응용 로직, 포맷
L6 표현L7 APDUPPDU직렬화 (ASN, JSON), 압축, TLS 레코드*표현/암·무결성
L5 세션L6 PPDUSPDU(대부분 응용/프레임워크 내부)세션 관리/동기화
L4 전송L7 데이터세그먼트/데이터그램TCP 세그먼트 / UDP 데이터그램신뢰/흐름/혼잡 제어
L3 네트워크L4 PDU패킷IPv4/IPv6 패킷라우팅/주소
L2 데이터링크L3 패킷프레임이더넷/802.11/PPP 프레임프레이밍/MAC
L1 물리L2 프레임 (비트열)비트/심볼전송 비트스트림매체 신호

캡슐화·역캡슐화

SDU 가 계층을 통과하며 PDU 로 변환되고 다시 SDU 로 추출되는 과정을 설명한다.
각 OSI 계층마다 상위 계층이 전달한 SDU 는 하위 계층에서 헤더/트레일러를 덧붙여 PDU 로 변환되며, 이 과정에서 캡슐화 (Encapsulation) 가 반복된다.

캡슐화: N 계층은 (N+1)-SDU 를 받아 **N-PCI(헤더/트레일러)**를 붙여 N-PDU 생성 → (N-1) 계층에 (N-1)-SDU로 넘김.

역캡슐화: 수신 측에서 각 계층이 자신의 헤더만 해석/제거하여 상위 SDU 를 복원.

간단 캡슐화 예

캡슐화 체인 예시 (HTTP over TCP/IP over Ethernet):

1
2
3
4
5
6
7
8
9
L7: HTTP Request (200 bytes)
    ↓ (L7-SDU for L4)
L4: [TCP Header 20B] + [L4-SDU 200B] = TCP Segment (220 bytes)
    ↓ (L4-PDU = L3-SDU)
L3: [IP Header 20B] + [L3-SDU 220B] = IP Packet (240 bytes)
    ↓ (L3-PDU = L2-SDU)
L2: [Eth Header 14B] + [L2-SDU 240B] + [FCS 4B] = Ethernet Frame (258 bytes)
    ↓ (L2-PDU = L1-SDU)
L1: 258 bytes → 2064 bits (Physical transmission)

캡슐화 시퀀스 다이어그램:

sequenceDiagram
    participant App as Application (L7)
    participant Trans as Transport (L4)
    participant Net as Network (L3)
    participant L2 as Data Link (L2)
    
    App->>Trans: L4-SDU (200B)
    Note over Trans: + TCP Header (20B) → L4-PDU 220B
    Trans->>Net: L3-SDU = L4-PDU (220B)
    Note over Net: + IP Header (20B) → L3-PDU 240B
    Net->>L2: L2-SDU = L3-PDU (240B)
    Note over L2: + Ethernet Header (14B) + FCS (4B) → L2-PDU 258B
    L2->>L2: L2-PDU (258B) → Physical Bits
    
    L2->>Net: L3-SDU (240B)
    Note over Net: - Ethernet Header / FCS
    Net->>Trans: L4-SDU (220B)
    Note over Trans: - IP Header (20B)
    Trans->>App: App Data (200B)
    Note over Trans: - TCP Header (20B)

송신 측에서는 각 계층이 헤더를 추가하며 데이터가 " 성장 " 한다 (캡슐화). 수신 측에서는 반대로 각 계층이 자신의 헤더를 제거하며 원본 데이터를 복원한다 (역캡슐화). 각 계층은 자신의 헤더만 해석하고, 페이로드 (SDU) 는 불투명하게 취급한다. 이는 계층 간 독립성의 핵심이다.

분할과 재조립 (Segmentation & Reassembly)

큰 SDU 가 여러 PDU 로 나뉘고 다시 합쳐지는 과정을 다룬다.
PDU 최대 크기 (MTU) 를 넘으면 분할되어 다수 PDU로 전송 후 수신 측에서 재조립된다. 이 과정에서 오류/혼잡/재전송 정책은 해당 계층의 PDU 단위로 적용되며 SDU 의미는 보존된다.
물리 계층에서는 최종적으로 비트스트림으로 전송되어 모든 제어 정보가 해체된다.

분할이 필요한 이유

분할 메커니즘 예시 (TCP Segmentation):

단계설명크기
1. 응용 데이터웹 페이지 HTML10,000 bytes
2. L4-SDU전송 계층이 받은 데이터10,000 bytes
3. MSS 확인Maximum Segment Size (일반적으로 1460 bytes)-
4. 분할10,000 / 1460 ≈ 7 개 세그먼트 생성각 ≤1460 bytes
5. TCP PDU각 세그먼트에 TCP 헤더 (20B) 추가각 ≤1480 bytes
6. 전송7 개의 L3-SDU 로 네트워크 계층에 전달-

재조립 메커니즘:

분할/재조립 코드 예시 (Python, 개념적):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 송신 측: SDU 분할
def segment_sdu(sdu_data, mss):
    """
    SDU를 MSS 크기에 맞게 분할
    
    Args:
        sdu_data: 원본 SDU 바이트 배열
        mss: Maximum Segment Size
    
    Returns:
        세그먼트 리스트 (각 세그먼트는 dict로 seq_num과 data 포함)
    """
    segments = []
    seq_num = 0
    
    for i in range(0, len(sdu_data), mss):
        segment_data = sdu_data[i:i+mss]
        segments.append({
            'seq_num': seq_num,
            'data': segment_data,
            'length': len(segment_data)
        })
        seq_num += len(segment_data)
    
    return segments

# 수신 측: PDU 재조립
def reassemble_segments(segments):
    """
    수신한 세그먼트를 원본 SDU로 재조립
    
    Args:
        segments: 수신한 세그먼트 리스트
    
    Returns:
        재조립된 원본 SDU
    """
    # 시퀀스 번호로 정렬
    sorted_segments = sorted(segments, key=lambda x: x['seq_num'])
    
    # 연속성 검증
    expected_seq = 0
    for seg in sorted_segments:
        if seg['seq_num'] != expected_seq:
            raise Exception(f"Missing segment at seq {expected_seq}")
        expected_seq += seg['length']
    
    # 데이터 결합
    reassembled_sdu = b''.join(seg['data'] for seg in sorted_segments)
    return reassembled_sdu

# 사용 예시
original_sdu = b'A' * 10000  # 10KB 데이터
mss = 1460

# 송신
segments = segment_sdu(original_sdu, mss)
print(f"분할된 세그먼트 수: {len(segments)}")  # 출력: 7

# 수신 (역순으로 도착 가정)
import random
random.shuffle(segments)
recovered_sdu = reassemble_segments(segments)

assert original_sdu == recovered_sdu, "재조립 실패"
print("재조립 성공")

큰 SDU 는 하위 계층의 제약으로 인해 여러 작은 PDU 로 나뉜다. 각 PDU 는 순서 정보를 포함하여 수신 측에서 올바른 순서로 재조립될 수 있다. 이 과정은 전송 효율과 오류 복구의 균형을 맞춘다.

핸드셰이크 및 플로우 제어

SDU/PDU 변환과정에서 핸드셰이크, 흐름 제어, 세그멘테이션, 협상 과정 등을 설명한다.

세그멘테이션 및 패딩

데이터가 최대 PDU 크기를 초과할 경우 분할 (세그멘테이션), 크기가 부족할 경우 패딩이 추가된다.

핸드셰이크와 협상

서비스 인터페이스와 SAP

SDU 가 전달되는 서비스 액세스 포인트 (SAP), 서비스 프리미티브, 인터페이스 제어 정보 (ICI) 를 다룬다.

서비스 액세스 포인트 (SAP)

SAP 의 역할, 주소 지정, 실제 구현 예시를 설명한다.

SAP 정의

서비스 액세스 포인트 (Service Access Point) 는 특정 계층이 상위 계층에게 서비스를 제공하는 논리적 인터페이스다. SAP 은 고유한 주소 (SAP Address) 로 식별되며, 이를 통해 여러 상위 계층 엔티티가 동일 하위 계층 서비스를 공유할 수 있다.

계층별 SAP 구현 예시

계층SAP 이름주소 예시실제 구현
TransportTSAPPort 번호 (16-bit)TCP/UDP Port (80, 443, 53 등)
NetworkNSAPIP 주소 (32-bit/128-bit)IPv4/IPv6 주소
Data LinkLSAPMAC 주소 (48-bit)Ethernet MAC, DSAP/SSAP (LLC)
PhysicalPhySAP물리 포트 번호이더넷 포트, 시리얼 포트

SAP 주소 지정 예시 (웹 서버 접속)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
클라이언트 → 웹 서버 HTTP 요청

L4 (Transport):
  Source TSAP: 클라이언트 Port 54321
  Dest TSAP: 서버 Port 80 (HTTP)

L3 (Network):
  Source NSAP: 클라이언트 IP 192.168.1.100
  Dest NSAP: 서버 IP 203.0.113.10

L2 (Data Link):
  Source LSAP: 클라이언트 MAC aa:bb:cc:dd:ee:ff
  Dest LSAP: 게이트웨이 MAC 00:11:22:33:44:55

SAP 멀티플렉싱 (Multiplexing)

graph TD
    subgraph "상위 계층 N+1"
    A1[엔티티 A] 
    A2[엔티티 B]
    A3[엔티티 C]
    end
    
    subgraph "계층 N 서비스"
    SAP1[SAP-1]
    SAP2[SAP-2]
    SAP3[SAP-3]
    N[N-Layer Service Provider]
    end
    
    A1 -->|N-SDU| SAP1
    A2 -->|N-SDU| SAP2
    A3 -->|N-SDU| SAP3
    
    SAP1 --> N
    SAP2 --> N
    SAP3 --> N
    
    style N fill:#fff4e1

여러 상위 계층 엔티티가 각각 고유한 SAP 을 통해 동일한 하위 계층 서비스를 사용한다. 예를 들어, 하나의 컴퓨터에서 여러 애플리케이션 (웹 브라우저, 이메일 클라이언트, 메신저) 이 각각 다른 포트 번호 (TSAP) 를 사용하여 TCP 서비스를 공유한다. 이는 멀티플렉싱의 핵심이다.

서비스 프리미티브 (Service Primitives)

계층 간 서비스 요청과 응답을 나타내는 프리미티브 유형을 다룬다.

서비스 프리미티브 4 가지 유형

프리미티브약어방향설명
Request.reqUser → Provider서비스 요청
Indication.indProvider → User서비스 도착 알림
Response.resUser → Provider요청에 대한 응답
Confirm.cnfProvider → User요청 처리 완료 확인

서비스 유형에 따른 프리미티브 조합

  1. 비확인 서비스 (Unconfirmed Service):

    1
    2
    3
    
    Sender: DATA.req(SDU)
    ──────────────────────→
    Receiver: DATA.ind(SDU)
    

    예시: UDP 데이터그램 전송

  2. 확인 서비스 (Confirmed Service):

    1
    2
    3
    4
    5
    6
    
    Sender: DATA.req(SDU)
    ──────────────────────→
    Receiver: DATA.ind(SDU)
    		  DATA.res(ACK)
    ←──────────────────────
    Sender: DATA.cnf(ACK)
    

    예시: TCP 세그먼트 전송 (ACK 포함)

프리미티브와 SDU 전달 시퀀스 (확인 서비스)

sequenceDiagram
    participant SU as Service User (송신)
    participant SP as Service Provider (N계층)
    participant RU as Service User (수신)
    
    SU->>SP: N-DATA.req(N-SDU, params)
    Note over SP: SDU 캡슐화<br/>N-PDU 생성
    SP->>RU: N-DATA.ind(N-SDU, params)
    Note over RU: SDU 처리
    RU->>SP: N-DATA.res(ACK)
    SP->>SU: N-DATA.cnf(ACK)

서비스 프리미티브는 계층 간 상호작용의 명시적 계약을 정의한다. Request 는 서비스 사용자가 시작하고, Indication 은 서비스 제공자가 상대방에게 알린다. Response 와 Confirm 은 확인이 필요한 서비스에서만 사용된다. SDU 는 Request 와 Indication 에 실려 전달된다.

인터페이스 제어 정보 (ICI)

SDU 와 함께 전달되는 제어 정보의 역할과 예시를 다룬다.

ICI(Interface Control Information) 정의

ICI 는 서비스 프리미티브와 함께 전달되는 파라미터로, SDU 자체는 아니지만 서비스 처리에 필요한 제어 정보를 포함한다. ICI 는 계층 간 인터페이스에서만 사용되고 하위 계층으로 전달되지 않는다.

ICI Vs PCI 비교

구분ICIPCI
정의인터페이스 제어 정보프로토콜 제어 정보
위치SAP 인터페이스PDU 헤더/트레일러
범위인접 계층 간동일 계층 피어 간
전달하위로 전달 안 됨네트워크를 통해 전달
예시우선순위, QoS 플래그TCP 헤더, IP 헤더

예시

ICI 파라미터 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 전송 계층 서비스 요청 (의사 코드)
def transport_send_request(sdu, ici):
    """
    상위 계층이 전송 계층에 데이터 전송 요청
    
    Args:
        sdu: L4-SDU (애플리케이션 데이터)
        ici: 인터페이스 제어 정보 (dict)
            - dest_address: 목적지 주소
            - dest_port: 목적지 포트
            - priority: 우선순위 (0-7)
            - qos: QoS 플래그 (LOW_LATENCY, HIGH_THROUGHPUT 등)
            - timeout: 타임아웃 (초)
    """
    # ICI 파라미터 추출
    dest_addr = ici['dest_address']
    dest_port = ici['dest_port']
    priority = ici.get('priority', 0)
    qos = ici.get('qos', 'BEST_EFFORT')
    
    # TCP 헤더 생성 (PCI)
    tcp_header = create_tcp_header(
        dest_port=dest_port,
        flags=get_flags_from_qos(qos)
    )
    
    # PDU 생성 (PCI + SDU)
    tcp_segment = tcp_header + sdu
    
    # 네트워크 계층에 전달 (새로운 ICI)
    network_send_request(
        sdu=tcp_segment,  # L3-SDU가 됨
        ici={
            'dest_address': dest_addr,
            'protocol': 'TCP',
            'tos': map_priority_to_tos(priority)  # ICI → L3 ICI 매핑
        }
    )

# 사용 예시
app_data = b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"

transport_send_request(
    sdu=app_data,
    ici={
        'dest_address': '203.0.113.10',
        'dest_port': 80,
        'priority': 5,
        'qos': 'LOW_LATENCY'
    }
)

ICI 흐름 예시 (QoS 요청):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
L7  L4: 
  SDU: HTTP 요청 데이터
  ICI: { priority: HIGH, latency: LOW }

L4  L3:
  SDU: TCP 세그먼트 (L4-PDU)
  ICI: { tos: 0xE0 (high priority), protocol: TCP }
   L4는 상위 ICI를 TCP 헤더(PCI) L3 ICI로 변환

L3  L2:
  SDU: IP 패킷 (L3-PDU)
  ICI: { vlan_priority: 5 }
   L3는 상위 ICI를 IP 헤더(PCI) L2 ICI로 변환

L2  L1:
  SDU: 이더넷 프레임 (L2-PDU)
  ICI: { signal_strength: HIGH }
   L2는 상위 ICI를 이더넷 헤더(PCI) 물리 파라미터로 변환

ICI 는 계층 간 수직 인터페이스에서만 존재하며, 각 계층은 상위 ICI 를 자신의 PCI 와 하위 ICI 로 변환한다. 예를 들어, 응용 계층의 " 긴급 " 플래그는 TCP 의 URG 플래그 (PCI) 로, 그리고 IP 의 ToS 필드 (PCI) 로, 최종적으로 이더넷의 우선순위 태그 (PCI) 로 매핑된다. ICI 는 네트워크를 통해 전송되지 않는다.

성능 최적화 및 트러블슈팅

Section Overview: SDU 처리 성능 이슈, MTU 최적화, 디버깅 방법을 다룬다.

4.1 MTU 와 MSS 최적화

Detail Overview: 최대 전송 단위 설정이 SDU 처리 성능에 미치는 영향을 다룬다.

MTU (Maximum Transmission Unit):

MSS (Maximum Segment Size):

MTU/MSS 불일치로 인한 문제:

시나리오문제증상해결책
큰 SDU + 작은 MTU과도한 분할높은 오버헤드, 지연 증가Path MTU Discovery, MTU 조정
MTU 블랙홀ICMP 차단으로 PMTUD 실패연결 중단, 타임아웃MSS 하드코딩, TCP MSS Clamping
IPv6 터널터널 오버헤드로 유효 MTU 감소재전송 증가터널 MTU 명시 설정
VPN암호화 헤더로 MTU 감소성능 저하VPN MTU 튜닝

Path MTU Discovery (PMTUD) 과정:

sequenceDiagram
    participant Client as 클라이언트
    participant R1 as 라우터1<br/>(MTU 1500)
    participant R2 as 라우터2<br/>(MTU 1400)
    participant Server as 서버
    
    Client->>R1: IP 패킷 (1500B, DF=1)
    R1->>R2: IP 패킷 (1500B)
    R2-->>Client: ICMP Fragmentation Needed<br/>(MTU=1400)
    Note over Client: MTU를 1400으로 조정
    Client->>R1: IP 패킷 (1400B, DF=1)
    R1->>R2: IP 패킷 (1400B)
    R2->>Server: IP 패킷 (1400B)
    Server-->>Client: 응답

도식 해설:
클라이언트는 초기에 최대 MTU(1500) 로 패킷을 전송한다. 경로 중간의 라우터가 더 작은 MTU 를 가지면 ICMP 메시지를 보내 클라이언트에게 알린다. 클라이언트는 MTU 를 조정하여 재전송한다. 이 과정으로 경로 상의 최소 MTU 를 찾아 최적화한다. 단, ICMP 가 차단되면 이 메커니즘이 실패한다.

MTU 최적화 실습 (Linux):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 현재 MTU 확인
ip link show eth0

# MTU 변경 (임시, 재부팅 시 초기화)
sudo ip link set eth0 mtu 9000

# TCP MSS 확인
ss -i | grep mss

# iptables로 MSS Clamping (VPN/터널 환경)
sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
  -j TCPMSS --clamp-mss-to-pmtu

# Path MTU Discovery 테스트 (ping)
# -M do: DF(Don't Fragment) 플래그 설정
# -s: 패킷 크기 (ICMP 헤더 8B 제외)
ping -M do -s 1472 example.com  # 성공하면 MTU ≥ 1500
ping -M do -s 1473 example.com  # 실패하면 MTU < 1501

코드 예시: TCP Socket MSS 설정 (Python):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import socket

def create_optimized_socket(dest_ip, dest_port, custom_mss=None):
    """
    MSS가 최적화된 TCP 소켓 생성
    
    Args:
        dest_ip: 목적지 IP
        dest_port: 목적지 포트
        custom_mss: 사용자 정의 MSS (None이면 기본값)
    
    Returns:
        설정된 소켓 객체
    """
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # TCP_MAXSEG 옵션으로 MSS 설정 (일부 OS에서만 지원)
    if custom_mss and hasattr(socket, 'TCP_MAXSEG'):
        try:
            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG, custom_mss)
            print(f"MSS를 {custom_mss}로 설정")
        except OSError as e:
            print(f"MSS 설정 실패: {e}")
    
    # Don't Fragment 플래그 설정 (PMTUD 활성화)
    if hasattr(socket, 'IP_MTU_DISCOVER'):
        sock.setsockopt(socket.IPPROTO_IP, socket.IP_MTU_DISCOVER, 2)  # IP_PMTUDISC_DO
    
    sock.connect((dest_ip, dest_port))
    
    # 협상된 MSS 확인 (Linux)
    if hasattr(socket, 'TCP_MAXSEG'):
        try:
            negotiated_mss = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG)
            print(f"협상된 MSS: {negotiated_mss}")
        except OSError:
            pass
    
    return sock

# 사용 예시
sock = create_optimized_socket('203.0.113.10', 80, custom_mss=1400)
sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
response = sock.recv(4096)
sock.close()

[RF:#29, #30, #31]

4.2 SDU 처리 오버헤드 분석

Detail Overview: 계층별 헤더 오버헤드와 캡슐화 비용을 정량화한다.

계층별 오버헤드 (전형적인 경우):

계층헤더 크기트레일러총 오버헤드오버헤드 비율 (100B SDU 기준)
L7 (HTTP)~200B (요청 라인 + 헤더)0200B200%
L4 (TCP)20B (옵션 없음) ~ 60B020-60B20-60%
L3 (IPv4)20B (옵션 없음)020B20%
L2 (Ethernet)14B4B (FCS)18B18%
L1 (물리)0 (프리앰블 제외)000%
총합~254B4B~258B258%

페이로드 효율성 분석 (작은 SDU 의 경우):

1
2
3
4
5
6
7
8
9
시나리오: 1 byte 응용 데이터 전송 (예: 키 입력)

L7-SDU: 1 byte
L4-PDU: 1 + 20 (TCP) = 21 bytes
L3-PDU: 21 + 20 (IP) = 41 bytes
L2-PDU: 41 + 14 (Eth) + 4 (FCS) = 59 bytes

페이로드 효율성 = 1 / 59 = 1.7%
오버헤드 = 58 / 1 = 5800%

효율성 개선 전략:

  1. Nagle 알고리즘 (TCP):

    • 작은 세그먼트를 버퍼링하여 큰 세그먼트로 결합
    • 효과: 오버헤드 감소, 지연 증가 (트레이드오프)
  2. Header Compression (ROHC, RFC 5795):

    • IP/TCP/UDP 헤더를 압축 (40B → 1-3B)
    • 효과: 무선 환경에서 대역폭 절약
  3. Jumbo Frames (Ethernet):

    • MTU 를 1500B → 9000B 확대
    • 효과: 대용량 전송 시 오버헤드 비율 감소

오버헤드 시각화 (크기별 비교):

graph LR
    A[SDU<br/>10B] --> B[Total<br/>68B]
    C[SDU<br/>100B] --> D[Total<br/>158B]
    E[SDU<br/>1000B] --> F[Total<br/>1058B]
    G[SDU<br/>1460B<br/>(MSS)] --> H[Total<br/>1518B<br/>(Ethernet)]
    
    style A fill:#ffcccc
    style C fill:#ffddcc
    style E fill:#ffffcc
    style G fill:#ccffcc

도식 해설:
작은 SDU 일수록 상대적 오버헤드가 크다. 10 bytes SDU 는 총 68 bytes 가 되어 680% 오버헤드가 발생한다. 반면 MSS 에 가까운 1460 bytes SDU 는 총 1518 bytes 로 약 4% 오버헤드만 발생한다. 따라서 대용량 데이터 전송 시 큰 SDU 를 사용하는 것이 효율적이다.

[RF:#32, #33]

4.3 디버깅과 트러블슈팅

Detail Overview: SDU 관련 문제 진단 및 해결 방법을 다룬다.

일반적인 SDU 문제 유형:

문제증상원인진단 방법해결책
SDU 손실데이터 누락, 재전송버퍼 오버플로, 라우팅Wireshark, tcpdump버퍼 크기 증가, QoS
SDU 순서 뒤바뀜데이터 깨짐, 재조립 실패멀티패스, 재전송Sequence 번호 분석TCP 사용, 재정렬 로직
SDU 중복중복 데이터재전송 타임아웃Duplicate ACK 분석타임아웃 튜닝, 중복 제거
SDU 분할 과다성능 저하MTU 불일치PMTUD 로그, ICMPMTU 조정, MSS Clamping
SDU 블랙홀연결 끊김ICMP 차단, 방화벽traceroute, MTRMSS 하드코딩, VPN MTU

Wireshark 를 이용한 SDU 추적:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# TCP 스트림 필터 (특정 연결의 SDU 추적)
tcp.stream eq 0

# 특정 포트의 SDU 크기 분석
tcp.len > 0 and tcp.port == 80

# 분할된 IP 패킷 찾기
ip.flags.mf == 1 or ip.frag_offset > 0

# TCP 재전송 식별
tcp.analysis.retransmission

# MSS 협상 확인 (SYN 패킷)
tcp.flags.syn == 1 and tcp.options.mss

Python 을 이용한 SDU 모니터링:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from scapy.all import sniff, TCP, IP

def analyze_sdu(packet):
    """
    패킷에서 SDU 정보 추출 및 분석
    
    Args:
        packet: Scapy 패킷 객체
    """
    if packet.haslayer(TCP) and packet.haslayer(IP):
        ip_layer = packet[IP]
        tcp_layer = packet[TCP]
        
        # L3-SDU 크기 (IP 페이로드 = TCP 세그먼트)
        l3_sdu_size = ip_layer.len - (ip_layer.ihl * 4)  # IP total length - IP header
        
        # L4-SDU 크기 (TCP 페이로드)
        tcp_header_size = tcp_layer.dataofs * 4
        l4_sdu_size = l3_sdu_size - tcp_header_size
        
        # 오버헤드 계산
        overhead = tcp_header_size + (ip_layer.ihl * 4) + 14 + 4  # TCP + IP + Eth Header/FCS
        efficiency = l4_sdu_size / (l4_sdu_size + overhead) * 100 if l4_sdu_size > 0 else 0
        
        if l4_sdu_size > 0:  # 페이로드가 있는 경우만
            print(f"[{ip_layer.src}:{tcp_layer.sport}{ip_layer.dst}:{tcp_layer.dport}]")
            print(f"  L4-SDU: {l4_sdu_size} bytes")
            print(f"  Total: {ip_layer.len + 14 + 4} bytes")
            print(f"  Efficiency: {efficiency:f}%")
            print(f"  TCP Flags: {tcp_layer.flags}")
            
            # 비정상 패턴 감지
            if l4_sdu_size < 10 and efficiency < 10:
                print(f"  ⚠️ 매우 작은 SDU (Nagle 비활성화 가능성)")
            if ip_layer.flags.MF or ip_layer.frag_offset > 0:
                print(f"  ⚠️ IP 단편화 발생")
            if tcp_layer.flags & 0x08:  # PSH 플래그
                print(f"  📌 푸시 데이터 (즉시 전달)")

# 실시간 모니터링 시작
print("SDU 모니터링 시작 (Ctrl+C로 중지)…")
sniff(filter="tcp", prn=analyze_sdu, store=0)

트러블슈팅 체크리스트:

[RF:#34, #35, #36]

Section 5: 성능 최적화 및 트러블슈팅

Section Overview: 네트워크 실무에서 SDU 크기, PDU 구조, 계층별 문제 진단 및 최적화 방안을 다룬다.

5.1 SDU 크기 조정 및 네트워크 성능

Detail Overview: SDU 크기가 전송 효율, 패킷 드랍률, 네트워크 레이턴시 등에 직접 영향.

5.2 실무 트러블슈팅

실무 적용 및 베스트 프랙티스

프로토콜 설계 시 SDU 고려사항, 성능 튜닝, 보안 측면을 다룬다.

프로토콜 설계 가이드

새로운 프로토콜 설계 시 SDU 처리 원칙을 다룬다.

SDU 설계 원칙

  1. 명확한 서비스 경계:

    • 상위/하위 계층과의 인터페이스를 명시적으로 정의
    • SAP 주소 공간 설계
    • ICI 파라미터 최소화 (복잡도 감소)
  2. 투명성 보장:

    • SDU 내용을 해석하거나 수정하지 않음
    • End-to-End 원칙 준수
    • 중간 노드의 SDU 불투명성
  3. 효율적 크기 관리:

    • 적절한 최소/최대 SDU 크기 정의
    • 분할/재조립 메커니즘 설계
    • 오버헤드 최소화
  4. 에러 처리:

    • SDU 손실, 순서 뒤바뀜, 중복에 대한 처리
    • 재전송 정책
    • 타임아웃 설정

프로토콜 스펙 예시 (의사 규격):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Protocol: MyProtocol (Hypothetical)
Layer: N
Service: 신뢰성 있는 메시지 전달

1. SDU 정의
   - N-SDU: 가변 길이 바이트 배열
   - 최소 크기: 1 byte
   - 최대 크기: 65,535 bytes
   - 인코딩: 8-bit 바이너리

2. PDU 구조
   N-PDU = N-PCI + N-SDU
   
   N-PCI 필드:
   - Version (4 bits): 프로토콜 버전
   - Length (16 bits): SDU 길이 (bytes)
   - Sequence (32 bits): 순서 번호
   - Flags (8 bits): SYN, ACK, FIN, RST
   - Checksum (16 bits): CRC-16

3. 서비스 프리미티브
   - N-DATA.req(dest_addr, sdu, priority)
   - N-DATA.ind(src_addr, sdu)
   - N-DATA-ACK.req(seq_num)
   - N-DATA-ACK.cnf(seq_num, status)

4. SDU 분할
   - 최대 전송 단위: (하위 계층 MTU - N-PCI 크기)
   - 분할 시 Sequence 번호 증분
   - 재조립 버퍼: 10 × MTU

5. 에러 처리
   - Checksum 실패: SDU 폐기, NACK 전송
   - 순서 오류: 재정렬 버퍼 사용, 타임아웃 5초
   - 중복: Sequence 번호로 감지 및 제거

계층 간 인터페이스 설계 (API):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
class LayerNService:
    """
    N 계층 서비스 인터페이스 (추상 클래스)
    """
    
    def data_request(self, dest_addr, sdu, ici=None):
        """
        N-DATA.request 프리미티브
        
        Args:
            dest_addr: 목적지 SAP 주소
            sdu: N-SDU (bytes)
            ici: 인터페이스 제어 정보 (dict)
                - priority: 우선순위 (0-7)
                - qos: QoS 플래그
                - timeout: 타임아웃 (초)
        
        Returns:
            request_id: 요청 식별자
        
        Raises:
            ValueError: SDU 크기 초과
            ConnectionError: 연결 실패
        """
        # SDU 크기 검증
        if len(sdu) > self.MAX_SDU_SIZE:
            raise ValueError(f"SDU too large: {len(sdu)} > {self.MAX_SDU_SIZE}")
        
        # ICI 기본값 설정
        if ici is None:
            ici = {'priority': 0, 'qos': 'BEST_EFFORT'}
        
        # PDU 생성 (PCI + SDU)
        pdu = self._create_pdu(dest_addr, sdu, ici)
        
        # 하위 계층에 전달
        return self._send_to_lower_layer(pdu)
    
    def data_indication(self, src_addr, sdu):
        """
        N-DATA.indication 프리미티브
        
        Args:
            src_addr: 송신 SAP 주소
            sdu: N-SDU (bytes)
        """
        # 상위 계층에 전달
        self._deliver_to_upper_layer(src_addr, sdu)
    
    def _create_pdu(self, dest_addr, sdu, ici):
        """
        PDU 생성 (PCI + SDU)
        """
        pci = self._create_pci(dest_addr, len(sdu), ici)
        return pci + sdu
    
    def _create_pci(self, dest_addr, sdu_length, ici):
        """
        프로토콜 제어 정보 생성
        """
        # 실제 구현에서는 프로토콜 규격에 따라 헤더 생성
        pass
    
    def _send_to_lower_layer(self, pdu):
        """
        하위 계층 서비스 호출
        """
        # (N-1)-DATA.request(…) 호출
        pass
    
    def _deliver_to_upper_layer(self, src_addr, sdu):
        """
        상위 계층에 indication 전달
        """
        # 콜백 또는 이벤트로 상위 계층에 알림
        pass

성능 튜닝 체크리스트

실무 환경에서 SDU 관련 성능을 최적화하는 방법을 정리한다.

성능 튜닝 체크리스트:

항목확인 사항권장 값/설정영향
MTU네트워크 경로의 최소 MTU1500 (WAN), 9000 (LAN)분할 최소화
TCP 버퍼송수신 버퍼 크기BDP 기반 (BDP = Bandwidth × RTT)처리량 향상
Nagle 알고리즘실시간 vs 처리량실시간: OFF, 배치: ON지연 vs 효율
TCP Window Scaling대용량 전송 시 윈도우 크기RFC 7323 활성화고속 네트워크
QoS/ToS트래픽 분류 및 우선순위DSCP 설정 (EF, AF, BE)지연/손실률
Jumbo Frame데이터센터 내부MTU 9000오버헤드 감소
Header Compression무선/위성 링크ROHC, VJ Compression대역폭 절약

Linux 시스템 튜닝 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# TCP 버퍼 크기 증가 (BDP 기반)
# 예: 1 Gbps 네트워크, RTT 100ms → BDP = 12.5 MB
sudo sysctl -w net.core.rmem_max=134217728  # 128 MB
sudo sysctl -w net.core.wmem_max=134217728
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"

# TCP Window Scaling 활성화
sudo sysctl -w net.ipv4.tcp_window_scaling=1

# Nagle 알고리즘 제어 (애플리케이션 레벨)
# Python에서: sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

# MTU 설정 (Jumbo Frame)
sudo ip link set eth0 mtu 9000

# QoS 마킹 (iptables)
sudo iptables -t mangle -A OUTPUT -p tcp --dport 22 \
  -j DSCP --set-dscp-class EF  # SSH 트래픽 우선순위

BDP (Bandwidth-Delay Product) 계산 도구:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def calculate_optimal_buffer(bandwidth_mbps, rtt_ms):
    """
    최적 TCP 버퍼 크기 계산
    
    Args:
        bandwidth_mbps: 대역폭 (Mbps)
        rtt_ms: 왕복 지연 시간 (ms)
    
    Returns:
        최적 버퍼 크기 (bytes)
    """
    # BDP = Bandwidth × RTT
    bandwidth_bps = bandwidth_mbps * 1_000_000
    rtt_sec = rtt_ms / 1000
    bdp_bits = bandwidth_bps * rtt_sec
    bdp_bytes = bdp_bits / 8
    
    # 안전 마진 추가 (2x)
    optimal_buffer = int(bdp_bytes * 2)
    
    return optimal_buffer

# 사용 예시
print("최적 버퍼 크기 계산기")
print("-" * 40)

scenarios = [
    ("로컬 네트워크", 1000, 1),
    ("광역 네트워크", 100, 50),
    ("인터넷", 10, 100),
    ("위성 링크", 1, 600)
]

for name, bw, rtt in scenarios:
    buffer_size = calculate_optimal_buffer(bw, rtt)
    print(f"{name}: {bw} Mbps, RTT {rtt}ms")
    print(f"  권장 버퍼: {buffer_size:,} bytes ({buffer_size/1024/1024:f} MB)")
    print()

출력 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
로컬 네트워크: 1000 Mbps, RTT 1ms
  권장 버퍼: 250,000 bytes (0.2 MB)

광역 네트워크: 100 Mbps, RTT 50ms
  권장 버퍼: 1,250,000 bytes (1.2 MB)

인터넷: 10 Mbps, RTT 100ms
  권장 버퍼: 250,000 bytes (0.2 MB)

위성 링크: 1 Mbps, RTT 600ms
  권장 버퍼: 150,000 bytes (0.1 MB)

보안 및 인증

SDU/PDU 변환 과정 및 전달 시 보안·인증 관련 주요 개념을 설명한다.

캡슐화와 보안

각 계층의 헤더/트레일러에는 에러 제어, 인증 정보, 암호화 데이터 등이 추가된다.

보안 고려사항

SDU 처리 시 보안 위협과 대응 방안을 다룬다.

SDU 관련 보안 위협:

위협설명영향대응 방안
SDU 스니핑평문 SDU 도청기밀성 침해TLS/IPSec 암호화
SDU 변조전송 중 데이터 조작무결성 침해MAC, 디지털 서명
SDU 재전송 공격과거 SDU 재사용인증 우회Nonce, Timestamp
SDU 플러딩대량 SDU 전송으로 과부하가용성 침해Rate Limiting, DDoS 방어
SDU 단편화 공격악의적 IP 단편화방화벽 우회단편화 재조립 검증
SDU 크기 공격비정상 크기 SDU버퍼 오버플로크기 검증, 샌드박싱

TLS 를 통한 SDU 보호:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Application (L7):
  평문 SDU (민감 데이터)
TLS (L6/L7):
  암호화된 SDU
  [TLS Header] + Encrypted(평문 SDU) + MAC
TCP (L4):
  TCP SDU = 암호화된 TLS 레코드
  [TCP Header] + TLS PDU
IP (L3):
  IP SDU = TCP 세그먼트
  [IP Header] + TCP PDU

보안 강화 체크리스트:

코드 예시: SDU 크기 검증:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
class SecureSDUHandler:
    """
    보안이 강화된 SDU 처리기
    """
    
    MIN_SDU_SIZE = 1
    MAX_SDU_SIZE = 65535
    
    def validate_sdu(self, sdu):
        """
        SDU 크기 및 내용 검증
        
        Args:
            sdu: SDU 바이트 배열
        
        Raises:
            ValueError: 크기 초과/미달
            SecurityError: 악의적 패턴 탐지
        """
        # 크기 검증
        if len(sdu) < self.MIN_SDU_SIZE:
            raise ValueError(f"SDU too small: {len(sdu)} < {self.MIN_SDU_SIZE}")
        if len(sdu) > self.MAX_SDU_SIZE:
            raise ValueError(f"SDU too large: {len(sdu)} > {self.MAX_SDU_SIZE}")
        
        # 악의적 패턴 검증 (예: 반복 바이트)
        if self._detect_suspicious_pattern(sdu):
            raise SecurityError("Suspicious SDU pattern detected")
        
        return True
    
    def _detect_suspicious_pattern(self, sdu):
        """
        악의적 패턴 탐지 (간단한 예시)
        """
        # 동일 바이트 90% 이상 반복 시 의심
        if len(sdu) > 100:
            most_common = max(set(sdu), key=sdu.count)
            count = sdu.count(most_common)
            if count / len(sdu) > 0.9:
                return True
        return False
    
    def encrypt_sdu(self, sdu, key):
        """
        SDU 암호화 (TLS/IPSec 대신 간단한 예시)
        
        Args:
            sdu: 평문 SDU
            key: 암호화 키
        
        Returns:
            암호화된 SDU
        """
        from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
        from cryptography.hazmat.backends import default_backend
        import os
        
        # IV (Initialization Vector) 생성
        iv = os.urandom(16)
        
        # AES-256-CBC 암호화
        cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
        encryptor = cipher.encryptor()
        
        # 패딩 (PKCS7)
        padded_sdu = self._pkcs7_pad(sdu, 16)
        
        # 암호화
        encrypted = encryptor.update(padded_sdu) + encryptor.finalize()
        
        # IV + 암호문 반환
        return iv + encrypted
    
    def _pkcs7_pad(self, data, block_size):
        """
        PKCS7 패딩
        """
        padding_length = block_size - (len(data) % block_size)
        padding = bytes([padding_length] * padding_length)
        return data + padding

# 사용 예시
handler = SecureSDUHandler()

# 정상 SDU
normal_sdu = b"Hello, World!"
handler.validate_sdu(normal_sdu)  # 통과

# 비정상 SDU (너무 큼)
try:
    huge_sdu = b"A" * 100000
    handler.validate_sdu(huge_sdu)
except ValueError as e:
    print(f"검증 실패: {e}")

# SDU 암호화
key = os.urandom(32)  # 256-bit 키
encrypted_sdu = handler.encrypt_sdu(normal_sdu, key)
print(f"암호화된 SDU 크기: {len(encrypted_sdu)} bytes")

Workshops

네트워크 애플리케이션 SDU/PDU 흐름 진단 실습

시나리오: 실시간 대용량 메시지 전송 환경 (예: DB 서버 - 클라이언트) 에서 각 계층의 SDU/PDU 흐름, MTU/SDU 사이즈 협상, 실제 패킷 구조 분석.

수행 절차:

단계작업담당도구소요 시간
1TCP/UDP 세션 생성개발자Wireshark10 분
2SDU 크기 조정 (서버/클라이언트)인프라DB 설정, netstat20 분
3패킷 캡처, PDU 헤더 확인네트워크Wireshark20 분
4오류/추적 분석개발자로그 분석15 분

산출물:

수용 기준 (AC):


OSI 모델 계층별 SDU/PDU 실습 및 트러블슈팅

시나리오: OSI 7 계층 환경에서 각 계층별 SDU/PDU 개념 실습, 문제 발생 구간 위치 추적 및 진단.

수행 절차:

단계작업담당도구소요 시간
1계층별 SDU 정의교육생이론 정리10 분
2패킷 생성 및 캡슐화 실습교육생Wireshark15 분
3MTU/SDU 협상 시뮬레이션네트워크시뮬레이터10 분
4오류/성능 문제 추적교육생로그 분석, 시뮬레이션15 분

산출물:

수용 기준 (AC):

TCP 스트림에서 SDU 추적하기

시나리오:
네트워크 관리자로서 특정 TCP 연결의 애플리케이션 데이터 (L4-SDU) 를 추출하여 분석해야 한다. Wireshark 와 Python 을 사용하여 패킷 캡처 파일 (PCAP) 에서 HTTP 요청/응답을 재구성한다.

수행 절차:

단계작업담당도구소요 시간
1패킷 캡처 수행관리자Wireshark, tcpdump5 분
2TCP 스트림 식별분석가Wireshark (Follow TCP Stream)10 분
3SDU 추출 스크립트 작성개발자Python, Scapy30 분
4HTTP 메시지 재구성분석가스크립트 실행5 분
5결과 검증 및 분석수동 검증10 분

산출물:

  1. PCAP 파일: 캡처된 네트워크 트래픽
  2. Python 스크립트: SDU 추출 및 재구성 도구
  3. 재구성된 HTTP 메시지: 요청/응답 텍스트 파일
  4. 분석 보고서: 발견된 이상 패턴 문서

SDU 추출 스크립트 (Python + Scapy):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from scapy.all import rdpcap, TCP, Raw

def extract_tcp_stream_sdu(pcap_file, stream_id=0):
    """
    PCAP 파일에서 특정 TCP 스트림의 SDU를 추출
    
    Args:
        pcap_file: PCAP 파일 경로
        stream_id: 추출할 TCP 스트림 ID (0부터 시작)
    
    Returns:
        client_data, server_data: 클라이언트/서버 SDU (bytes)
    """
    packets = rdpcap(pcap_file)
    
    # TCP 스트림 식별 (src/dst IP:Port 쌍)
    streams = {}
    stream_counter = 0
    
    for packet in packets:
        if packet.haslayer(TCP):
            tcp = packet[TCP]
            ip = packet['IP']
            
            # 스트림 키 생성 (정규화: 작은 포트를 앞에)
            key = tuple(sorted([
                (ip.src, tcp.sport),
                (ip.dst, tcp.dport)
            ]))
            
            if key not in streams:
                streams[key] = {'id': stream_counter, 'packets': []}
                stream_counter += 1
            
            streams[key]['packets'].append(packet)
    
    # 요청한 스트림 찾기
    target_stream = None
    for key, stream in streams.items():
        if stream['id'] == stream_id:
            target_stream = stream
            break
    
    if not target_stream:
        raise ValueError(f"Stream {stream_id} not found")
    
    # SDU 추출 (TCP 페이로드)
    client_data = b''
    server_data = b''
    
    first_packet = target_stream['packets'][0]
    client_addr = (first_packet['IP'].src, first_packet[TCP].sport)
    
    for packet in target_stream['packets']:
        if packet.haslayer(Raw):
            payload = bytes(packet[Raw])
            
            # 방향 판별
            if (packet['IP'].src, packet[TCP].sport) == client_addr:
                client_data += payload
            else:
                server_data += payload
    
    return client_data, server_data

# 사용 예시
pcap_file = 'capture.pcap'

print("TCP 스트림 SDU 추출")
print("=" * 50)

client_sdu, server_sdu = extract_tcp_stream_sdu(pcap_file, stream_id=0)

print(f"클라이언트 SDU: {len(client_sdu)} bytes")
print(f"서버 SDU: {len(server_sdu)} bytes")
print()

# HTTP 요청 파싱 (간단한 예시)
if client_sdu.startswith(b'GET') or client_sdu.startswith(b'POST'):
    print("HTTP 요청:")
    print(client_sdu.decode('utf-8', errors='ignore')[:200])
    print()

# HTTP 응답 파싱
if server_sdu.startswith(b'HTTP/'):
    print("HTTP 응답:")
    print(server_sdu.decode('utf-8', errors='ignore')[:200])

수용 기준 (AC):

MTU 최적화 실습

시나리오:
VPN 터널 환경에서 애플리케이션 성능이 저하되고 있다. 원인을 진단하고 MTU/MSS 설정을 최적화하여 성능을 개선한다. 실제 네트워크 환경 또는 가상 환경 (VM, Docker) 에서 실습한다.

수행 절차:

단계작업담당도구소요 시간
1현재 MTU 확인엔지니어ip link show, netstat -i5 분
2Path MTU Discovery 테스트엔지니어ping -M do -s <size>10 분
3최적 MTU 값 결정엔지니어바이너리 서치10 분
4MTU 설정 변경관리자ip link set, sysctl5 분
5MSS Clamping 설정 (필요 시)관리자iptables5 분
6성능 측정 (전/후)엔지니어iperf3, netperf15 분
7결과 분석 및 문서화스프레드시트, 보고서10 분

산출물:

  1. 현재 상태 진단 보고서: MTU 값, PMTUD 결과, 성능 메트릭
  2. 최적 MTU 값: 경로별 권장 MTU
  3. 설정 변경 스크립트: 자동화된 MTU 설정 도구
  4. 성능 개선 측정 결과: Before/After 처리량, 지연, 재전송률

MTU 최적화 스크립트 (Bash):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/bin/bash
# MTU 최적화 도구

TARGET_HOST="example.com"
INTERFACE="eth0"

echo "=== MTU 최적화 도구 ==="
echo ""

# 1. 현재 MTU 확인
echo "[1] 현재 MTU 확인"
current_mtu=$(ip link show $INTERFACE | grep -oP 'mtu \K[0-9]+')
echo "  인터페이스 $INTERFACE MTU: $current_mtu"
echo ""

# 2. Path MTU Discovery (바이너리 서치)
echo "[2] Path MTU Discovery (대상: $TARGET_HOST)"
min_mtu=68
max_mtu=1500
optimal_mtu=$min_mtu

while [ $min_mtu -le $max_mtu ]; do
    mid=$(( (min_mtu + max_mtu) / 2 ))
    # ICMP 헤더 8 bytes 제외
    payload_size=$(( mid - 28 ))
    
    echo -n "  테스트 MTU $mid … "
    
    # Don't Fragment 플래그로 ping
    if ping -M do -c 1 -W 1 -s $payload_size $TARGET_HOST > /dev/null 2>&1; then
        echo "성공"
        optimal_mtu=$mid
        min_mtu=$(( mid + 1 ))
    else
        echo "실패 (단편화 필요)"
        max_mtu=$(( mid - 1 ))
    fi
done

echo ""
echo "  최적 MTU: $optimal_mtu"
echo ""

# 3. MTU 설정 변경 제안
if [ $optimal_mtu -lt $current_mtu ]; then
    echo "[3] MTU 변경 권장"
    echo "  현재: $current_mtu → 권장: $optimal_mtu"
    echo ""
    echo "  변경 명령어:"
    echo "    sudo ip link set $INTERFACE mtu $optimal_mtu"
    echo ""
    
    # 사용자 확인
    read -p "  지금 변경하시겠습니까? (y/n): " confirm
    if [ "$confirm" = "y" ]; then
        sudo ip link set $INTERFACE mtu $optimal_mtu
        echo "  MTU 변경 완료"
    fi
else
    echo "[3] 현재 MTU가 최적값입니다."
fi

echo ""

# 4. MSS Clamping 확인
echo "[4] TCP MSS Clamping 확인"
optimal_mss=$(( optimal_mtu - 40 ))  # IP(20) + TCP(20)
echo "  최적 MSS: $optimal_mss"
echo ""
echo "  MSS Clamping 설정 (VPN/터널 환경 권장):"
echo "    sudo iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \\"
echo "      -j TCPMSS --set-mss $optimal_mss"
echo ""

# 5. 성능 테스트 제안
echo "[5] 성능 테스트 명령어"
echo "  처리량 측정:"
echo "    iperf3 -c $TARGET_HOST"
echo ""
echo "  지연 측정:"
echo "    ping -c 100 $TARGET_HOST | tail -1"
echo ""

echo "=== 완료 ==="

수용 기준 (AC):


Final Summary

SDU(Service Data Unit) 는 OSI 참조 모델에서 계층 간 서비스 인터페이스를 통해 전달되는 데이터 단위로, 각 계층이 상위 계층에게 제공하는 투명한 페이로드이며, PDU(Protocol Data Unit) 와 함께 캡슐화 원칙의 핵심을 이루어 프로토콜 독립성과 모듈화를 가능하게 하는 네트워크 아키텍처의 기본 개념이다.

SDU 는 1984 년 ISO 7498 표준에서 OSI 참조 모델의 일부로 공식 정의되었으며, 계층화된 네트워크 아키텍처에서 인접 계층 간 서비스 경계를 명확히 하기 위해 도입되었다. 각 계층 (N) 은 상위 계층 (N+1) 으로부터 N-SDU 를 받아 자신의 프로토콜 제어 정보 (PCI) 를 추가하여 N-PDU 를 생성하고, 이를 하위 계층 (N-1) 에 (N-1)-SDU 로 전달한다.
SDU 의 핵심 특징은 투명성 (transparency) 으로, 각 계층은 SDU 의 내용을 해석하거나 수정하지 않고 불투명한 데이터로 취급한다. 이는 계층 간 독립성을 보장하고 프로토콜 교체 및 독립적 개발을 가능하게 한다. SDU 는 PDU, PCI, SAP, ICI 와 함께 OSI 모델의 캡슐화 메커니즘을 구성한다.

SDU 처리에서 가장 중요한 트레이드오프는 효율성과 오버헤드 간의 균형이다. 작은 SDU 는 실시간성은 높지만 상대적 헤더 오버헤드가 크며 (10 bytes SDU 시 680% 오버헤드), 큰 SDU 는 효율적이나 분할 (segmentation) 과 재조립 (reassembly) 의 복잡성이 증가한다. MTU 와 MSS 설정은 네트워크 경로의 제약과 응용의 요구사항을 동시에 고려해야 하며, Path MTU Discovery(PMTUD) 가 ICMP 차단으로 실패할 경우 MTU 블랙홀 현상이 발생할 수 있다. 또한 Nagle 알고리즘은 작은 SDU 를 결합하여 오버헤드를 줄이지만 지연을 증가시켜, 실시간 애플리케이션에서는 비활성화가 필요하다. 보안 측면에서는 SDU 의 암호화 (TLS/IPSec) 가 기밀성을 보장하지만 추가 오버헤드와 처리 지연을 초래한다.

OSI 모델의 SDU 개념은 이론적으로 명확하나 실제 TCP/IP 구현에서는 계층 융합 (layer blending) 과 최적화로 인해 엄격한 SDU/PDU 구분이 모호해지는 경우가 많다. 예를 들어, TLS 는 프레젠테이션 계층 역할을 하지만 실제로는 애플리케이션 계층 라이브러리로 구현된다. 또한 QUIC 과 같은 현대 프로토콜은 전송 계층과 세션 계층 기능을 통합하여 기존 SDU 모델로는 설명이 어렵다. 향후 학습 과제로는 (1) TCP/IP 와 OSI 모델 간 SDU 매핑 심화, (2) 소프트웨어 정의 네트워킹 (SDN) 에서의 SDU 처리 방식, (3) QUIC, HTTP/3 등 차세대 프로토콜의 데이터 단위 개념, (4) 네트워크 가상화 환경 (NFV, 컨테이너) 에서의 SDU 최적화 기법을 탐구할 것을 권장한다.


Learning Guide

단계목표 (Outcome)추천 자료 (Seed 기반)과제 (Task)평가 기준 (Rubric)실습 포함
기초OSI 모델 이해 및 SDU/PDU 구별ISO/IEC 7498-1 표준, 네트워크 기초 교재SDU 와 PDU 정의 정리, 계층별 명칭 암기, 간단한 캡슐화 예시 작성용어를 정확히 설명 가능, 계층별 SDU 명칭 식별 가능(선택)
응용실제 프로토콜에서 SDU 식별 및 추적Wireshark 가이드, TCP/IP IllustratedWireshark 로 TCP 스트림 분석, HTTP 요청/응답 SDU 추출, Python 스크립트로 SDU 파싱패킷 캡처에서 SDU 를 정확히 추출, 계층별 캡슐화 단계를 도식화필수 (Workshop 1)
실무SDU 최적화 및 성능 튜닝RFC 1191 (PMTUD), 리눅스 네트워크 튜닝 가이드MTU/MSS 최적화 프로젝트, VPN 환경 성능 개선, TCP 버퍼 크기 조정성능 측정 결과 개선 확인, 최적화 전/후 비교 문서화, 팀에 공유필수 (Workshop 2)
심화프로토콜 설계 및 SDU 보안 강화RFC 8446 (TLS 1.3), QUIC 표준새로운 프로토콜 설계 (SDU/SAP 정의 포함), 보안 위협 분석 및 대응 방안 구현, QUIC 의 SDU 개념 연구프로토콜 스펙 작성, 보안 검증 테스트 통과, 최신 프로토콜 트렌드 분석 발표(선택)

실습 1: TCP 스트림에서 SDU 추출 (응용 단계)

실습 2: MTU 최적화 프로젝트 (실무 단계)


Terminology

Term EN (ko, abbr)정의역할/맥락관련 개념Flags
Service Data Unit (SDU, 서비스 데이터 단위)(N+1) 계층이 N 계층에 전달하는 의미 보존 데이터 단위상→하 전달 단위, 캡슐화 입력PDU, SAP, Payloadcore
Protocol Data Unit (PDU, 프로토콜 데이터 단위)N 계층이 SDU 에 **PCI(헤더/트레일러)**를 부가해 만든 전송 단위동계층 피어 간 교환 단위SDU, PCI, Encapsulationcore
Protocol Control Information (PCI)PDU 에 추가되는 제어 정보 (주소/길이/플래그 등)프로토콜 동작 (라우팅/무결성/흐름)Header, Trailercore
Encapsulation / De-encapsulation (캡슐화/역캡슐화)SDU 에 PCI 를 추가해 PDU 로 포장 / 수신 시 헤더 제거해 SDU 복원계층 간 전달 메커니즘Tunneling, Overlaycore
Payload (페이로드)PDU 내부의 사용자 데이터 (상위 계층 SDU)실전 업무 데이터SDU, PDUcore
Header / Trailer (헤더/트레일러)PDU 앞/끝에 붙는 제어 정보 영역 (예: 주소, FCS)오류 검출·라우팅·식별PCI, Checksum, FCS/CRCcore
Segmentation (세그멘테이션)큰 **SDU(주로 L4 데이터)**를 여러 PDU 로 분할전송계층 분할, MSS 기준Reassembly, MSSperf
Reassembly (재조립)분할/단편화된 단위를 수신 측에서 원 SDU 로 복원수신 지연·버퍼 영향Segmentation, Fragmentationperf
Fragmentation (단편화)IP 패킷이 MTU 초과 시 L3 에서 조각화MTU 불일치 대응 (성능 페널티)DF, PMTUDL3
Maximum Transmission Unit (MTU)링크가 한 번에 운반 가능한 IP 패킷 최대 크기 (IP MTU)분할/단편화 기준, 경로 호환성MSS, PMTUD, Jumboperf
Maximum Segment Size (MSS)TCP 세그먼트 페이로드 최대값 (보통 MTU−IP−TCP)TCP 분할 기준·단편화 회피MTU, TCP 옵션perf
PMTUD / PLPMTUD경로 최소 MTU 동적 탐지 (ICMP / 상위계층 Probe)블랙홀 회피·최대 크기 결정DF, ICMP PTBperf
DF (Don’t Fragment)IPv4 헤더 플래그 (단편화 금지)PMTUD 유도·보호FragmentationL3
Service Access Point (SAP)계층 경계의 논리 인터페이스SDU 가 통과하는 접점·멀티플렉싱TSAP(포트), NSAPstd
TSAP / NSAP전송/네트워크 계층 SAP; 현대 TCP/IP 에선 포트/IP에 대응멀티플렉싱·디멀티플렉싱 기준SAP, Port, IPstd
Interface Control Information (ICI)서비스 프리미티브와 함께 전달되는 제어 파라미터서비스 요청/응답 메타데이터Primitive, SAPstd
Service Primitive (프리미티브)Request/Indication/Response/Confirm서비스 인터페이스 추상화SAP, ICIstd
Multiplexing / Demultiplexing상위 다중 흐름→하위 하나 / 하위 하나→상위 다중자원 공유·흐름 분배SAP, Port, 5-tuplecore
Transparency (투명성)SDU 내용이 서비스 제공 계층에서 해석/변경되지 않음계층 독립성·모듈성Encapsulationprinciple
Layering (계층화)기능을 독립 계층으로 분리하는 설계 원칙모듈화·추상화·재사용성OSI Model, TCP/IPprinciple
End-to-End Principle (종단 간 원칙)기능은 가능한 한 종단에 배치중간 노드 단순화Transparencyprinciple
BDP (Bandwidth-Delay Product)경로에 체류 가능한 데이터량 B×RTTTCP 버퍼/윈도우 설정 기준TCP Window, RWINperf
Nagle Algorithm / TCP_NODELAY작은 세그먼트 결합 / 즉시 전송 옵션오버헤드↔지연 트레이드오프Segmentation, Latencyperf
Jumbo FrameMTU ≥ 9000 인 이더넷 프레임DC 내부 처리량/CPU 절감MTU 일관성, PMTUDperf
Header Compression (ROHC/VJ)IP/TCP/UDP 헤더 압축저대역폭·무선 최적화ECN, 링크 특성perf
TLS (TLS Record)상위 계층 데이터의 암·무결성 (레코드 단위)보안·오버헤드 (≈21B)QUIC, IPsecsec
IPsec (ESP/AH)L3 보안 (터널/트랜스포트)MTU 오버헤드·MSS 조정PMTUD, MSS Clampsec
MSDU / MPDU (802.11)MAC 상위 SDU / MAC PDUWi-Fi 전송 단위A-MSDU, A-MPDU802.11
A-MSDU / A-MPDU여러 MSDU 를 하나 MPDU 로 / 여러 MPDU 를 묶어 전송헤더 절감 / 재전송 효율MSDU, MPDU802.11
PDCP SDU / RLC SDU (3GPP)상위→PDCP / PDCP→RLC 로 전달 SDULTE/NR 스택 단위PDCP/RLC PDU3gpp
AAL5 SDU (ATM)AAL5 가 운반하는 상위 SDUATM 계열 적응 계층AAL5 PDUatm
6LoWPAN SDU저전력 PAN 에서의 IPv6 SDU(링크 관점)IoT 적응/단편화6LoWPAN Fragmentiot
APDU / TPDU응용/전송 계층 PDU 명칭 (문맥 의존)PDU 용어 구분Segment, PDUnote

References