kakasoo

[TCP/IP] 네트워크와 소켓에 대한 이해 본문

프로그래밍/네트워크

[TCP/IP] 네트워크와 소켓에 대한 이해

카카수(kakasoo) 2020. 7. 13. 11:32
반응형

네트워크 프로그래밍은 운영체제와 시스템 프로그래밍에 대한 약간의 지식이 필요하다.

또한 네트워크 상의 전송규약인 TCP/IP 라는 프로토콜을 어느 정도 이해해야 한다.

 


네트워크와 소켓에 대한 이해

네트워트 프로그래밍은 서로 다른 두 컴퓨터가 정보를 교환할 수 있도록 하는 것을 의미한다.

이 과정에서는 물리적인 연결이 필요하고, 이 안에서 작동할 소프트웨어가 필요한데, 이 연결은 이미 다 되어 있다.

지금 존재하는 대부분의 컴퓨터들은 이미 인터넷이라고 하는 '물리적인 연결'이 되어 있는 상태기 때문에,

우리가 고민해야 할 부분은 이제 이 망에서 작동할 소프트웨어적 데이터의 송수신 방법이다.

하지만 이 방법 역시 운영체제에 상에서 소켓'Socket' 이라는 것을 제공하기 때문에 이미 해결되어 있는 상태다.

소켓은, 우리가 전기를 공급받기 위해서 콘센트를 꽂는 것처럼,

데이터를 공급받기 위해 네트워크에 우리가 꽂는 소프트웨어를 의미한다.

 

전화받는 소켓의 구현

TCP 소켓은, Transmission Control Protocol, 즉 전송제어 프로토콜이라는 뜻이다.

책의 설명에 따르면, 저자는 이를 전화기에 설명한다고 한다.

전화기는 소켓이고, socket 함수로 소켓을 생성한 다음에는 bind 함수를 통해 전화번호를 할당해야 하는 것이다.

여기서, 이 전화번호가 소켓에 IP와 포트번호, 소켓의 주소정보를 의미한다.

마지막으로 listen 함수를 통해서 케이블에 연결시키면, 소켓은 언제든 정보를 받을 준비가 된 것으로 이해된다.

실제로 정보가 전달됐을 때에는 정보 수신에 동의한다는 의미로써 accept 함수를 호출하면 끝난다.

이 순서를 일단 암기하자.

 

serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 소켓 생성

bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) // bind로 IP와 PORT 번호 할당

listen(serv_sock, 5) // 소켓을 연결 가능한 상태로 정의

accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); // 연결 요청 시 승인 (연결 요청이 없으면 계속 대기)

write(clnt_sock, message, sizeof(message)); // accept 되었다면 data를 전송한다.

 

이렇듯, 서버 프로그램에서 생성한 소켓을 가리켜 '서버 소켓' 또는 '리스닝 소켓'이라고 한다.

 

전화 거는 소켓의 구현

전화 거는 소켓은, 클라이언트 소켓이라고 한다.

위의 과정에서 생략된 것이 있는데, 소켓 생성 - IP,PORT 할당 - 연결 - 요청 승인 - 데이터 전송에 받는 경우가 없다.

이 부분이 바로 클라이언트 소켓의 역할이다, 라기 보단, 애초에 자기가 자기에게 연락하는 경우는 없으니 말이다.

요청 승인 단계 이전에, 일단 누군가의 연락이 들어와야 한다.

그 역할을 하는 함수를 connect 라고 한다.

sock = socket(PF_INET, SCOK_STREAM, 0); // 소켓을 생성한다, 이번에는 클라이언트 소켓이지만 방법은 동일하다.

connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1) // 서버 프로그램에 연결을 요구한다.

 

저수준 파일 입출력(Low-level File Access) / 파일 디스크립터(File Descriptor)

여기서의 저 수준은 "표준에 상관없이 운영체제가 독립적으로 제공하는" 이라는 의미이다.

파일 디스크립터는 파일 (또는 소켓)에 대한 지정 번호를 의미한다.

무수히 많은 전화기를 지칭해서 사용할 수는 없으므로, 각 전화기마다 운영체제가 알아서 할당한 번호를 말한다.

여기서 파일 디스크립터는 파일 핸들이라는 용어로도 쓰인다.

이 핸들이라는 용어는 주로 윈도우에서 쓰인다.

나는 윈도우 기반으로 공부를 할 것이기 때문에, 리눅스 관련된 내용은 일단 전부 건너 띄겠다.

(개인적으로 나는 읽어볼 생각이다.)

반응형