본문 바로가기
오라클/WebLogic

[웹로직] Client-Server 간 소켓 통신 절차

by sangyeon 2021. 9. 13.
728x90

웹로직은 외부적으로 웹 환경에서의 서비스와 내부적으로는 여러 서버와 데이터를 주고 받는 작업에 소켓을 사용한다.

 

1. Client-Server간 소켓 연결 절차

로컬(local)에서 원격(remote)으로 요청을 받기 위해서 accept() 메소드를 사용해 요청을 받을 준비를 하고 로컬의 소켓 클래스로 원격과의 연결을 만든다.

만들어진 연결로 로컬과 원격은 메시지를 버퍼에 담아 주고받으며 메시지가 전송되면 close() 메소드를 사용해 소켓을 닫는다.

그림 1-1. 자바 서버의 소켓 통신 개요

자바를 통해 요청되는 소켓 연결은 플랫폼의 네이티브 환경을 사용하고 플랫폼의 내부적 통신은 다음의 순서로 진행된다.

그림 1-2. 소켓 연결 및 데이터 송수신 절차

 

1-1. 로컬의 소켓은 connect()를 수행하여 Listen 중인 원격에 SYN을 보내고 SYN_SENT 상태가 된다.

1-2. SYN을 받은 원격의 소켓은 SYN_RECV 상태가 되고 다시 로컬에 SYN을 보낸다.

1-3. SYN을 받은 로컬 소켓은 ESTABLISHED 상태가 되고 클라이언트에 ACK를 보낸다.

1-4. ACK를 받은 원격 소켓은 ESTABLISHED 상태가 된다.

 

 

 

2. Client-Server간 소켓 연결 해제 절차

소켓은 ESTABLISHED 상태인 로컬과 원격의 소켓으로 메시지를 주고 받는다. 소켓 자원을 사용 후 반납하기 위한 순서는 다음과 같이 진행 된다.

그림 2-1. 소켓 연결의 close()시 상태 변화

2-1. 로컬의 소켓은 close()를 수행하여 ESTABLISHED 상태의 소켓을 닫고자 FIN_WAIT_1 상태로 변경되고 원격에 FIN_ACK를 보내고 CLOSING 상태가 된다.

2-2. FIN_ACK를 받은 원격 소켓은 CLOSE_WAIT 상태가 되고 로컬에 ACK를 보낸다.

2-3. ACK를 받은 로컬 소켓은 FIN_WAIT_2 상태가 되고 원격에 close()가 수행되어 FIN_ACK를 다시 보내면 TIMED_WAIT 상태가 된다.

2-4. LAST_ACK 상태의 원격 소켓이 로컬로부터 ACK를 받으면 연결된 소켓이 해지된다.

 

 

3. 소켓 통신 오류

로컬 소켓과 원격 소켓에 문제가 있거나 네트워크 상태에 따라 LISTEN이나 ESTABLISHED가 아닌 다른 상태로 표시되는데, 각 상태에 대한 설명은 아래와 같다.

 

- SYNC_SENT : 로컬에서 connect()를 호출하고 SYN을 받지 못함.

- SYNC_RECV : LISTEN 상태의 로컬이 SYN을 받고 원격에 SYN을 보냈으나 ACK를 받지 못함

- FIN_WAIT_1 : 로컬에서 close()를 호출했는데 원격에서 ACK를 받지 못함

- FIN_WAIT_2 : 로컬에서 close()를 호출했는데 원격이 close()를 호출하지 못함

- TIME_WAIT : FIN_WAIT_2에서 일정 시간이 지난 후 상태

각 상태에 따라 로컬과 원격의 상태를 확인하고 문제가 있다고 판단되는 부분에 확인과 조치가 필요하다.

728x90