[열혈TCP/IP] 01 네트워크 프로그래밍과 소켓의 이해
01 네트워크 프로그래밍과 소켓의 이해
서버 소켓
- socket() : 소켓 생성
- bind() : 소켓에 주소 정보 할당
- listen() : 연결 가능 상태로 만들기
- accept() : 연결 요청에 대한 수락
클라 소켓
- socket() : 소켓 생성
- connect() : 서버로 연결 요청
01.2 리눅스 기반 팡리 조작하기
저 수준 파일 입출력과 파일 디스크립터
리눅스에서의 소켓조작은 파일조작과 동일하게 간주된다. 리눅스에서 파일 입출력을 사용하기 위해서는 파일 디스크립터에 대한 개념을 먼저 알아야 한다.
- 파일 디스크립터 : 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수
- stdinput에 대한 파일 디스크립터는 0
- stdout에 대한 파일 디스크립터는 1
- stderr에 대한 파일 디스크립터는 2
- 일바적으로 파일과 소켓은 생성의 과정을 거쳐야지 파일 디스크립터가 할당된다.
-
하지만 위의 세 가지는 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당되는 파일 디스크립터이다.
- 윈도우 소켓(윈속)에서는 파일과 소켓의 디스크립터에 차이점이 존재한다.
- 파일 입출력 함수와 소켓 입출력 함수가 엄연히 구분되어 있다.
- 윈도우 소켓 기반 데이터 입출력 : send() / recv()
- 리눅스에서는 파일과 소켓의 디스크립터가 완전히 같은 개념이다.
- 리눅스에도 send()가 존재하지만 일단 파일과 소켓의 디스크립터가 같음을 기억하기 위해서 read(), write()만 사용한다.
02 소켓의 타입과 프로토콜의 설정
02-1 소켓의 프로토콜과 그에 따른 데이터 전송 특성
- sorket(int domain, int type, int protocol)
- domain : 소켓이 사용할 프로토콜 체계 정보 전달, 일반적으로
PF_INET
(IPv4 프로토콜 체계를 의미하는 이름) - type : 소켓의 데이터 전송방식에 대한 정보 전달. 연결지향형과 비연결지향형
- protocol : 두 컴퓨터 간 통신에 사용되는 프로토콜 정보 전달, 실제 소켓이 사용할 프로토콜 정보는 첫 번재 인자에서 지정한 범위 내에서 결정되어야 한다.
- protocol까지 명시해야하는 경우는 “하나의 프로토콜 체계안에 데이터의 전송방식이 동잃나 프로토콜이 둘 이상 존재하는 경우”이다.
- domain : 소켓이 사용할 프로토콜 체계 정보 전달, 일반적으로
- 연결지향형 : 전송되는 데이터의 경계가 존재하지 않는다.
- 여러 번에 걸쳐서 write된 데이터를 한 번의 read로 모두 읽는다. 즉, write와 read의 횟수가 일치하지 않는다.
- Chapter1 소스코드 - hello_client.c 에서는 msg의 길이만큼 read해서 read()의 호출이 1번
- Chapter2 소스코드 - hello_client.c 에서는 길이 1만큼 read해서 msg.length만큼 read()가 호출됨.
02-2 윈도우 기반에서 이해 및 확인하기
- 윅속에서 return 값의 SOCKET은 정수로 표현되는 소켓의 핸들값을 저장하기 위해서 지정한 자료형일 뿐, int와 비슷하게 생각하면 된다.
03 주소체계와 데이터 정렬
03-1 소켓에 할당되는 IP주소와 PORT 번호
IPv4 주소체계(책 64페이지)
- class A : 네트워크 ID 1BYTE 호스트 ID 3BYTE : 첫 번째 바이트 범위 [0,127]
- class B : 네트워크 ID 2BYTE 호스트 ID 2BYTE : 첫 번째 바이트 범위 [128,191]
- class C : 네트워크 ID 3BYTE 호스트 ID 1BYTE : 첫 번째 바이트 범위 [192,223]
- class D : 네트워크 ID 4BYTE 호스트 ID 0BYTE
-
IP 주소 203.211.172.103의 경우 203만 보고 네트워크 주소가 3BYTE임을 알 수 있다.
- 네트워크 주소 : 네트워크의 구분을 위한 IP 주소의 일부. 4바이트 IP 주소 중 일부만 참조해서 일단 특정 도메인의 네트워크로 데이터를 전송
- 호스트 주소 : 특정 도메인으로 데이터를 보낸 뒤, 호스트 주소를 참조해서 개인에게 데이터를 전송
-
네트워크 주소를 따라서 데이터가 전송되는 것은 네트워크를 구성하는 라우터 또는 스위치로 데이터가 전송되는 것을 의미한다.
- 동영상을 보면서 브라우저를 키고 있으면, 동영상과 브라우저를 위한 소켓이 각각 최소 1개씩 필요하다.
- 컴퓨터에는 NIC(네트워크 인터페이스 카드)라고 불리는 데이터 송수신 장치가 하나씩 달렸다.
- IP는 데이터를 NIC를 통해서 컴퓨터 내부로 전송하는데 사용된다.
- NIC를 통해서 수신된 데이터 안에는 PORT 번호가 새겨져 있다.
- 운영체제는 이 포트 정보를 참조해서 일치하는 포트번호의 소켓에 데이터를 연결한다.
- 포트 번호는 중복이 불가능하지만 TCP 소켓과 UDP 소켓은 포트번호를 공유하지 않는다. TCP소켓에 9190를 할당해도 UDP소켓에 9190을 할당할 수 있다.