소켓에 대해서 공부한 내용을 정리한다.
"뽀따"님께서 개념을 쉽게 잘 정리해주셔서 이해에 많은 도움이 되었다.
내가 정리한 내용도 "뽀따"님의 블로그를 보고 내가 필요할 거 같은 부분을 간략히 서술한 것이다.
세부적인 내용은 "뽀따"님의 블로그를 방문해서 학습하자.
https://recipes4dev.tistory.com/153
소켓이란 ?
위키피디아 내용은 이렇다.
https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%EC%86%8C%EC%BC%93
쉽게 정의해보자면..
네트워크 소켓은 프로그램이 네트워크에서 데이터를 송수신할 수 있도록, "네트워크 환경에 연결할 수 있게 만들어진 연결부" 라고 한다.
보통 OSI 7 layer 중에 4 계층인 TCP 에서 소켓을 사용하는데 이를 TCP 소켓이라고 한다. (UDP 에서 사용하는 소켓은 UDP 소켓)
TCP와 UDP의 비교는 지난 게시글에서 약간 다뤘고, 지금 하려는 것은 TCP 통신이므로 TCP 소켓에 대해 알아보자.
TCP/IP socket programming
TCP/IP 소켓 프로그래밍에는 두 개의 소켓이 사용된다.
1. 클라이언트 소켓
2. 서버 소켓 ( + 데이터 송수신 소켓 )
서버 소켓 뒤에 +데이터 송수신 소켓을 넣어놨는데 이는 추후에 설명하겠다.
두 개의 시스템(또는 프로세스)이 소켓을 통해 네트워크 연결하기 위해서는 한 곳에서 다른 곳으로 "연결 요청"을 해야한다.
먼저 해당 IP주소와 포트번호로 식별되는 대상에게 연결할 의사가 있다는 것을 알리는 것이다.
"연결 요청"한다고 바로 연결이 되는 것은 아니다. 요청을 받은 대상에서 연결할 준비가 되어야 한다.
그래서 대상이 되는 곳에서는 어떤 연결을 받을지 미리 시스템에 등록하여 준비를 한다. (일반적으로 포트 넘버로 설정됨)
여기서 연결 요청을 보내는 곳을 "클라이언트 소켓", 요청을 받는 곳을 "서버 소켓" 이라고 한다.
그렇다고 "클라이언트 소켓"과 "서버 소켓"이 다른 개념이 아니다. 둘은 같은 소켓이지만, 절차를 구분하기 위해, 그리고 처리되는 흐름(API 순서)이 다르기에 나뉘어 부르는 것이다.
소켓 API 흐름에 대해서 알아보자.
- 클라이언트 소켓은 처음 소켓을 생성(Socket)한 다음, 서버 측에 연결을 요청(Connect)한다. 서버 소켓에서 요청을 받아주면, 데이터를 송수신(Send/Recv)하고 모든 처리가 완료되면 소켓을 닫는다(Close).
- 서버 소켓은 처음 소켓을 생성(Socket)하고 서버가 사용할 IP와 port 번호를 소켓에 결합(Bind)한다. 그런 다음 클라이언트 측에서 연결 요청이 오는지 주시(Listen)하고, 요청이 왔다면 받아들이며(Accept), 데이터 통신을 위한 소켓을 생성한다. 이 새로운 소켓을 통해 연결이 성립(Established)되면, 마찬가지로 데이터를 송수신(Send/Recv)할 수 있다. 서버도 역시 처리가 완료되면 소켓을 닫는다(Close).
각 API 의 자세한 내용들은 이 게시글 맨 위에 링크해놓은 게시글을 참고하자.
서버 소켓의 API 흐름에 잠시 언급했듯이, Accept() 에서 새로운 소켓이 생성되어 데이터 송수신을 담당하고,
서버 소켓은 다른 클라이언트 소켓들을 위해 생성-결합-주시-수락-닫기 사이클을 계속 한다는 것을 기억하자.
'개발 > 통신' 카테고리의 다른 글
InputStream, OutputStream (0) | 2020.05.17 |
---|---|
TCP/IP (0) | 2020.05.07 |
댓글