250311
앞시간에 pipeline실습돌려봄(이건 1w2에 정리)
네트워크 프로그래밍 ( = 소켓 프로그래밍 )
네트워크를 통해 여러 프로그램이 데이터를 주고받는 것을 의미함.
위치에 구애받지 않고, 모든 프로그램은 네트워크프로그래밍을 통해 구현된다!
우리는 네트워크 프로그래밍을 이해하기 위해 소켓을 다룰 줄 알아야함!~
파일 I/O와 거의 같다..
└ 디스크에서 데이터를 읽고 쓴다..주요 함수로는
open() : 파일을 열어 디스크와 연결
read(), write() : 파일에서 데이터를 읽고 쓴다
close() : 파일을 닫음
cpp에서의 stream은 잊을 것.. os에서 제공해주는 게 아니다!
네트워크 I/O는..
└ 네트워크를 통해 데이터를 송수신!
connect() : 상대방(서버)와 연걸
send(), recv() : 데이터를 송수신
close() : 소켓을 닫음연결하려면 해당 컴퓨터의 주소를 알아야함(내 컴퓨터와 상대방의 컴퓨터..)
주소를 확인하는 방법은? cmd창 열고 ipconfig친 다음 IPv4를 확인한다
파일 I/O는.. 파일 이름(경로)를 기반으로 동작하지만,
네트워크 프로그래밍은 IP주소(네트워크 주소)를 사용해야 한다..!
ex..)
파일 이름 : hellome.txt, 울랄라.mp3네트워크 주소 : 111.231.123 뭐 이런 식..
클라이언트에 배포할 때 주소를 넣어서 배포한다..(그럼 클라가 켰을 때 자동으로 서버 주소를 알게됨)
서버의 경우는... 어느 주소에서 연결을 요청하는지 알 수 없음!!(누가 어디서 연결요청?난 클라의 주소를 몰라..)
그래서 네트워크할 때 평등하지가 않다.. -> 클라는 connect 해서 서버연결이 가능하지만...
서버는 클라의 각각 주소를 모르니... 그냥 문을 열어놓고 connect 요청하는 애가 있으면 연결을 시켜준다~! (accept 사용)
그래서 recv를 호출했을 때 많이 기다리는 경우가 존재, 버퍼가 다 채워지지 않는 경우도 발생함.
네트워크의 4계층 모델
인터넷에서 데이터가 어떻게 전달되는지 이해하려면 네트워크 계층을 알아야한다...!
네트워크는 4단계로 나뉨!
*패킷이란..?
└ 네트워크에서 데이터를 주고받을 때 사용되는 데이터 조각! 을 뜻한다..
1) Application (응용 계층)
└ 게임 서버, 게임 클라이언트 같은게 실행되는 계층
2) Transport (전송 계층)
└ 데이터를 분할, 오류 검사, 순서 정리를 담당해주는.. 실제 데이터를 재조립해주는 계층
패킷이 손실되거나 순서가 뒤섞이는 문제를 해결함.
데이터를 보내주는데 끊겨서 날아갈수가 있음.. 오염될 수도 있고, 순서가 바뀔 수도 있음. -> 이를 해결하기 위해 오류를 검사하고 순서를 다시 맞춰준다! -> 데이터를 원본 상태로 재조립 해줌.. (os역할)
ex) API, TCP, UDP
3) Network (네트워크 계층)
└ 길찾기 시스템.. 데이터를 목적까지 연결시켜줌. 모든 컴퓨터는.. '내건가?'하고 확인이 가능! '다른애건가?' 싶으면 넘겨준다~
목적지 IP주소를 보고 패킷을 어디로 보낼지 결정함!
ex) IP
4) Data Link (데이터 링크 계층)
└ 컴퓨터와 컴퓨터를 연결하는 데이터링크 레이어..(물리적인 연결, 하드웨어의 역할), 무조건 일대일 통신을 한다..
데이터가 전송될 때의 과정~~ :
application이 데이터를 보내면.. -> transport가 오류검사, 토막토막 검사를 함..
-> network에서 어디로 보낼지.. 목적지를 찾는다
-> data link에선 무조건 일대일 통신 -> 그럼 또 누군가가 받음(어떠한 network가...)
-> 그 어떠한 network가 내껀가? 아니면 패스, 내껀가? 맞으면 transport를 거쳐 application으로..
데이터를 보낸다는 것.. -> 내거라면 잘 받겠지만.. 다른 컴퓨터라면 어디로 다시 패스해줘야됨..
어디로 보내야할지, 어떤 동작을 해야할지 정보가 없기에! 꼭 누가 누구에게 보내는 거고 몇번째 데이터인지 부가정보를 꼭! 붙여줘야한다..
몇번째 데이터인지... ip주소가 어디인지.. 물리적으로 연결되므로 데이터가 그대로 가면 알수가 없다..
'나 지금 데이터 보낸다~'라고 말해주고, 다 보내고나서도 '다보냈다~'라고 말해줘야됨.
+ 충돌안하게끔 '다른 데이터 보내지마~'라고도 말해줘야된다.. (이걸 datalink에서)
소켓 자료구조에 주소가 저장된다..
* 소켓이란?
└ 창구역할을 함.. 컴퓨터와 네트워크를 연결하는 전기 콘센트 같은 것..!
소켓을 통해 데이터를 주고 받을 수 있다..
os가 제공하는 기능을 사용해 소켓을 열고 통신한다!
sender에 내 주소가
receiver에 상대방 주소가..(어디로?)
find_gateway에 이 주소로 갈건데.. 나 어디로 가야하니?(방향)
패킷(Packet)
패킷은 꾸러미를 의미함
네트워크에서는 데이터를 패킷단위로 보냄!
하나의 패킷에는 추가적인 정보(Header)가 포함됨.
패킷마다.. 어디로 가야하는지 (IP주소) 등의 정보가 들어있다!
컴퓨터와 컴퓨터끼리 데이터를 주고받는데.. 이때 주고받는 방식이 2가지임.
1) 나랑 쟤랑 연결되었을 때, 이 길(데이터를 보내는건) 나만 쓸거야!(독점), 나만 쓰니까 connection oriented 라고 한다..
2) 나랑 쟤랑 연결되었을 때, 이 데이터를 토막토막 잘라 편지봉투에 넣어서 보낼거야 -> 이게 패킷.. 인터넷에선 이런 방식을 사용
ex) 데이터가 100만개 있을 때, 100만개로 다 쪼개서 하나하나 보내는 것..
인터넷에서의 패킷
└ 패킷마다 정보가 추가됨.. 헤더가 추가되기에 추가 데이터를 사용한다..
패킷은 독립적이어야한다..(필요한 모든 정보가 담겨있어야함. 패킷마다 어디로 가야하는지 담겨있어야함)
패킷마다 갈 주소가 필요함.
Application에서의 패킷 (MMO 패킷)
└ 구현의 편의성을 위해 프로그래머가 나눠놓은 데이터의 단위
얘도 독립적이어야한다.(패킷만 보고 마법 사용인지, 이동한다는건지 알 수 있게끔해야함!)
패킷의 특징..
└ 종류가 많다(이동, 무슨 아이템 사용, 어떤 스킬, 어떤 몬스터, 어떤 공격 방식.. 등)
└ 다음에 어떤 패킷이 올지 ㅗㅁ름..(어떤 순서로 와도 작동할 수 있게끔 해줘야됨)
└ 패킷마다 크기를 다르게 해서 최선의 정보만을 전달 할 수 있게 해줘야한다..
어쨌든 중요한건.. 패킷을 받았을 때 한눈에 알수 있게 하자~ (크기와 종류..)
프로토콜
서버와 클라는 서로 데이터를 주고 받을 때 통신 규칙을 정해야한다..! -> 이게 프로토콜
패킷 포맷의 정의가 핵심!
프로토콜을 먼저 설정해주는 것이 좋다..(그래야 서버와 클라가 서로 딴지를 안검)
서버와 클라는 이 프로토콜에 맞춰서 진행, 프로토콜은 매 업뎃마다 변경될 수 있다..
ㅅㅓ버와 클라는 서로 자기가 같은 프로토콜을 사용하는지 매번 확인해줘야함!
프로토콜 정의 방식
1) Binary Format : byte단위로 값을 일일이 정의 해주는 것.. (데이터를 바이트단위로 정리)
위치에 맞춰 정의해준다.. 빠르지만 관리가 어려움(되게 귀찮다.. 중간에 데이터를 넣는게 거의 불가)
중간에 데이터 추가하면...? 뒤에가 다 밀려버림 -> 전체 수정이 필요함
버퍼 위치에 맞춰서 데이터를 넣고 send해주면 됨.
어떤 os를 쓰든, 어떤 언어를 쓰든 위치만 맞춰주면 됨.
그러나.. 1234를 보내려면 34,12 이런식으로 보내야함.. (intel이 이런다는..)
ex) 서버로 intel쓰고, 클라가 intel아닌.. 다른걸 쓰면(arm이나.. mips?) 사용하면 뒤집어서 보내줘야한다..
(사실 이부분 이해못함ㅎㅜㅜ)
2) Structure Format : C의 구조체를 정의해서 공유, 관리가 매우 쉬움.
그러나 언어,os,컴파일러에 구애받는다!
3) SDK 사용 : 이것은 나중에 설명한다..(라고 말씀하심)
네트워크에서 발생하는 문제점..: 패킷이 깨진다, 패킷의 크기 문제
└ 인터넷 표준에서 정의한 패킷 크기와 내가 정의한 패킷의 크기 사이즈가 다를 수 있음..
내가 보낸 데이터(패킷)이 중구난방 섞이거나, 깨져있거나, 이런 문제가 발생할 수 있다!
너무 크면 여러개의 패킷으로 쪼개서 전송한다..
ex) 만약에 300바이트를 보낸다할때, 어떤 조합으로든지 300바이트만 맞추면 상관 ㄴ
그러나 데이터 크기가 300이 넘어가면.. 받는쪽에서 데이터(패킷) 재조립을 해줘야한다..!
* 보통.. 클라는 서버의 주소를 알아야함
상대방의 주소를 알면 클라이언트,
상대방의 주소를 모르면 서버
FILE I/O와 거의 같다..
- Open() => (클라이언트는 Connect, 서버는 Accept)
− Read() => Recv()
− Write() => Send()
− Close() => Close() 또는 CloseSocket()
네트워크 프로그래밍의 단계.. 기본 흐름..
클라이언트 :
소켓 생성(Socket) -> 서버 소켓 연결(Connect) -> Data 송수신(Recv/Send) -> 소켓 끊기(Close)
서버 :
소켓 생성(Socket) -> 소켓 묶기(Bind) -> 소켓 접속 대기(Listen) -> 연결 소켓 생성(Accept)
-> Data 송수신(Recv/Send) -> 소켓 끊기(Close)
서버는.. 클라가 connect()를 호출할 때까지 대기, accept를 통해 연결을 수락한다!
다음시간에 소켓프로그래밍 실습..
'서버' 카테고리의 다른 글
다중서버정리(iocp) (0) | 2025.04.06 |
---|---|
일대일서버정리 (0) | 2025.04.06 |
서버1w2 (0) | 2025.03.18 |
서버1w1 (0) | 2025.03.14 |