소켓의 타입과 프로토콜 설정
2022. 5. 22. 17:52ㆍ네트워크
728x90
프로토콜
- 컴퓨터 상호간의 데이터 송수신에 필요한 통신규약
- 소켓을 생성할 때 기본적인 프로토콜 지정
프로토콜 체계
- IPv4 : PF_INET
- IPv6 : PF_INET6
소켓 타입
- 데이터 전송 방식을 의미
- 소켓이 생성될 때 소켓의 타입도 결정
- IPv4의 소켓 타입
- 연결 지향형 소켓 타입
- 비 연결 지향형 소켓 타입
연결지향형 소켓(SOCK_STREAM) : TCP
- 중간에 데이터 소멸 X
- 전송 순서대로 데이터 수신
- 데이터 경계 X
- 소켓 대 소켓 연결은 반드시 1대1 구조
비 연결지향형 소켓(SOCK_DGRAM) : UDP
- 전송순서 상관없이 빠른 속도 전송 지향
- 데이터 손실 및 파손 우려
- 데이터 경계 존재
- 한번에 전송 가능한 데이터 크기 제한
인터넷 주소(IP)
- 인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
- 4바이트 주소 체계인 IPv4와 16바이트 주소체계인 IPv4 존재
- 소켓을 생성할 때 기본적인 프로토콜을 지정해야
- 네트워크 주소와 호스트 주소로 나눔
- 네트워크 주소를 이용하여 네트워크 탐색
- 호스트 주소를 이용하여 호스트 구분
- 클래스A의 바이트 범위 0~127
- 클래스 B의 바이트 범위 128~191
- 클래스 C의 바이트 범위 192~223
- 첫 번째 바이트 정보만 참조해도 IP 주소의 클래스 구분 가능
PORT 번호
- 소켓을 구분하는 용도로 사용
- 0 ~ 65535
- 하나의 포트를 둘 이상의 프로그램에 할당 불가
- 하나의 프로그램 내에서는 둘 이상의 소켓이 존재 가능 -> 둘 이상의 PORT가 하나의 프로그램에 할당 가능
- 0~1023은 이미 용도가 결정되어 있는 포트임(Well-known PORT) -> 임의 할당 X
IPv4 기반 주소표현 구조체
typedef struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
- sin_family : 주소 체계
- PF_INET (IPv4 기반)
- PF_INET6 (IPv6 기반)
- sin_port : 포트번호
- 16비트
- 네트워크 바이트 순서(빅 엔디안)로 저장
- sin_addr : 32비트 IP 주소
- 네트워크 바이트 순서(빅 엔디안)로 저장
- sin_zero : 사용 ㄴㄴ
- 그냥 0 넣기
네트워크 바이트 순서
- CPU가 데이터를 메모리에 저장하는 방식은 두 가지임
- 빅 엔디안(Big Endian) : 상위 바이트 값을 작은 번지수에 저장
- 리틀 엔디안(Little Endian) : 상위 바이트 값을 큰 번지수에 저장
- 호스트 바이트 순서
- CPU별 데이터 저장 방식
- 빅 엔디안일 수도 있고 리틀엔디안일 수도
- CPU별 데이터 저장 방식
- 네트워크 바이트 순서
- 빅 엔디안으로 통일
unsigned short htons(unsigned short port); unsigned short ntohs(unsigned short port); unsigned long htonl(unsigned long ip); unsigned long ntohl(unsigned long ip);
- 빅 엔디안으로 통일
- htons : host to network short : 포트번호 데이터를 호스트 순서(리틀 엔디안)에서 네트워크 순서(빅엔디안)로 변경
- ntohs : network to host short : 포트번호 데이터를 네트워크 순서(빅엔디안)에서 호스트 순서(리틀 엔디안)로 변경
- htonl : host to network long : IP주소 데이터를 호스트 순서(리틀 엔디안)에서 네트워크 순서(빅엔디안)로 변경
- htonl(INADDR_ANY) : 현재 실행중인 컴퓨터의 IP소켓을 부여, 그것을 네트워크 바이트 순서로 변경
- ntohl : network to host long : IP주소 데이터를 네트워크 순서(빅엔디안)에서 호스트 순서(리틀 엔디안)로 변경
u_long inet_addr(const char *string address);
char* inet_ntoa(in_addr in);
- inet_addr : 문자열을 32비트로 변환된 빅 엔디안 정수값으로 변환
- inet_ntoa : 네트워크 주소를 문자열로 변환
728x90
'네트워크' 카테고리의 다른 글
네트워크 프로그래밍과 소켓의 이해 (0) | 2022.05.22 |
---|