본문 바로가기
네트워크, 서버/소켓,프로토콜

(소켓,프로토콜)소켓 프로토콜

by 흥부와놀자 2020. 7. 2.

프로토콜이란? 네트워크 통신을 위한 상호간의 약속이라고 보면 된다. 

소켓프로그래밍에서도 상호간의 전달방식을 규정하는 프로토콜을 정의해야 한다.

소켓을 만드는 함수에서 사용자는 소켓의 프로토콜을 정의할수 있는데 한번 알아보도록 하자.

 

int socket(int domain, int type, int protocol)

domain -> 소켓이 사용할 프로토콜 체계정보

type -> 소켓의 데이터 전송 방식

protocol -> 두 컴퓨터 간 통신에 사용되는 프로토콜 정보전달

 

- 프로토콜 체계(sys/socket.h)

PF_INET IPV4 인터넷 프로토콜
PF_INET6 IPV6 인터넷 프로토콜
PF_LOCAL 로컬통신 위한 UNIX 프로토콜 체계
PF_PACKET LowLevel 소켓을 위한 프로토콜 체계
PF_IPX IPX 노벨 프로토콜 체계

먼저 domain변수에 들어가는 정보이다. 이 프로토콜체계정보로 틀을 만들고 뒤의 type과 protocol 변수로 점차 프로토콜을 구체적으로 정의해 나간다.

PF_INET을 보통 컴퓨터간 통신에서 가장 많이 사용한다. 흔히 아는 연결형, 비연결형 인터넷 통신을 정의 할 수 있다.

그 외의 것들은 조금 생소하기에 한번 찾아보았다.

 

PF_LOCAL

https://terapi.tistory.com/entry/PFLOCALPFINET

다른분의 블로그에서 찾은 자료이다. PF_INET과 명확한 차이를 보여주고 있는데 PF_INET이 다른 기기간의 통신이라면 PF_LOCAL은 프로세스간의 통신인 IPC통신을 소켓으로 구현하는 방법이다.

 

PF_PACKET

소켓을 IP계층까지 정의해서 보내고자 할때 보통 Raw소켓을 사용한다. 하지만 PF_PACKET을 선택하면 IP밑의 이더넷 계층까지 정의해줄수 있다. 보통 pcap라는 라이브러리를 사용하지만 리눅스 전용으로 비슷하게 효과를 낼 수 있는 소켓 프로토콜인셈이다.  이렇게 할때 체크섬부터 많은걸 정의해줘야 하지만 보내는 주소를 위조하고 Mac주소로 바꾸는 ARP 역시 마음대로 다룰수 있다.  

 

PF_IPX

IPX는 TCP/IP의 인기로 인해 사라져간 프로토콜중 하나인것 같다.

 

-소켓의 타입(데이터 전송방식)

SOCK_STREAM 연결형 전송방식
SOCK_DGRAM 비연결형 전송방식
SOCK_RAW Raw소켓 방식

첫번째 domain에서 정의한 프로토콜에서 조금더 자세하게 정의한 형식이다. 

SOCK_STREAM

연결형 전송방식으로 1:1의 안정된 통신을 보장한다. 보낸 패킷들의 순서를 보장하고 손실이 생기지 않는다. 또한 흔히 데이터의 경계가 존재하지 않는다고 하는데 이 말은 발신측에서 보낸 횟수만큼 꼭 수신측이 받지 않아도 된다는 소리다.  발신측에서 10이라는 데이터를 10번 보내면 수신측에서는 자신의 수신 버퍼가 100이상 되는것을 확인한 후 총 100의 데이터를 차곡차곡 받아서 한번에 read할수 있다. 

자세한 송수신 과정은 정말 중요한 내용이므로 따로 포스팅할 예정이다.

 

SOCK_DGRAM

비연결형 전송방식으로 패킷의 손실을 감수하되 속도가 빠르다는 장점이 있다. 연결형과 다르게 수신측 버퍼의 상황이 송신측에 전달되지 않으므로 보낼수 있는 데이터양의 한계가 정해진다. 또한 데이터의 경계가 있어서 보낸 횟수만큼 수신측에서 받아야 한다. 즉 모아서 받질 못한다. 

 

SOCK_RAW

ip계층 까지 사용자가 임의로 정의할 수 있는 Raw소켓을 사용한다. 들어오는 패킷의 ip나 포트번호가 달라도 네트워크엑세스계층을 들어오는 모든 패킷을 받을 수 있기에 들어오는 패킷을 가로채는 스니핑에 사용한다. 

 

-protocol

최종적으로 선택되는 프로토콜 변수로써 조금더 명확하게 프로토콜을 정의해준다. 보통 TCP일 경우 IPPROTO_TCP를 사용하고 UDP일 경우 IPPROTO_UDP를 사용한다. 두번째 매개변수까지 정해진 상태가 단일 프로토콜일 경우 0을 써도 무방하다.

 

이번에는 소켓프로그래밍에서 사용할수 있는 여러 프로토콜을 알아보았다.  서버공부를 하는 입장에서 Raw소켓이 매력적으로 보였다. 네트워크 통신에 익숙해진 뒤 Raw소켓을 통해 재미있는 것들을 많이 해보면 좋을것 같다.