FIX 세션 메시지 - 로그인

2019. 12. 10. 13:48FIX

FIX가 세션 정보를 바탕으로 구성을 완료했으면, 실제 메시지가 어떻게 흘러가는지 확인해 보자.

 

1. 재전송(Recovery)이 없는 경우 로그인

클라이언트 (예: ACOMPID) 서버 (예: BCOMPID)
로그인 요청(35=A)  
  로그인 응답(35=A)
Heartbeat 전송(35=0)  
  Heartbeat 응답(35=0)

시퀀스(Sequence)가 초기화 된 이후의 최초 로그인은 양쪽에서 MsgSeqNum(Tag.34)이 1번부터 시작하므로 재전송이 발생하지 않는다. 초기화 시점이 서로 틀린 경우에는 재전송이 발생할 수 있겠지만, 정상적인 상황을 가정하고 로그인 절차를 살펴보면 다음과 같다.

 

Case #1

<로그인 요청>

8=FIX.4.2^A9=70^A35=A^A49=ACOMPID^A56=BCOMPID^A128=ABC^A34=1^A52=20101109-22:00:09^A108=30^A98=0^A10=007^A

 

<로그인 응답>

8=FIX.4.2^A9=70^A35=A^A34=1^A49=ACOMPID^A56=BCOMPID^A52=20101109-22:00:09^A108=30^A98=0^A10=222^A

 

기관에 따라 로그인시에 Tag.128(DeliverToCompID) 등 특정 태그에 지정된 값을 요청하는 경우가 있다. 해당 기관에서  제공해준 값을 설정하면 된다. 보통 Heartbeat 주기는 30초(108=30) 또는 60초로 로그인 요청을 했다.

 

Case #2

<로그인 요청 - Sequence 초기화>
[06:57:07][out|8=FIX.4.4^A9=85^A35=A^A49=ACOMPID^A56=BCOMPID^A34=1^A52=20111218-21:57:06.999^A98=0^A108=60^A141=Y^A789=1^A10=074^A]

 

<로그인 응답 - Sequence 초기화>
[06:57:08][in|8=FIX.4.4^A9=75^A35=A^A49=BCOMPID^A56=ACOMPID^A34=1^A52=20111218-21:57:08^A108=60^A98=0^A141=Y^A10=091^A]

 

로그인시에 141=Y을 이용해서 강제로 Sequence 초기화 요청을 하였다. CME 거래소 처럼 기관에 따라 141=Y을 허용하지 않는 경우도 있다.

태그/값 태그명 설명
8=FIX.4.4 BeginString FIX 버전 4.4 사용을 의미
9=85 BodyLength FIX 전문 길이를 의미(Tag8,9,10 필드를 제외한 길이)
35=A MsgType 로그온
49=ACOMPID SenderCompID 송신 CompID
56=BCOMPID TargetCompID 수신 CompID
34=1 MsgSeqNum 시퀀스 번호(최초 로그인시에는 1로 시작함)
52=20111218-21:57:06.999 SendingTime 전송시간(FIX 엔진에서 자동으로 시간 지정, UTC시간)
98=0 EncryptedMethod 전문을 암호화하지 않겠다는 의미
108=60 HeartBtInt Heartbeat 주기를 지정(단위: 초)
141=Y ResetSeqNumFlag 강제로 시퀀스를 초기화 할지 지정
789=1 NextExpectedMsgSeqNum 기대하는 FIX 시퀀스 번호를 보냄
10=074 CheckSum FIX 메시지 정합성을 위한 체크섬

 

2. 재전송(Recovery)이 발생하는 경우 로그인

클라이언트 (예: ACOMPID) 서버 (예: BCOMPID)
로그인 요청(35=A)  
  로그인 응답(35=A)
재전송 요청(35=2) 재전송 응답(35=4)
재전송 응답(35=4) 재전송 요청(35=2)

재전송 요청은 순차적으로 발생하는 것은 아니고 양쪽에서 동시에 요청할 수도 있다. 하지만 이해를 돕기 위해서 한쪽에서 요청하는 시나리오 예를 들어보자. 아래는 네트웍 단절 등 비정상 상황이 발생하여 응답이 없는 경우 테스트 요청을 보내고, 그래도 응답이 없어서 로그인 시도를 다시 하고 있는 예제이다.

 

[19:22:38][in|8=FIX.4.4^A9=60^A35=0^A49=BCOMPID^A56=ACOMPID^A34=5102^A52=20111222-10:22:38^A10=134^A|X|X]

 

정상적으로 Heartbeat이 수신되었다. 마지막으로 MsgSeqNum(Tag.34)가 5102임을 알 수 있다.


[19:22:56][out|8=FIX.4.4^A9=64^A35=0^A49=ACOMPID^A56=BCOMPID^A34=5069^A52=20111222-10:22:56.940^A10=097^A]

 

정상적으로 Heartbeat를 송신하였다.


[19:23:51][out|8=FIX.4.4^A9=90^A35=1^A49=ACOMPID^A56=BCOMPID^A34=5070^A52=20111222-10:23:51.285^A112=20111222-10:23:51.285^A10=078^A]

 

Heartbeat이 발생하지 않아 TestRequst(35=1)을 보내서 상태를 확인한다.


[19:24:51][out|8=FIX.4.4^A9=64^A35=0^A49=ACOMPID^A56=BCOMPID^A34=5071^A52=20111222-10:24:51.454^A10=087^A]

 

Heartbeat 송신 주기가 되어 발생된 Heartbeat이다.

 

<1. 로그인 요청 - 장애에 의한 재로그인> 


[19:25:03][out|8=FIX.4.4^A9=85^A35=A^A49=ACOMPID^A56=BCOMPID^A34=5072^A52=20111222-10:25:03.581^A98=0^A108=60^A789=5103^A10=054^A]

 

TestRequest 요청에 대한 응답이 없어서 세션이 끊긴 것으로 판단한다. 세션이 끊겼으므로 로그인 요청(35=A)을 한다. NextExpectedMsgSeqNum(Tag.789)가 5103이라는 것은 위에서 마지막으로 수신받은 메시지의 MsgSeqNum이 5102이기 때문이다. 그래서 수신받을 MsgSeqNum을 789=5103로 지정한 것이다.

 

<2. 로그인 응답 - 장애에 의한 재로그인> 


[19:25:13][in|8=FIX.4.4^A9=72^A35=A^A49=BCOMPID^A56=ACOMPID^A34=5105^A52=20111222-10:25:13^A108=60^A98=0^A10=181^A|X|X]

 

MsgSeqNum(Tag.32) 5103이 수신되어야 하는데 상대기관에서 MsgSeqNum(Tag.34)를 5105를 보냈다. 5103~5105까지 미수신 메시지가 존재한다는 것을 알 수 있다.

 

<3. 재전송 요청> 


[19:25:13][out|8=FIX.4.4^A9=76^A35=2^A49=ACOMPID^A56=BCOMPID^A34=5073^A52=20111222-10:25:13.552^A7=5103^A16=0^A10=111^A]

 

미수신 메시지를 받기 위해서 BeginSeqNo를 7=5103으로 하고 EndSeqNo를 16=0 으로 요청한다. 16=0은 현재의 Sequence 번호를 EndSeqNo로 사용하라는 의미이다. 16=5105로 보내도 되지만 통상 16=0으로 보내게 된다.

 

<4. 재전송 응답 - Gap Fill mode>


[19:25:13][in|8=FIX.4.4^A9=79^A35=4^A49=BCOMPID^A56=ACOMPID^A34=5103^A52=20111222-10:25:13^A43=Y^A123=Y^A36=5107^A10=048^A|X|O]

 

5103부터 재전송 요청이 들어온 상태이므로 상대 기관에서는 5103부터 전송을 시작한다. 하지만 상대기관 입장에서는 이 메시지를 이미 보낸 것으로 판단하면 PossDupFlag(Tag.43)을 Y로 설정해서 보내게 된다. 이는 중복이 될 가능성이 있다는 것을 미리 알려주기 위함이다. 리커버리를 위해 송신하는 메시지로 GapFillFlag(Tag.123)을 Y로 설정해서 보내게 된다. NewSeqNo(Tag.36)을 5107로 보냈다는 것은 5104부터 5106까지는 세션메시지라 스킵하고 5107부터 보내겠다는 의미이다.


[19:26:13][out|8=FIX.4.4^A9=64^A35=0^A49=ACOMPID^A56=BCOMPID^A34=5074^A52=20111222-10:26:13.794^A10=097^A]

 

세션이 정상화 되었고 Heartbeat를 송신한다.


[19:26:13][in|8=FIX.4.4^A9=60^A35=0^A49=BCOMPID^A56=ACOMPID^A34=5107^A52=20111222-10:26:13^A10=136^A|X|X]

 

SequenceReset을 통해 최종 데이터는 5107부터 수신되는 것을 확인할 수 있다.