FIX協定結構及工作流程(轉)
- session 的通信各方維護一個 incomming 和 一個 outgoing 序列号。 Incomming 序列号用來檢測序列号是否亂序或跨越。
- 心跳在 initiator 發送 logon 消息時候設定在心跳域上, acceptor 和 initiator 的心跳間隔時間一緻。
- Fix 消息要按序列号從小到大順序處理,若收發過程中出現丢包則有兩種政策:重傳序列号出錯的包及以後所有收到得包;另一種是隻重傳出錯的包;
- Fix 協定沒有定義應答消息,使用序列号不連貫來檢測消息丢失,用 checksum ,簽名或消息體長度來檢測消息錯誤;
- Logon 階段,用戶端選擇了了一個加密密鑰,但伺服器選擇了不同的密鑰放在傳回的 logon 消息中,這時候用戶端還得發一個 logon 消息應答伺服器端,兩個作用: 1). 讓伺服器知道密鑰變更獲得了用戶端的響應; 2). 下面的消息開始要加密了。
- 在 logon 階段完成後必須馬上檢查序列号,同步收發的消息,比如一端發送了消息但另一端沒收到,這時候需要重傳。可以通過對比 logon 消息中的序列号和通信一方的期望收到的消息序列号來檢測消息漏收發。
- 序列号最好每隔 24 小時重置一次,重置前要商量好哪一方來首先發送重置請求及發重置請求的時間。重置之前要一方首先發送 testrequest 消息,等待收 heartbeat 消息來确認連接配接是否正常,然後才發送 logon 消息,并把消息中的序列号重置域設為 Y ,并且序列号置為 1 ,接收方回複同樣消息,重置成功;
- Logout 之前需要發送 testrequest 消息強制心跳,檢測消息序列号是否連續, logout 消息發送出去之後,需要等待一段時間接收 logout 回應消息,這段時間讓雙方來處理序列号不一緻的問題,一旦序列号同步之後 logout 接收者馬上發送回應的 Logout 消息, Logout 發起方收到回應後負責來關閉會話。
- Fix4.4 中在 logon 消息中加入了 NextExceptedSeqNumb 域,用來表示本方期望對方發過來的下一個序列号,這樣 logon 階段完成後直接就是漏發消息的重發,不需要再發送 testrequest, heartbeat 和 ResendRequest消息了。
- possResend 和 possDupFlag 差別就是前者使用了新序列号發送老的消息,可以通過檢查消息中的域來确定是否已經收到過改消息,比如 order 的 ID 等;後者是用老的序列号重發消息,可以直接檢查序列号來确定是否已經收到過該消息,若已收到過了就丢棄該消息。
- logon 消息中有兩個字段 RAW Data Length 和 RAW data 用來存放認證需要的資料。
100) ? false:true" x-data="topBtn" @click="scrolltoTop" x-cloak>