2. 소켓이란
그대들은 소켓이란 단어를 많이 들어 보았을 것이다, 그리고 소켓이란 단어가 정확히 무엇을 뜻하는 지 궁금해 했을 수도 있다. 쉽게 말하자면 소켓은 바로 기본 유닉스 파일 디스크립터를 사용해서 다른 프로그램들과 대화하기 위해 필요한 것이다.
아직도 이해가 안되는 그대들을 위해 한 번 더 설명해주겠다. 유닉스에서의 모든 것은 파일로 이루어져있다. 누군가 그대에게 I/O 가 유닉스에서는 어떻게 돌아가느냐고 묻는다면, 그대는 이렇게 대답할 것이다, "유닉스 파일 디스크립터에 쓰기나 읽기를 통해서 돌아가지!" 그렇다면 우리가 궁금해 할 수 있는 것은 파일 디스크립터란 과연 무엇인가 이다. 파일 디스크립터는 어떤 열려있는 파일에 연관되어져있는 정수형 데이터 타입 -- 그러니까 Integer 이다. 하지만 중요한 것은 바로, 극 파일이 네트워크 코넥션일 수 도 있고, FIFO이거나, 파이프이거나, 터미널일 수도 있으며, 심지어는 디스크에 쓰여져있는 파일일 수도 있다. 아까도 말했듯이 유닉스의 모든 것은 파일로 이루어져있다!
이제 그대들이 나에게 물어볼만 한 건 바로 "그럼 어떻게 파일 디스크립터를 사용해서 네트워크에 사용을 하나요?" 이다. 이 것 또한 매우 쉽다. 먼저 socket() 함수를 부르고, socket()의 반환 값은 소켓 디스크립터이다, 그리고 이 반환된 소켓 디스크립터에게 send()나 recv()등을 불러서 네트워크 통신을 하는 것이다. (이 함수들 마저 궁금하다면 man 프로그램을 사용해라. KLDP에 한글화된 man 프로그램이 아마 있을 것이다.)
물론 이제 그대들이 물을 수 있는 것이 하나 더 생겼다. 그냥 예전에 배웠어야할 fopen이나 fread들을 통해서도 통신이 가능하냐고 물어볼 수 있겠지만, 이건 그대들의 생각대로 당연히 가능하다. 하지만 데이터 송신에 있어서는 send() 와 recv() 가 훨씬 더 많은 기능과 제어함을 제공한다.
2.1. 두가지 종류의 인터넷 소켓
놀랍게도 인터넷 소켓에는 두가지 종류가 있다. 물론, 놀랍게도 이건 거짓말이며 그것보다 상당히 더 많은 종류가 있으나, 우선 우리에게는 이 두가지 만이 중요하다. 각설하고, 두가지 소켓의 이름은 각각 다음과 같다. "스트림 소켓", 그리고 다른 하나는 "데이터그램 소켓" 이다. 스트림 소켓은 주로 TCP통신에 많이 쓰이며, (통신 과정에서 전송되는 데이터 패킷을 잃어버리지 않는다.) 데이터 그램 소켓은 주로 UDP통신에서 쓰인다 (패킷을 잃어버려도 클라이언트와 서버모두 신경쓰지 않는다. 게임에 주로 쓰인다.).
2.2. 네트워크 이론
데이터는 인켑슐레이션이라는 컨셉트를 통해져서 전송되어진다. 인켄슐레이션이라는 것은 우리가 자바의 OOP개념을 공부함과 같이 데이터를 숨기는 과정이라고 말하면 이해하기가 쉬울 것이다. 데이터가 전송될때 [[Ethernet][IP][UDP][TFTP][DATA]] 와 같이 인켑슐레이트 되어서 전송되어진다. 이 데이터 패킷이 각각의 게이트웨이 (모뎀, 호스트, 등등)에 닿을 때마다 하나씩 벗겨져가는 것이다.
원서는 Beej's Guide to Network Programming 이라고 치면 나온다.
읽다가 머리 아파서 리뷰겸 번역해봤다.
쓰여져->쓰여 (이중 피동) [리듬 맞춤법 봇♬]