[열혈TCP/IP] 01 네트워크 프로그래밍과 소켓의 이해

2 minute read

01 네트워크 프로그래밍과 소켓의 이해

서버 소켓

  1. socket() : 소켓 생성
  2. bind() : 소켓에 주소 정보 할당
  3. listen() : 연결 가능 상태로 만들기
  4. accept() : 연결 요청에 대한 수락

클라 소켓

  1. socket() : 소켓 생성
  2. connect() : 서버로 연결 요청

01.2 리눅스 기반 팡리 조작하기

저 수준 파일 입출력과 파일 디스크립터

리눅스에서의 소켓조작은 파일조작과 동일하게 간주된다. 리눅스에서 파일 입출력을 사용하기 위해서는 파일 디스크립터에 대한 개념을 먼저 알아야 한다.

  • 파일 디스크립터 : 시스템으로부터 할당 받은 파일 또는 소켓에 부여된 정수
  • stdinput에 대한 파일 디스크립터는 0
  • stdout에 대한 파일 디스크립터는 1
  • stderr에 대한 파일 디스크립터는 2
  • 일바적으로 파일과 소켓은 생성의 과정을 거쳐야지 파일 디스크립터가 할당된다.
  • 하지만 위의 세 가지는 별도의 생성과정을 거치지 않아도 프로그램이 실행되면 자동으로 할당되는 파일 디스크립터이다.

  • 윈도우 소켓(윈속)에서는 파일과 소켓의 디스크립터에 차이점이 존재한다.
    • 파일 입출력 함수와 소켓 입출력 함수가 엄연히 구분되어 있다.
    • 윈도우 소켓 기반 데이터 입출력 : send() / recv()
  • 리눅스에서는 파일과 소켓의 디스크립터가 완전히 같은 개념이다.
    • 리눅스에도 send()가 존재하지만 일단 파일과 소켓의 디스크립터가 같음을 기억하기 위해서 read(), write()만 사용한다.

02 소켓의 타입과 프로토콜의 설정

02-1 소켓의 프로토콜과 그에 따른 데이터 전송 특성

  1. sorket(int domain, int type, int protocol)
    • domain : 소켓이 사용할 프로토콜 체계 정보 전달, 일반적으로 PF_INET(IPv4 프로토콜 체계를 의미하는 이름)
    • type : 소켓의 데이터 전송방식에 대한 정보 전달. 연결지향형과 비연결지향형
    • protocol : 두 컴퓨터 간 통신에 사용되는 프로토콜 정보 전달, 실제 소켓이 사용할 프로토콜 정보는 첫 번재 인자에서 지정한 범위 내에서 결정되어야 한다.
    • protocol까지 명시해야하는 경우는 “하나의 프로토콜 체계안에 데이터의 전송방식이 동잃나 프로토콜이 둘 이상 존재하는 경우”이다.
  2. 연결지향형 : 전송되는 데이터의 경계가 존재하지 않는다.
    • 여러 번에 걸쳐서 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을 할당할 수 있다.

03-2 주소 정보의 표현