CS

OSI 7 계층(1)

Daesiker 2025. 4. 28. 23:30
반응형

정의

네트워크 통신이 일어날 때 어떻게 전송되고 처리되는지 단계별로 나눈 모델

구조

계층 이름 주요 역할 예시
7 응용 계층 (Application) 사용자 인터페이스 제공 웹 브라우저, 이메일 앱
6 표현 계층 (Presentation) 데이터 변환, 암호화, 압축 JPEG, MP4, SSL/TLS
5 세션 계층 (Session) 통신 연결 관리 (열기/닫기) 로그인 세션, API 세션 유지
4 전송 계층 (Transport) 데이터의 정확한 전송 보장 TCP, UDP
3 네트워크 계층 (Network) 경로 설정, 주소 지정 IP, ICMP
2 데이터 링크 계층 (Data Link) 데이터 프레임 전송, 오류 검출 Ethernet(이더넷), MAC 주소
1 물리 계층 (Physical) 0과 1 신호로 전기/광 전송 랜선, 광케이블, Wi-Fi 신호

 

데이터 링크 계층

MAC 주소란?

  • 네트워크 카드마다 부여된 고유 식별 번호
  • 하드웨어 레벨에서 통신할 때 사용
  • IP주소 대신 MAC 주소로 실제 데이터 전송이 이루어짐

Ethernet(이더넷)이란?

  • 근거리 통신망을 연결하는 가장 보편적인 기술
  • MAC주소를 사용하여 데이터를 전달
  • 패킷이나 프레임 단위로 데이터를 전송

 

네트워크 계층

데이터를 목적지까지 어떻게 보낼지 결정하는 계층

데이터를 IP 주소 기반으로 목적지까지 전달하는 역할

라우팅과 패킷 분할/재조림이 일어나는 부분

iOS에서 네트워크 계층이란?

let url = URL(string: "https://api.example.com/user")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // 응답 처리
}
task.resume()

전송 계층

애플리케이션간 데이터 전달을 신뢰성 있게 관리하는 계층

데이터가 잘 전달되도록 패킷의 순서, 오류, 누락 여부를 책임진다.

네트워크 계층이 길을 찾으면, 안전하게 전송이 되었는지 체크하는 부분

대표 프로토콜

 

프로토콜 특징 iOS에서 예시
TCP (Transmission Control Protocol) 신뢰성 있음 (순서 보장, 재전송) URLSession, Alamofire 요청
UDP (User Datagram Protocol) 신뢰성 없음 (빠르지만 순서/재전송 보장 안함) 실시간 게임, 스트리밍, WebRTC

 

TCP 프로토콜

  • 정확하고 안전해야 할 때 사용
  • ex) REST API 요청, 파일 다운로드
  • 데이터가 중간에 잘리면 다시 요청한다.
  • 데이터 순서가 어긋나면 다시 정렬한다.
  • 데이터가 누락되면 감지하고 복구한다.

UDP 프로토콜

  • 빠른 반응이 필요할 경우 사용하는 프로토콜
  • 소켓 통신에 사용하는 프로토콜
  • 빠르지만 실패할 수 있다send() 성공했다고 해도 실제로 도착했는지는 알 수 없음
  • 순서가 보장되지 않는다 → 여러 패킷 보내면 순서가 섞일 수도 있다.
  • 끊김이 없다 → 연결 상태를 굳이 유지/관리할 필요 없다.

iOS에서 UDP 클라이언트 코드 예시

import Network

class UDPClient {
    private var connection: NWConnection?
    
    init(host: String, port: UInt16) {
        connection = NWConnection(
            host: NWEndpoint.Host(host),
            port: NWEndpoint.Port(rawValue: port)!,
            using: .udp
        )
    }
    
    func start() {
        connection?.start(queue: .global())
    }
    
    func send(message: String) {
        let data = message.data(using: .utf8)!
        connection?.send(content: data, completion: .contentProcessed { error in
            if let error = error {
                print("Send error: \(error)")
            } else {
                print("Message sent!")
            }
        })
    }
    
    func receive() {
        connection?.receive(minimumIncompleteLength: 1, maximumLength: 65535) { data, _, isComplete, error in
            if let data = data, let response = String(data: data, encoding: .utf8) {
                print("Received response: \(response)")
            } else if let error = error {
                print("Receive error: \(error)")
            }
        }
    }
    
    func stop() {
        connection?.cancel()
    }
}
반응형