WinCNT

네트워크로 데이터를 송신하는 과정 본문

게임 프로그래밍(학습 내용 정리)/네트워크 프로그래밍

네트워크로 데이터를 송신하는 과정

WinCNT_SSS 2022. 4. 26. 12:21
성공과 실패를 결정하는 1%의 네트워크 원리의 2장의 일부를 참고해서 정리한 글입니다

1. 소켓을 작성한다

프로토콜 스택: OS에 내장된 네트워크 제어용 소프트웨어

네트워크 통신을 하기 위한 요청 준비라고 생각하자

프로토콜 스택은 OS가 관리한다

 

주소 - 내 컴퓨터(LAN 카드 - NIC)

프로세스 - 패킷을 송수신 - 포트 번호로 패킷을 주고 받음

netstat -ano
네트워크 스테이트
현재 생성된 모든 소켓을 보여준다

nslookup
도메인 네임에 매핑된 IP 주소를 알려준다

tracert
트레이스 라우트
특정사이트에 접속하기 까지의 IP 경로 추적

ICMP(Internet Control Message Protocol)

 

소켓의 실체는 통신 제어용 제어 정보

프로토콜 스택은 내부에 제어 정보를 기록하는 메모리 영역을 가지고 있다

(통신 상대의 IP 주소, 포트 번호, 통신 동작 등등)

 

소켓은 개념적인 것이어서 실체가 없으므로

굳이 말하자면 이 제어 정보가 소켓의 실체라고 할 수 있다

또는 제어 정보를 기록한 메모리 영역이 소켓의 실체라고 생각할 수도 있다

 

프로토콜 스택은 이 제어 정보를 참조하면서 동작한다

gethostbyname()은 API, 도메인 이름에서 IP 주소를 얻어온다

2. 서버에 접속한다

소켓을 만들 때 TCP/UDP인지를 지정한다

TCP인 경우

Connect

어떤 패킷을 주고 받음 - 상대편에게 연결할 것이라 알림

Close - 연결 끊기

어떤 패킷을 주고 받음 - 상대편에게 연결 끊을 거라고 알림

Listen

Accept 연결, 1-1로 통신 준비

송수신

 

IP와 이너넷의 패킷 송수신 동작

TCP에서 연결이 되어 있으면 패킷을 송수신한다

프로토콜 스택과 LAN 어댑터가 연대하여

작은 조각으로 분할한 데이터패킷 형태로 묶고

그것을 전기나 빛 신호로 변환하여 케이블에 송출한다

UDP인 경우

클라이언트 입장에서는 Connect할 때마다 주소를 설정해야 한다

sendto(주소...)

서버 입장에서는 어떤 클라이언트가 보냈는지 모른다

recvFrom(누가 보냈나)

 

TCP 헤더의 포맷

3. 데이터를 송수신한다

프로토콜 스택은 받은 데이터의 내용에 무엇이 쓰여있는지 알지 못 한다
write를 호출할 때 송신 데이터의 길이를 지정하지만 프로토콜 스택은 해당 길이만큼만

바이너리 데이터가 1바이트씩 차례로 나열되어 있다고 인식할 뿐이다

 

프로토콜 스택은 받은 데이터를 곧바로 송신하는 것이 아니라

일단 자체의 내부에 있는 송신용 버퍼 메모리 영역에 저장하고,

어플리케이션이 데이터를 건네주기를 기다린다

 

MTU와 MSS

MTU(Maximum Transmission Unit)

패킷 한 개로 운반할 수 있는 디지털 데이터의 최대 길이

이더넷에서는 보통 1500바이트

 

MSS(Maximum Segment Size)

헤더를 제외하고 한 개의 패킷이 운반할 수 있는 TCP 데이터의 최대 길이

스트림 데이터

 

TCP의 경우

보낼 데이터를 MSS 단위로 자른 뒤에 보내고, 수신자의 recv소켓 버퍼에 복구한다

 

HTTP는 TCP의 상위 계층이기 때문에 TCP 기반으로 움직힌다

 

SSS