2019. 12. 10. 13:48ㆍFIX
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부터 수신되는 것을 확인할 수 있다.
'FIX' 카테고리의 다른 글
FIX 주문/접수/체결 시나리오 (0) | 2019.12.10 |
---|---|
FIX 세션 메시지 - 테스트 및 거부 (0) | 2019.12.10 |
FIX 글로벌 네트웍 구성 (0) | 2019.12.09 |
FIX 세션 구성을 위한 협의 및 세션 메시지 (0) | 2019.12.09 |
FIX 프로토콜이란 무엇을까 (0) | 2019.12.09 |