Network Lab. Byoung-Son, Choi bschoi@netwk.hannam.ac.kr TCP/IP Socket Programming… 제 2장 소켓의 생성과 프로토콜의 설정 Network Lab. Byoung-Son, Choi bschoi@netwk.hannam.ac.kr
목차 프로토콜의 정의 소켓의 생성 프로토콜 체계(Protocol Family) 소켓의 타입 프로토콜의 선택 윈도우 기반으로 구축하기
프로토콜의 정의 컴퓨터 상호간의 대화에 필요한 통신 규약 데이터 통신 수행 규칙들의 집합 데이터 통신과 네트워크, 교보문고 참조
프로토콜 체계(Protocol Family) 소켓의 생성 socket() 함수 프로토콜 체계상의 하나의 소켓 생성 기본적인 통신 도구 프로토콜에 독립적 데이터 전송 타입을 지정해야 함 연결지향 소켓, 비연결지향 소켓 반환 값 성공시 : 파일디스크립터 반환 실패 : -1 반환 #include <sys/types.h> #include <sys/socket.h> int socket (int domain, int type, int protocol) 프로토콜 체계(Protocol Family) 설정 데이터 전송 타입 설정 특정 프로토콜 지정
프로토콜 체계(Protocol Family) 데이터를 주고 받는 환경에 따른 적절한 프로토콜 선택 PF_ 접두어로 표시 프로토콜 체계 정 의 PF_INET IPv4 인터넷 프로토콜 PF_INET6 IPv6 인터넷 프로토콜 PF_LOCAL Local 통신을 위한 UNIX 프로토콜 PF_PACKET Low level socket을 위한 인터페이스 PF_IPX IPX 노벨 프로토콜 [표 2-1] sys/socket.h에 선언되어 있는 프로토콜 체계(P. 55)
Linux Socket Programming 참조 [4장 Socket Types and Protocols] 소켓의 타입 데이터 전송 타입 지정 하나의 프로토콜 체계 안에서도 데이터를 전송하는 방법이 둘 이상 존재할 수 있다는 것을 의미 소켓 타입 인자 SOCK_STREAM* SOCK_DGRAM* SOCK_SEQPACKET 순서화된 패킷 소켓 SOCK_RAW 네트워크 소켓 뒷 장에서 살펴봄 Linux Socket Programming 참조 [4장 Socket Types and Protocols]
소켓의 타입 연결 지향형 소켓(SOCK_STRAM, TCP 소켓) SOCK_STREAM 소켓 유형 스트림 방식의 소켓 생성 UNIX의 파이프 개념과 동일 연결형(스트림) 서비스 선택 시 사용 SOCK_STREAM 소켓의 특성 메시지 경계가 유지되지 않음 전달된 순서대로 수신됨 전송된 모든 데이터는 에러없이 원격지에 도달
소켓의 타입 연결 지향형 소켓(SOCK_STRAM, TCP 소켓) internet connection Network A Network B connection internet 연결지향형 소켓 형태
소켓의 타입 비연결 지향형 소켓(SOCK_DGRAM, UDP 소켓) SOCK_DGRAM 소켓 유형 데이터그램 방식의 소켓 생성 개별적으로 주소가 쓰여진 패킷 전송 시 사용 비연결형(데이터그램) 서비스 선택 시 사용 SOCK_DGRAM 소켓 유형의 특성 패킷은 전달된 순서대로 수신되지 않음 에러복구를 하지 않음 (즉, 신뢰성이 없음) 데이터그램 패킷의 크기 제한
소켓의 타입 비연결 지향형 소켓(SOCK_DGRAM, UDP 소켓) internet Network A Network B 비연결지향형 소켓 형태
프로토콜의 선택 호스트 대 호스트가 사용할 프로토콜 설정 프로토콜 체계가 PF_INET인 경우 IPPROTO_TCP 인터넷을 기반으로 하는 연결지향형 소켓 IPPROTO_UDP UDP를 기반으로 하는 소켓 생성 인터넷을 기반으로 하는 비연결 지향형 소켓
프로토콜 선택 protocol 인자가 필요한 이유 프로토콜 체계가 PR_INET이고 소켓 타입이 SOCK_STREAM이면, 당연히 인터넷 깁나 연결 지향형 소켓(TCP 소켓)인데…….. 반드시 세번째 인자값으로 IPPROTO_TCP를 넣어야 하나? 하나의 프로토콜 체계 안에서 데이터 전송 타입까지 같으면서도 최종적으로 통신하는 형태가 다른여러 개의 프로토콜이 존재하는 경우, 이 세번째 인자가 유용한 인자로 사용 즉, 전송타입은 같지만 그 안에서도 프로토콜이 다시 나뉘는 상황을 말함 - SOCKET_RAW을 생성하는 경우, 유용함
프로토콜의 선택 프로토콜 체계가 PF_INET인 경우, 전달할 수 있는 인자의 종류는 두가지 형태가 존재 CASE Domain Type Protocol 1 PF_INET SOCK_STREAM IPPROTO_TCP(0) 2 SOCK_DGRAM IPPROTO_UDP(0) [표 2-2] 프로토콜 체계가 PF_INET인 경우의 전달 인자(P. 60)
프로토콜의 선택 make_socket.c 소스 코드 실행 결과
윈도우 기반으로 구현하기 소켓의 생성 #include <sys/types.h> #include <sys/socket.h> int socket (int domain, int type, int protocol) 리눅스 성공시 : 파일디스크립터 실패시 : -1 #include <winsock2.h> SOCKET socket (int af, int type, int protocol) 윈도우즈 성공시 : 소켓 핸들 실패시 : INVALID_SOCKET 소켓의 핸들을 저장하기 위해 미리 정의해 놓은 정수형 데이터 타입
윈도우 기반으로 구현하기 소켓의 종료 #include <unistd.h> int close(int fildes); 리눅스 #include <winsock2.h> int closesocket( SOCKET s ); 윈도우즈
윈도우 기반으로 구현하기 make_socket_win.c 소스 코드 실행 결과
참고문헌 “데이터 통신과 네트워킹”, 이재광 외 2명, 교보문고 “TCP/IP 프로토콜”, 이재광외 5명, 미래컴 “Linux Socket Programming by Example”, Warren W. Gay, QUE '00
Q & A