Socket
포트(port)
-
- 프로토콜 표준
- Application Layer에서 데이터를 주고 받고 싶을때,
프로세스가 하위 계층과 연결을 해주는 장치가 필요함
이러한 데이터의 통로 역할을 하는 장치가
바로 ‘포트’
(프로세스와 연결된 데이터 통로 혹은 데이터 채널)
port (number) : 인터넷 상에서 위의 port를 유니크하게 식별하기 위하여,
port (number)를 정의함
- 프로토콜 표준
-
- 소켓 프로그래밍
- Internet address + port number를 통해
인터넷 상의 socket을 유니크하게 식별할 수 있다
(다만 port number가 socket을 식별하기 위해 부여된다는 점도 있으니 알아두자)
0~1023 : well-known ports, system ports
ex : HTTP (80), HTTPS(443), DNS(53)
1024~49151 : registered ports(IANA에 등록된 번호)
ex : Mysql DB(3306), Apache tomcat server(8080)
49152~65535 : dynamic pors(등록 안됨, 임시로 혹은 자동 할당시 사용)
- 소켓 프로그래밍
소켓(Socket)
시스템이 어플리케이션이 네트워크 기능을
사용할 수 있도록 제공한 ‘프로그래밍 인터페이스’
(어플리케이션은 소켓을 이용해 데이터를 주고 받는다)
개발자는 socket programming을 통해
네트워크 상의 다른 프로세스와 데이터를 주고 받도록 구현
대부분의 시스템은 socket 형태로 네트워크 기능 제공
다만, socket을 직접 조작해서 통신을 구현하는 일은 적음
(aplication layer의 프로토콜은 보통 라이브러리나
모듈 형태로 해당 기능이 제공되는데,
이 때, 내부를 열어보면 소켓을 활용해서 프로토콜을 구현했음을 알 수 있음)
socket은 <protocol, Ip Address, port number>로 정의됨
(ex : TCP , 9.5.3.0, 8000)
(바인딩은 IP 주소와 프로토콜, 포트를 묶어준다는 의미!)
각 socket은 인터넷 상에서 ‘유니크’하다
(다만 시스템 레벨에서 구현 시 조금 얘기가 달라짐)
(UDP인 경우는 맞음, 그러나 TCP인 경우는 아님)
(TCP 수신(서버) 측에서, 여러 송신측(클라)과 연결된 경우,
서버측의 소켓은 여러개가 생기지만 모두 같은 IP와 port number를 가지게 됨)
(이 때, ‘연결 요청’은 ‘듣기 식별자’로 처리하며
이후 연결 성립 후는 보낸 쪽의 ip와 port도 확인하여 처리)
(비슷한 현상은 클라이언트에도 생길 수 있기는 하다)
(소켓을 아주 많이 사용한다면 겹치는 포트 번호가 없기에 이러한 상황이 발생할 수는 있음)
(참고로 이때 동일한 수신측에 추가로 접근하려 한다면 TCP의 원칙에 어긋나게 됨 -> 송신/수신측의 IP,Port 주소는 유니크해야 하므로)
socket은 각 호스트를 대표하므로, ‘끝’의 노드에 위치해 있음
프로토콜 표준에서는
‘port를 유니크하게 식별하는 주소’의 의미 혹은 port 자체를 의미하기도 한다
한 쌍의 socket은 Connection(안정적이고 논리적인 데이터 통로)을
유니크하게 식별 가능
(Connection을 요청한 쪽이 src socket, 받는 쪽이 dest socket)
소켓을 구조체로 구현하는 경우 들어가는 정보들
-
- 파일 디스크립터(File Descriptor)
- 네트워크 소켓을 식별하기 위한 번호, 운영체제에서 관리 (정숫값)
- 파일 디스크립터(File Descriptor)
-
- 소켓 유형(socket type)
- 소켓의 종류를 나타내는 정보로, stream socket(TCP)인지,
datagram socket(UDP)인지를 나타낸다
- 소켓 유형(socket type)
-
- 프로토콜 및 주소 패밀리(protocol and Address Family)
- 소켓이 사용하는 프로토콜과 주소 패밀리에 대한 정보를 담는다
프로토콜은 TCP(IPPROTO_TCP) 혹은 UDP(IPPROTO_UDP),
주소 패밀리는 IPv4(AF_INET) 혹은 IPv6(AF_INET6)를 사용
- 프로토콜 및 주소 패밀리(protocol and Address Family)
-
- 로컬 및 원격 주소(Local and Remote Address)
- 소켓의 로컬 주소와 연결된 원격 주소 정보를 담음
‘struct sockaddr’ 이나 기타 구조체가 사용됨
- 로컬 및 원격 주소(Local and Remote Address)
-
- 상태정보(Status Information)
- 소켓의 현재 상태를 나타내는 정보로, 연결된지 여부,
송수신된 데이터 양 등의 정보가 포함 가능
- 상태정보(Status Information)
- 그외 ‘타임아웃 설정’ 등이 사용될 수 있음
소켓 인터페이스
네트워크를 통해 데이터를 주고 받기 위한 일종의 프로그래밍 인터페이스로
소켓 구조체들을 다루기 위한 함수들을 제공함
-
- socket()
- 소켓을 생성하는 함수, 프로토콜과 소켓 타입을 지정하여 소켓을 만듦
주소 패밀리 와 소켓 타입 을 설정할 수 있음
- socket()
-
- bind()
- 소켓에 IP주소와 포트 번호를 할당하는 함수로,
소켓에 특정 주소를 바인딩함
(서버에서 주로 사용)
- bind()
-
- listen()
- 연결 요청을 받기 위해 소켓을 수동 대기 상태로 변경하는 함수
주로 서버에서 사용되며, ‘accept()’호출을 기다림
이 때, ‘듣기 식별자’가 생성
- listen()
-
- accept()
- 클라이언트의 연결 요청을 받아들이고,
연결된 새로운 소켓을 생성하는 함수
주로 서버에서 사용되며, 클라이언트와 통신을 담당하는 새로운 소켓을 반환
- accept()
-
- connect()
- 클라이언트가 서버에 연결하기 위해 호출하는 함수
소켓을 특정 서버 주소와 포트에 연결
이 때, ‘연결 식별자’가 생성
- connect()
-
- send()와 recv()
- 데이터를 송신하거나 수신하는 함수
- send()와 recv()
-
- close()
- 소켓을 닫는 함수
사용이 끝난 소켓을 닫아 자원 해제
-
- 듣기 식별자? 연결 식별자?
- 듣기 식별자는 ‘클라이언트 연결 요청’을 위해 생성되며
서버가 살아있는 동안 계속 존재한다
연결 식별자는 ‘클라이언트와 서버의 연결’을 위해 생성되며
서버가 연결 요청을 ‘수락’할때마다 생성되고
서버가 클라이언트에 서비스 하는 동안만 존재한다
(이러한 식별자 구분은 여러 클라이언트가 서버에 접속할 때 유용하다 한다)
- 듣기 식별자? 연결 식별자?
- close()
댓글남기기