반응형
정의
네트워크 통신이 일어날 때 어떻게 전송되고 처리되는지 단계별로 나눈 모델
구조
계층 | 이름 | 주요 역할 | 예시 |
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()
}
}
반응형