Skip to content

Commit

Permalink
Feat : [Network] 소켓 통신 (#24)
Browse files Browse the repository at this point in the history
  • Loading branch information
daeun088 authored Jan 11, 2025
1 parent 7105ea9 commit ba31f1c
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions Network/Socket.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
## 1️⃣ 소켓이란?

소켓은 네트워크 통신에서 데이터를 주고받는 **인터페이스**입니다. 데이터를 송수신하기 위해 반드시 소켓을 거쳐 전송 계층으로 데이터를 전달해야 한다.
즉, 클라이언트와 서버가 **소켓**을 통해 데이터를 교환한다.

---

## 2️⃣ 소켓의 종류

### TCP **(스트림 소켓)**

- 연결 지향적(Connection-oriented).
- 데이터의 신뢰성을 보장 (데이터 손실, 순서 뒤바뀜 방지).
- 연결을 먼저 설정(3-way handshake) 후 데이터 송수신.
- 데이터를 스트림(stream) 형태로 전송.

### UDP **(데이터그램 소켓)**

- 비연결 지향적(Connectionless).
- 데이터 신뢰성이 보장되지 않음.
- 빠른 데이터 전송이 필요할 때 사용.

---

## 3️⃣ 소켓 통신의 흐름

소켓 통신은 클라이언트-서버 모델로 작동한다.

![Socket.png](https://velog.velcdn.com/images/newdana01/post/817b8ba8-4428-4e66-8128-7c01b554f8ff/image.png)

### **서버 측 동작**

1. **소켓 생성**: `socket()`
2. **IP/포트 바인딩**: `bind()`
3. **연결 대기**: `listen()`
4. **클라이언트 요청 수락**: `accept()`
5. **데이터 송수신**: `send()/recv()`
6. **소켓 종료**: `close()`

### **클라이언트 측 동작**

1. **소켓 생성**: `socket()`
2. **서버 연결 요청**: `connect()`
3. **데이터 송수신**: `send()/recv()`
4. **소켓 종료**: `close()`

---

## 🔄 HTTP 통신 VS 소켓 통신

| **항목** | **HTTP 통신** | **소켓 통신** |
| ------------- | -------------------------- | ----------------------------- |
| **연결 방식** | 요청-응답마다 연결 | 연결이 지속됨 |
| **통신 방향** | 단방향 (클라이언트 → 서버) | 양방향 (클라이언트 ↔ 서버) |
| **사용 사례** | 웹 브라우징, REST API | 실시간 채팅, 온라인 게임, IoT |

- **HTTP 통신**: 실시간 연결이 필요하지 않고, 요청-응답으로 데이터만 전달하면 충분한 경우.
- **소켓 통신**: 클라이언트와 서버가 실시간으로 계속 데이터를 주고받아야 하는 경우.

---

## ⚠️ 소켓 통신의 문제점

1. **포트 충돌**: 이미 사용 중인 포트를 사용할 경우 오류 발생.
2. **방화벽**: 방화벽 설정으로 인해 연결이 차단될 수 있음.
3. **타임아웃**: 클라이언트-서버 간 응답 시간이 너무 길 경우 연결이 끊길 수 있음.

[참고자료](https://helloworld-88.tistory.com/215)

0 comments on commit ba31f1c

Please sign in to comment.