(리눅스) 소켓의 생성(4) 프로토콜의 마지막 정보 전달
소켓의 생성(4)
이제 socket 함수의 3번째 인자를 알아보자.
3번째 인자는 최종적으로 소켓이 사용하게 될 프로토콜 정보를 전달하는 목적으로 존재한다.
우리가 socket 함수의 1번째, 그리고 2번째 인자로 프로토콜 체계와 소켓의 전송방식에 대한 정보를 전달했다.
사실 이 두개의 인자만으로도 충분히 원하는 유형의 소켓을 생성할 수 있다.
따라서 대부분의 경우, 세 번째 인자로 0을 전달하면 우리가 원하는 소켓을 생성하는데,
모든 상황에는 예외라는 게 존재한다.
다음과 같은 예외 상황에서 3번째 인자의 역할이 주어지는데
다음의 상황은 이러하다
-
" 하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우 "
즉, 더 자세한 예시로는
IPv4 프로토콜 체계를 사용하고, TCP 전송방식을 사용하지만 80 포트와 443 포트를 사용하는 경우이다.
-
이러한 동일한 프로토콜 체계와 동일한 전송방식을 사용하지만 여러 개의 포트번호를 사용하는 경우
3번째 인자를 통해서 원하는 프로토콜 정보를 조금 더 구체화해야 한다.
-
이제 지금까지 배운 내용을 토대로 소켓의 생성과정에서 socket 함수에 전달할 수 있는 인자 정보를 구성해보자.
" IPv4 인터넷 프로토콜 체계에서 동작하는 연결지향형 데이터 전송 소켓을 구성하라 "
위의 문제에 맞는 소켓 구문을 짜보면
" int tcp_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); "
이다.
그런데 위의 socket 함수의 3번째 인자를 보니 0이 아니라 IPPROTO_TCP라고 적혀 있다.
그 이유는
위의 문제에서 "IPv4 인터넷 프로토콜 체계에서 동작하는 연결 지향형 데이터 전송 소켓"
이라고 했었다.
1번째 인자에 적힌 "PF_INET"은 IPv4 프로토콜 체계를 사용한다는 의미이다.
2번째 인자에 적힌 "SOCK_STREAM"은 연결 지향형 데이터 전송을 의미한다.
3번째 인자에 적힌 "IPPROTO_TCP"는 IPv4 프로토콜 체계를 사용하면서
연결 지향형 데이터 전송방식을 사용해라 라는 이 두 가지 조건을 모두 만족시키는 프로토콜이다.
그리고 이때 생성되는 소켓을 TCP 소켓이라고 한다.
-
그렇다면 이제 다음 문제에 대한 소켓의 구문을 구성해보자.
" IPv4 인터넷 프로토콜 체계에서 동작하는 비 연결 지향형 데이터 전송 소켓 "
위의 문제에 맞는 소켓 구문을 짜 보면
" int udp_sock = socket(PF_INET, SOCK_DGREAM, IPPROTO_UDP); "
이다.
1번째 인자는 IPv4 프로토콜 체계를 사용한다 라는 의미이고,
2번째 인자는 UDP 전송 방식을 사용한다 라는 의미이다.
3번째 인자는 IPv4 프로토콜 체계를 사용하면서
비 연결 지향형 데이터 전송방식을 사용해라 라는 이 두 가지 조건을 모두 만족시키는 프로토콜이다.
-
그럼 다음 포스팅에서
초기 때 포스팅되었던 서버 프로그램과 클라이언트 프로그램이 TCP 소켓 기반의 예제이니,
이를 조금 변경해서 TCP 소켓의 전송되는 데이터의 경계가 존재하지 않는다 라는 특징을 확인해 보자.
-
참고로 다시 한번 설명하자면
데이터의 경계가 존재하지 않는다(TCP)라는 말은
송신 횟수와 수신 횟수가 서로 불일치해도 된다는 의미이다.
반대로
데이터의 경계가 존재한다(UDP)라는 말은
송신 횟수와 수신 횟수가 서로 일치해야 한다는 의미이다.