소켓(Socket)이란?
- 애플리케이션(application)과 네트워크 간의 인터페이스
- 애플리케이션이 소켓을 생성함
- 소켓의 타입은 커뮤니케이션 스타일을 나타냄
- reliable vs best effort
- connection-oriented vs connectionless
- 소켓이 일단 생성되면
- 네트워크 전송을 위해 소켓에 데이터를 전달함
- 소켓으로부터 다른 호스트가 보내온 데이터를 받아옴
- TCP 방식으로 보내고 싶다면 TCP 소켓으로, UDP 방식으로 보내고 싶다면 UDP 소켓으로
소켓의 두 가지 종류
- UDP 소켓 (SOCK_DGRAM_ 소켓 데이터그램)
- 안정적이지 않은 전달
- 순서가 보장되지 않음
- '연결(connection)'의 개념이 없고, 앱이 각 패킷에대해 목적지를 표시함
- send또는 receive 만 가능( 단방향적인건가?? )
- TCP 소켓 (SOCK_STREAM)
- 안정적인 전달
- 순서 보장됨
- 연결(connection) 기반
- 양방향성을 가짐
Sockets API
- Function : socket()
int socket(int domain, int type, int protocol);
- 소켓 생성
- file descriptor나 -1을 반환하는 함수, 실패시 errno 설정
- Parameter
- domain : protocol family ( = address family )
- type : 커뮤니케이션 방식(SOCK_STREAM(TCP) / SOCK_DGRAM(UDP))
- protocol : protocol within family
- Function : bind()
-
int bind (int sockfd, struct sockaddr* myaddr, int addrlen);
- socket()에서 생성한 소켓의 IP를 이용해서 특정 포트넘버에 바인딩 하겠다.
-
- Function : listen()
-
int listen (int sockfd, int backlog);
- socket()에서 생성한 소켓을 listen 용도로 사용할 것이며, 혹시 동시에 request 가 들어오면 동시에 몇개까지 queue에 담아놓고 순서대로 처리하겠다.
-
- Function : accept()
-
int accept(int sockfd, struct sockaddr* cliaddr, int* addrlen);
- 준비 동작이 완료되었고 클라이언트로부터 연결을 기다리겠다.
- accept는 수행되면 block 되어있다가, 클라이언트로부터 connection 요청이 들어오면 수행이 되면서 return 됨. return 될 때 두 번째 parameter cliaddr에 클라이언트의 ip와 port number가 저장이 됨 -> 서버도 클라이언트의 ip주소와 port number를 알게됨
-
- Function : connect()
-
int connect (int sockfd, struct sockaddr* servaddr, int addrlen);
- parameter로 server의 주소와 port number가 필요함
-
참고
클라이언트쪽에서 bind() 함수 사용되지 않는 이유 : bind는 특정 소켓을 특정 포트넘버에 바인드 해주는 개념인데 클라이언트는 특정 포트에 bind 할 필요가 없음(아무 포트나 사용해도 됨) -> 굳이 할 필요 없음
참고
서버/클라이언트 예시 소스코드 -> 패드 필기 자료(3.pdf) 참고
- Function : write()
- Function : read()
- Function : close()
- 데이터 교환이 다 끝난 후 최종적으로 close 해서 주어야 다른 프로세서가 소켓 사용 가능함.
'이론공부 > 컴퓨터네트워크' 카테고리의 다른 글
[컴퓨터네트워크] 03. 트랜스포트 계층1 (0) | 2022.05.01 |
---|---|
[컴퓨터네트워크] 02. 애플리케이션 계층1 (0) | 2022.04.26 |
[컴퓨터네트워크] 01. 컴퓨터 네트워크 기본 (0) | 2022.04.26 |
댓글