[게임 서버] 3.5 수신 버퍼가 가득 차면 발생하는 현상
카테고리: GameServer
태그: GameServer
📦 3. 소켓 프로그래밍
👉🏻 항목 5: 수신 버퍼가 가득 차면 발생하는 현상
📥 TCP에서의 수신 버퍼 동작
recv() 함수의 특징:
recv()는 1바이트라도 수신할 수 있다면 즉시 리턴, 이 외는 블로킹
수신 속도가 느린 경우:
- TCP에서 수신 함수가 수신 버퍼에서 꺼내는 속도가 운영체제가 수신 버퍼의 데이터를 채우는 속도보다 느린 경우:
- 수신 측: 수신 버퍼가 꽉 참
- 송신 측: 송신 함수
send()가 블로킹
- 위의 상태가 유지된다
📮 UDP에서의 수신 버퍼 동작
recvfrom() 함수의 특징:
- 데이터그램이 최소 1개 도착했다면 즉시 리턴, 이 외는 블로킹
수신 속도가 느린 경우:
- UDP에서 수신 함수가 수신 버퍼에서 꺼내는 속도가 운영체제가 수신 버퍼의 데이터를 채우는 속도보다 느린 경우:
- 수신 측: 수신 버퍼가 꽉 참
- 송신 측: 송신 함수
send()는 멈추지 않음. 즉, 보내진 데이터는 버려짐
🌐 라우터에서의 패킷 처리
라우터의 역할:
- 여러 곳에서 도착하는 패킷 처리
처리 능력 초과 시:
- 초당 처리 패킷량을 넘어서면 패킷을 늦게 처리하거나 버림
⚖️ TCP vs UDP 송신 특성 비교
TCP의 흐름 제어:
- TCP에서 송신자는 수신자의 수신 성능에 맞춰 조정함
UDP의 송신 방식:
- UDP에서 송신자는 수신자의 수신 성능을 고려하지 않고 마구잡이로 보냄
혼잡 현상:
- → UDP가 마구잡이로 보내는 경우, TCP는 네트워크 경쟁에서 밀림
- → 이를 혼잡 현상이라고 함
🧐 정리
| 항목 | TCP | UDP |
|---|---|---|
| 수신 조건 | 1바이트라도 있으면 리턴 | 데이터그램 1개라도 있으면 리턴 |
| 버퍼 가득 시 송신 측 | send() 블로킹 |
send() 계속 실행 (데이터 버려짐) |
| 흐름 제어 | 수신자 성능에 맞춰 조정 | 수신자 성능 고려 안 함 |
| 네트워크 혼잡 대응 | 속도 조절 | 속도 조절 없음 |
- TCP는 흐름 제어를 통해 수신자의 수신 능력을 고려하여 안정적인 데이터 전송을 보장한다
- UDP는 흐름 제어가 없어 빠르지만 데이터 손실이 발생할 수 있다
- UDP의 무분별한 전송은 네트워크 혼잡을 야기하여 TCP 통신에 영향을 줄 수 있다
댓글남기기