소개

본 장에서는 Tmax 에서 제공되는 X.25 게이트웨이의 개요 및 서비스 유형에 대해 기술한다.

1. 개요

X.25 게이트웨이(이하 X25GW)는 Tmax 서버와 Non-Tmax 서버(이하 리모트 노드) 간의 인터페이스를 담당하는 Tmax에서 제공되는 게이트웨이이다. X25GW는 Tmax 서버의 한 종류로써 X.25로 연결되어 있는 UNIX/Windows 서버 등과의 게이트웨이 역할을 한다. 리모트 노드에서 보내온 메시지를 X25GW는 해당 서비스를 tpacall()하며, 서비스 결과는 처음 요청한 리모트 노드로 전송한다. 반대로 Tmax 서비스에서 X25GW를 tpcall()이나 기타 다른 방식으로 서비스를 요청하면 X25GW는 리모트 노드로 요청 메시지를 보낸 후 응답이 오면 자신을 call한 서비스로 tpreturn()한다.

Attach, Detach, 메시지를 주고받는 일과 같은 복잡하게 타 시스템과 X.25로 연결하기 위해 필요한 작업들은 모두 X.25 게이트웨이에서 처리하므로 개발자는 업무 로직만을 작성하면 된다.

X25GW 동작하는 방식은 Tmax의 서비스나 클라이언트에서 리모트 노드로 서비스를 요청하는 방식과 반대로 리모트 노드에서 Tmax의 서비스를 호출하는 방식으로 나눌 수 있다.

다음은 X25GW의 동작 구조이다.

figure 1 1
X25GW 동작 구조
  • Tmax에서 서비스 요청

    X25GW 동작 구조에서 점선 표시된 내용으로 Tmax 클라이언트는 서비스로부터 서비스 요청을 받아서 리모트 노드로 서비스를 요청할 수 있다. 이와 같은 서비스를 INBOUND 서비스라고 한다.

  • 리모트 노드로부터 서비스 요청

    X25GW 동작 구조에서 실선 표시된 내용으로 TCPGW는 리모트 노드로부터 서비스 요청을 받아서 처리할 수 있다. 이와 같은 서비스를 OUTBOUND 서비스라고 한다.

    OUTBOUND인 경우에는 리모트 노드에서 Tmax의 서비스명을 이용하여 서비스를 호출한다.

다음은 동기/비동기 방식으로 서비스를 요청하는 경우 X25GW의 동작 구조이다.

figure 1 2
동기 / 비동기 X25GW 동작 구조
  • 동기형 호출 방식

    동기 / 비동기 X25GW 동작 구조에서 점선 표시된 내용으로 Tmax 클라이언트나 서비스에서 X25GW를 바로 호출하고 응답이 올 때까지 기다리는 통신방식이다.

  • 비동기형 호출 방식

    동기 / 비동기 X25GW 동작 구조에서 실선 표시된 내용으로 Tmax 클라이언트가 Tmax 서비스를 호출하면 그 서비스에서 X25GW로 제어권이 넘어가서 해당 서비스는 다른 서비스 요청을 받을 수 있게 되고, X25GW가 리모트 노드로부터 응답을 받게 되면 응답을 처리하는 서비스로 요청을 넘겨주는 방식으로 동작하게 된다.

Tmax에 설치되는 X25GW는 Tmax 서버의 한 종류로서 Tmax 환경 파일에 서버로 등록해야만 사용할 수 있다. 일반 서버는 TCS나 UCS용 서버 라이브러리를 이용하여 서버를 생성하나 X25GW는 외부와 통신을 담당하는 라이브러리(libx25gw.a, libx25gw.so)와 사용자가 작성한 프로그램(custom.c)과 Link하여 서버를 생성한다. Tmax 환경을 설정하고 프로그램(custom.c, custom.h)을 작성해야 하므로 더 자세한 사항은 본 안내서의 환경설정사용자 프로그램과 함수에서 더 상세히 설명하도록 한다.

2. 서비스의 유형

X25GW는 Tmax에서 제공하는 라이브러리(libx25gw.a, libx25gw.so)와 개발자가 작성하는 custom.c, custom.h를 함께 링크하여 만들어진다. 이렇게 만들어진 X25GW는 리모트 노드와 통신을 하며, Tmax 클라이언트의 요청을 리모트 노드로 보내기도 하고 리모트 노드의 요청을 Tmax 서비스에서 처리하도록 중간역할을 해 준다.

X25GW는 크게 동작하는 방식에 따라 동기형 X25GW와 비동기형 X25GW로 나눈다.

2.1. 동기형 X25GW

동기형 방식은 Tmax의 클라이언트나 서버에서 서비스를 요청하고 응답이 서비스를 요청한 클라이언트나 서버로 오는 방식이다. 반대로 리모트 노드에서 서비스를 요청하면 X25GW는 Tmax의 서비스를 요청하고 그 결과를 서비스를 요청한 리모트 노드에 되돌려주기도 한다. 전자인 경우 리모트 노드로 서비스를 요청한 Tmax 서비스가 블록되는가, 또는 블록되지 않는가에 따라 X25GW는 다르게 동작한다. 또한, 후자인 경우에는 리모트 노드에서 요청한 처리 결과를 돌려줄 때 요청한 채널로 돌려주는 방식이다.

Tmax의 클라이언트나 서버에서 리모트 노드로 동기형 방식으로 서비스를 요청할 경우에는 반드시 X25GW와 리모트 노드 간에 UID(Unique ID)를 서로 공유해야 한다.

서비스 블록형 방식

서비스 블록형 방식 방식은 Tmax의 서버나 클라이언트에서 X25GW로 서비스를 요청하고 그 결과가 올 때까지 기다리는 가장 일반적인 방식이다. 아래 그림 처럼 Tmax 클라이언트의 요청을 받은 서비스에서 X25GW로 서비스를 tpcall을 하면 리모트 노드에서 처리 결과를 송신할 때까지 Tmax 서비스(SVC1)가 블록되어 있게 된다.

X25GW를 동작시키게 되면 Tmax 클라이언트에서 호출한 Tmax 서비스는 X25GW를 호출한 후에 결과를 받을 때까지 블록이 되어 있게 된다. tpacall을 한 경우도 tpgetrply로 응답을 받는 곳에서 블록이 되기 때문에 tpcall()과 마찬가지로 블록이 되게 된다. 따라서 많은 수의 요청을 받아들이기 위해서는 블록이 되는 시간까지 감안하여 많은 수의 서버를 실행해야 한다. 이는 대외기관 통신에서는 대외기관의 장애(머신, 네트워크)에 따라서 많은 수의 서버가 필요로 하기 때문이다.

다음은 동기형 X25GW에서 서비스 블록형 방식의 동작 구조이다.

figure 2 1
블록형 동기 X25GW 동작 구조
  1. X25GW와 리모트 노드는 연결되어 있는 상태이다.

  2. Tmax 클라이언트는 Tmax 서비스를 tpcall한다.

  3. Tmax 서비스에서는 클라이언트의 요청을 받아들여 X25GW로 서비스를 tpcall한다.

  4. X25GW는 연결되어 있는 리모트 노드에 서비스를 요청한다.

  5. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단한다.

  6. 리모트 노드에서 온 결과를 X25GW 서비스를 호출한 Tmax 서비스로 tpreturn한다.

  7. 결과를 받은 Tmax 서비스는 Tmax 클라이언트로 tpreturn한다.

서비스 NON 블록형 방식

서비스 NON 블록형 방식은 Tmax 클라이언트에서 직접 X25GW를 요청하는 방식에서는 사용할 수 없고, X25GW에 서비스를 요청하고 결과를 수신하는 서버를 중간에 두어서 처리하는 방식이다. X25GW 앞에 송신 서비스와 수신 서비스를 두고 Tmax 클라이언트는 송신 서비스를 호출하고, 송신 서비스는 X25GW로 서비스를 전달하고 서비스를 종료한다. X25GW는 리모트 노드로 서비스를 요청하여 그 결과를 수신하면, 해당 결과를 수신 서비스에게 전달한다. 수신 서비스는 X25GW로부터 결과를 수신받아 클라이언트에게 전달하면 서비스 사이클이 종료되는 방식이다. 결과적으로 클라이언트는 서비스를 요청하고 결과를 받는 동기방식이나 서버는 요청을 전달하고 종료하는 비동기방식처럼 동작한다.

X25GW는 블록형 방식에서 수행하는 방식보다도 적은 서버로도 많은 처리를 할 수 있다. 블록형 방식은 서비스가 X25GW를 호출하고 블록되기 때문에 동시에 많은 처리를 위해서는 보다 많은 서버 프로세스를 실행 해야하나, NON 블록형 방식에서는 자신의 일만 처리하고 서비스를 종료하기 때문에 적은 서버 프로세스로도 많은 일을 할 수 있다. 따라서 대외기간 간에 통신을 처리 하는 경우에는 NON 블록형 방식이 보다 효율적이라고 할 수 있다.

다음은 동기형 X25GW에서 서비스 NON 블록형 방식의 동작 구조이다.

figure 2 2
NON 블록형 동기 X25GW 동작 구조
  1. X25GW와 리모트 노드는 연결되어 있는 상태이다.

  2. Tmax 클라이언트는 Tmax 서비스를 tpcall한다.

  3. Tmax 서비스에서는 클라이언트의 요청을 받아들여 X25GW 서비스를 tpforward한다.

  4. X25GW는 연결되어 있는 리모트 노드에 메시지를 전송한다.

  5. 리모트 노드에서 결과가 오면 에러인지 아닌지를 판단한다.

  6. 리모트 노드에서 온 결과를 tprelay할 서비스로 tprelay한다.

  7. X25GW 서비스로부터 결과를 받은 서비스(Tmax클라이언트로 부터 tprelay할 서비스로 지정된 서비스)는 Tmax 클라이언트로 tpreturn한다.

리모트 동기형 호출 방식

리모트 동기형 호출 방식은 리모트 노드에서 X25GW로 먼저 서비스를 요청하는 방식이다. X25GW는 리모트 노드에서 요청한 서비스를 호출하고 그 결과를 받아서 해당 서비스를 요청한 채널로 결과를 전송한다. 리모트 노드는 동시에 X25GW로 Tmax Config에 정의되어 있는 MAXSACALL 개수를 초과하여 호출할 수 없다.

리모트 동기형 호출 방식은 리모트 노드에서 Tmax의 서비스를 호출하는 가장 보편적인 방식이다. X25GW는 리모트 노드의 채널 정보를 보관하였다가 서비스로부터 결과를 수신받으면, 보관하고 있는 채널중에서 해당 채널을 찾아서 결과를 전송한다. 이때 해당 채널로 결과를 되돌려 주기 전에 다른 요청은 얼마든지 가능하다. 즉, X25GW는 리모트 노드에서 요청한 채널은 블록시키지 않고 다음 요청을 받을 수 있도록 처리하기 때문에 X25GW를 운영하는 방식에 따라서 다르게 처리할 수 있다.

다음은 동기형 X25GW에서 리모트 동기형 호출 방식의 동작 구조이다.

figure 2 3
리모트 동기형 X25GW 동작 구조
  1. X25GW와 리모트 노드는 연결되어 있는 상태이다.

  2. 리모트 노드는 X25GW와 연결된 채널로 메시지를 전송한다.

  3. X25GW는 tpacall()로 Tmax 서비스를 호출한다.

  4. 서비스 처리 결과를 X25GW는 받아서 메시지를 요청한 채널을 찾는다.

  5. 해당 채널이 정상적으로 연결되어 있으면 결과를 전송한다.

2.2. 비동기형 X25GW

비동기형 호출 방식은 Tmax의 클라이언트나 서버 또는 리모트 노드에서 X25GW 서비스를 요청만 하고, 그 결과는 받지 않거나 또는 서비스를 요청한 곳이 아닌 다른 프로그램에서 처리하는 방식이다. 먼저 Tmax의 서비스에서 X25GW로 서비스를 요청하고 그 결과는 다른 서비스로 받을 수 있다. 그러나 클라이언트인 경우에는 비동기형으로 처리할때는 tpacall로써 응답을 받지 않는 경우에만 가능하다. 반대로, 리모트 노드에서 서비스를 먼저 요청하는 경우에 위에서와 같이 서비스만 요청하고 결과를 받지 않을수도 있고, 서비스를 요청하고 결과는 다른 채널로 돌려주는 방식이 비동기형 방식이다.

Tmax에서 서비스 요청 방식

Tmax의 서비스에서 X25GW로 tpacall에 TPNOREPLY로 요청하고 해당 서비스는 종료한다. X25GW는 리모트 노드로 요청를 보내고 해당 결과가 수신되면 Tmax의 다른 서비스를 tpacall에 TPNOREPLY로 호출하여 결과를 처리하게 하는 방식이다.

다음은 비동기형 X25GW에서 Tmax에서 서비스를 요청하는 경우 동작 구조이다.

figure 2 4
Tmax 요청 비동기형 X25GW 동작 구조
  1. Tmax 서비스에서 X25GW로 서비스를 요청한다. (tpacall에 TPNOREPLY)

  2. X25GW는 리모트 노드로 데이터를 전송한다.

  3. X25GW는 리모트 노드로 부터 데이터를 수신받는다.

  4. X25GW는 Tmax의 다른 서비스 호출한다. (tpacall에 TPNOREPLY)

리모트에서 서비스 요청 방식

리모트 노드에서 먼저 서비스를 X25GW로 요청하면, X25GW는 tpacall로 Tmax 서비스를 요청한다. Tmax의 서비스 처리가 완료되면 X25GW는 리모트 노드와 연결된 채널 중에서 사용 가능한 채널 중 아무 채널에 처리 결과를 전송한다.

다음은 비동기형 X25GW에서 리모트 노드에서 서비스를 요청하는 경우 동작 구조이다.

figure 2 5
리모트 요청 비동기형 X25GW 동작 구조
  1. 리모트 노드에서 X25GW로 서비스를 요청한다.

  2. X25GW는 Tmax의 서비스를 tpacall로 요청한다.

  3. Tmax의 서비스를 처리 결과를 X25GW에 전달한다.

  4. X25GW는 리모트 노드와 연결된 채널 중에서 채널 테이블에서 채널을 검색하여 결과를 전송한다.

3. 게이트웨이 기타 기능

본 절에서는 게이트웨이 기타 기능에 대해서 설명한다.

3.1. 게이트웨이 헤더

X25GW는 Tmax 클라이언트나 서버에서 호출할 경우 게이트웨이 헤더를 사용할 수 있다. 이를 사용하기 위해서는 X25GW의 다른 라이브러리를 사용해야 한다. 보통은 (libx25gw.a, libx25gw.so)를 사용하나 게이트웨이 헤더를 사용하고자 하는 경우에는 libx25gw.gwh.a나 libx25gw.gwh.so를 사용해야 한다. 게이트웨이 헤더는 모든 데이터 버퍼의 가장 처음 Offset에 위치해야 한다. 사용자 헤더를 사용할 경우에 게이트웨이 헤더 다음에 사용자 헤더가 와야한다.

게이트웨이 헤더는 여러가지 다목적으로 사용하는데, X25GW에서는 여러 항목 중에서 svc 항목만 사용 가능하다. NON 블록킹 모드로 사용하는 경우나 비동기 방식으로 사용할 때 응답 데이터에 대해 처리할 서비스명을 지정하고자 하는 경우에 사용한다. 게이트웨이 헤더는 보통 사용자 헤더를 사용하지 않을 경우에 응답을 처리할 서비스를 메시지별로 처리하고자 하는 경우에 사용한다.

3.2. 서비스명을 찾는 순서

NON 블록형 X25GW나 또는 비동기형 X25GW인 경우 리모트 노드에서 온 요청이나 응답을 처리할 Tmax의 서비스가 있어야 한다. X25GW는 서비스명을 알 수가 없으므로 사용자가 적당한 서비스명을 지정해야 하는데 X25GW는 다음과 같이 3가지 방식으로 서비스명을 찾는다. 서비스명은 반드시 Tmax 환경 파일에 등록되어 있어야 한다.

  • 게이트웨이 헤더를 사용할 경우에만 가능하다. Tmax 클라이언트나 서비스에서 X25GW를 요청할 때 게이트웨이 헤더에 서비스명을 넣어서 X25GW를 호출하면 X25GW는 가장 우선적으로 이 서비스명을 사용한다.

  • 사용자 헤더에서 서비스명을 찾는다. Tmax 클라이언트나 서비스에서 X25GW를 요청할 때 사용자 헤더에 서비스명을 넣은 후에 사용자 함수 get_service_name에서 서비스명을 얻을 수 있다.

  • CLOPT의 [-S] 옵션에 지정한 서비스를 이용한다. 이런 경우에는 모든 메시지에 대해서 동일한 서비스가 적용된다.

리모트 노드에서 최초로 서비스를 요청할 경우에는 위의 방식을 따르지 않고 사용자가 get_msg_info에서 서비스명을 지정해야 한다.

3.3. 사용자 임의의 채널 지정

완전한 비동기 방식으로 X25GW를 구성한 경우에 사용자는 리모트 노드로 전송할 채널을 지정할 수있다. CLOPT에 [-a]를 사용한다. 완전한 비동기 방식은 서로 간에 응답이 없다. 응답 데이터도 서비스 요청 형식으로 전달 되어야 한다. 예를 들어 Tmax의 클라이언트나 서비스에서 X25GW로 tpacall에 TPNOREPLY로 호출하면 X25GW는 서비스 요청에 대한 UID와 어떤 정보 데이터도 보관하지 않고 리모트 노드로 데이터를 전송하고 해당 서비스를 종료한다. 나중에 리모트 노드로부터 응답에 대한 메시지를 수신받았을 경우에도 이를 서비스 요청으로 처리한다. 반대인 경우에(리모트 노드에서 먼저 요청)도 동일하게 처리한다.

위와 같은 경우에 사용자는 리모트 노드로 전송할 채널번호를 지정할 수 있다. CLOPT에 [-u] 옵션을 사용한다. 채널 지정은 다음과 같이 2가지 경우가 있다.

  • Tmax에서 먼저 서비스를 리모트 노드로 요청한 경우 X25GW는 get_channel_num 함수를 호출하는데 사용자는 전송 데이터를 분석하여 채널을 지정할 수 있다.

  • 리모트 노드에서 먼저 요청한 경우인데, 리모트 노드에서 서비스를 요청할 때 get_msg_info 함수에서 리모트 노드에서 요청한 채널을 데이터에 보관하여 Tmax 서비스를 호출한다. Tmax 서비스는 결과를 리모트 노드로 전송하기 위해 tpacall에 TPNOREPLY로 다시 X25GW로 서비스를 보낸다. 사용자는 get_channel_num에서 이전에 보관한 채널을 사용하여 리모트 노드로 응답을 전송할 수 있다. X25GW와 Tmax 엔진 사이의 채널이 블록되지 않고 서비스를 요청한 채널로 응답을 전송할 수 있다.

3.4. RESET 처리 방법

X25GW에서는 리모트와 임의의 reset를 주고받을 수 있다. 그러나 시스템 장애나 프로그램 버그, 또는 리모트와 환경를 잘못 지정하여 비정상적으로 많은 reset를 주고받는 문제가 종종 발생한다. 이렇게 비정상적으로 많은 reset이 발생하면 게이트웨이는 루핑이 돌게 되어 업무 처리를 할 수가 없게 된다. 이러한 문제를 미연에 방지하기 위해 게이트웨이에서는 연속해서 reset이 지정된 횟수(100회)를 초과하면 자동적으로 해당 채널의 세션을 해제하고 다시 연결을 맺도록하여 reset의 비정상적인 문제를 해결하고 있다. 정상적으로 리모트에서 읽게되면 reset 횟수는 Clear된다.