CS/네트워크
#3 Application Layer 1 - 소켓(Socket)
Scala0114
2021. 10. 28. 18:48
1. 소켓(Socket)
소켓은 응용 계층에서 프로세스간 통신을 쉽게 행하기 위한 창구의 역할을 한다. 사용자는 소켓이라는 형태로
통신할 대상과의 연결을 확립하고 소켓과의 송/수신으로 대상과의 송/수신을 하는 것과 마찬가지인 결과를
얻게된다. 즉, 소켓을 사용하는 법만 알면 하위 계층에 대한 지식이 없더라도 쉽게 통신이 가능해지는 것이다.
서버와 클라이언트가 특정 port 를 통해 실시간 양방향 통신을 하는 방식이기에 실시간 통신이 필요한
스트리밍이나 채팅 등의 서비스에 사용된다.
2. 소켓의 종류
① 스트림(TCP 소켓)
- 서버측 흐름
- 소켓 생성(socket)
- 포트번호 설정(bind)
- 수신 대기열 생성(listen)
- 연결 대기(accept) - 연결 요청이 들어올 때 까지 block 상태
- 연결 요청이 들어오면 handshaking 과정을 거쳐 연결수립
- 이후 양방향 통신 가능
- 연결 종료 요청이 들어오면 종료과정을 거쳐 연결종료(close)
- 클라이언트측 흐름
- 소켓 생성(socket)
- 연결 요청(connect) - handshaking 과정을 거쳐 연결수립
- 이후 양방향 통신 가능
- 통신 종료시 종료 요청(close) - 종료 과정을 거쳐 연결종료
- 연결 지향성 양방향 통신을 위한 소켓
- 데이터를 스트림 형태로 전송하기에 데이터간의 경계가 없음
- 데이터의 순서유지와 무결성 보장
- 대량의 데이터를 안전하게 주고받기 위해 사용
② 데이터그램(UDP 소켓)
- 서버측 흐름
- 소켓 생성(socket)
- 포트번호 설정(bind)
- 요청 대기(recvfrom) - request 데이터그램을 수신할 때 까지 대기
- 요청이 들어오면 응답(sendto)
- 클라이언트측 흐름
- 소켓 생성(socket)
- 요청(sendTo)
- 응답 대기(recvfrom)
- 통신 완료시 연결 종료(close)
- 비연결형 통신을 위한 소켓
- 한번의 전송으로 보낼 수 있는 데이터의 크기에 제한이 있다.
- 데이터의 순서유지와 무결성을 보장하지 않음
- 신뢰성보다는 속도가 중시되는 경우, 작은 데이터를 자주 보내야하는 경우 등에 사용(RTP 등)