티스토리 뷰
네트워크를 공부하던 중, “소켓은 결국 파일이다.” 라는 말과 운영체제에서의 소켓과 Websocket은 어떻게 다른지 궁금해서 찾아보았다.
NodeJS의 소켓
- 추상화된 고수준 인터페이스
- 실제로는 내부적으로 OS 소켓 API를 호출해서 커널 모드와 통신한다.
운영체제에서의 소켓
- User Mode: 우리가 실행하는 앱이나 코드 (ex. Node.js)
- Kernel Mode: OS 내부 (디바이스 제어, 메모리 관리, 네트워크 통신 등)
네트워크 통신을 하려면, 유저모드에서 시스템 콜을 통해 커널 모드에게 요청해야한다.
네트워크 통신 뿐만 아니라, 유저모드와 커널 모드가 통신하기 위해서는 인터페이스가 필요하다. 그것이 파일로 구성되어있고 이를 소켓이라고 부른다. 이때, 소켓을 여는 주체는 프로세스이다.
유저 모드에서는 소켓을 사용하지만, 실제 통신은 커널이 한다.
소켓도 파일이다?
- 리눅스/유닉스 기반 운영체제에서는 “모든 것은 파일이다” 라는 철학이 있다.
- 소켓도 내부적으로는 파일 디스크립터로 관리된다.
- 소켓도 파일처럼 read(), write() 시스템 콜로 다룰 수 있다.
- 소켓은 결국 파이프 같은 것이다. 소켓은 데이터의 전달만 책임질 뿐, 그 안에 담는 의미는 모른다.
소켓 = 특수한 종류의 파일 디스크립터
- 일반 파일 : 디스크에 있는 데이터를 읽고 씀
- 소켓 : 네트워크를 통해 다른 컴퓨터와 데이터를 주고 받음
REST API vs WebSocket
공통점
✅ REST API와 Socket 통신 모두 소켓 기반
- 둘 다 내부적으로 TCP/IP 소켓을 사용해서 데이터를 주고받음
- 둘 다 OS 커널의 소켓 API를 호출해서 파일 디스크립터를 통해 네트워크 I/O를 함
차이점
- 통신 방식
구분 REST API Socket 통신 (ex. WebSocket)
프로토콜 | HTTP | TCP or WebSocket (위에 TCP) |
연결 방식 | 요청-응답 후 연결 끊김 | 한 번 연결 후 계속 유지 |
메시지 방향 | 클라이언트 → 서버 (단방향) | 양방향, 실시간 가능 |
구조 | stateless (상태 없음) | stateful (상태 유지) |
둘 다 내부적으로 커널 모드에서 TCP 소켓을 열고 데이터를 주고받지만
REST는 그 위에 HTTP 프로토콜을 얹어서 “요청-응답 모델”로 추상화
Socket은 좀 더 원초적인 방식으로 계속 열린 통신 채널을 쓰는 모델
WebSocket이 HTTP 위에서 작동한다는 것이 무엇인가?
WebSocket은 HTTP 위에서 동작한다고 했다. 이 말은 WebSocket 연결을 만들 때, 처음에는 HTTP 프로토콜을 사용한다는 것을 의미한다. 실제로, WebSocket 핸드쉐이크 요청을 통해 이후 실시간 통신을 시작한다.
GET /chat HTTP/1.1
Host: example.com
**Upgrade: websocket**
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
이 HTTP 요청은 HTTP 연결을 WebSocket으로 업그레이드하고 싶다는 뜻이다. 이때, 서버가 허용할 경우 HTTP 연결이 WebSocket 연결로 바뀐다. 그리고 나서부터는 더이상 HTTP 규칙을 따르지 않으며, 양방향 프레임 기반 실시간 통신을 시작한다.
그렇다면 왜 소켓이 REST API보다 원초적인 방법인가?
REST API는 HTTP 프로토콜으로만 이루어져있다. 하지만 WebSocket은 처음에만 실시간 통신 연결하기 위해 HTTP 프로토콜을 사용하고 그 이후에는 HTTP는 끝난다. 양쪽은 TCP 소켓을 통해 WebSocket 프로토콜로 통신을 시작한다. 이때, “원초적인 소켓 방식”으로 전환된다. 이것이 가능한 이유는 HTTP 가 끝난 뒤에 TCP 소켓이 그대로 유지되고, 그 위에 WebSocket 자체의 프레임 기반 프로토콜이 시작되기 때문이다. 즉, WebSocket은 자체 메시지 포맷이 있다.
'👩🏻💻개발공부 > 네트워크' 카테고리의 다른 글
네트워크 스터디 1주차 (3) | 2025.01.03 |
---|---|
프로토콜 (0) | 2025.01.03 |
네트워크가 데이터를 전송하는 방식 - 패킷 교환, 회선 교환 (0) | 2025.01.03 |
- Total
- Today
- Yesterday
- nodejs
- MySQL
- 교환학생
- JS
- googleapis
- Signal
- JavaScript
- SQL
- 해커톤
- 혼공
- 혼공단
- 백준
- C++
- 깃 예제
- 공룡책
- 백엔드 개발
- 운영체제
- 리눅스
- 혼공학습단
- 개발
- 스페인 교환학생
- Linux
- 자바스크립트
- AWS
- 개발일지
- 스페인
- 혼공단 9기
- Process
- 혼공단 SQL
- 프로젝트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |