第四章 多工串流時間控制與數據分析
4.3 單行程串流伺服器整個系統流程分析
圖 4.4 單行程串流伺服器整個系統流程圖
單行程串流伺服器的流程圖如上圖 4.4 所示。一開始便是建立 socket,接著
會使用 select 函式來監看是否有連線的要求,當有連線要求的時候,伺服器還要
去檢查這連線要求是舊連線或是新的連線,舊連線代表這個連線已經被伺服器接 受(accept)過的連線,而新連線代表此連線是第一次連到伺服器,即尚未被伺服 器接受過(accept)的連線。
如果是新連線的話,伺服器便會去接受(accept)此連線,並給這個新連線一 個新的 socket descriptor;如果是舊連線的話,伺服器便會去解析(parse)此連線的 RTSP 信令,也就是伺服器會進入 RTSP state machine(狀態機)之中,例如在收到 RTSP『PLAY』的信令之後,伺服器便會進入『PLAY state』中,也就是開始去 進行封包的發送。
當伺服器接受(accept)了一個新的連線或走完 RTSP state machine 後,伺服器 便會 block 在 select 函式的所在並且等待新的連線要求。此外,select 函式並不是 只有在連線要求的時候才會回傳(return),當時間等到 timeout(select 函式第 5 個 參數所標示的數值)select 函式亦會回傳。伺服器接下來該做的工作便是去做 parse 的動作。
伺服器便會對每一張 frame 計算其 PTS 和 fNextSendTime,並且依照 fNextSendTime 來傳送該 frame。當某個使用者的 frame 所切割出 payload 的 fNextSendTime 小於系統時間(Wall clock)時,意即該 payload 可以開始經過封裝
傳送的處理了,而在此需特別強調的是同一個 frame 所切割出來的 payload 都會 具有同樣的 fNextSendTime。而本論文重點便是著墨在時間控制機制的部份。
但是 frame 在傳送之前必需經過切割封裝的處理,也就是基於 MTU(Max Transfer Unit)把 frame 切割成數個小 payload,並且把這些 payload 放在系統的 output buffer(輸出封包緩衝區)中去待命傳送。同時伺服器會去計算 timestamp,
並且把完成的 RTP header 配置在 payload 的前端,如此便完成了一個 RTP packet 的產出。接下來藉由呼叫 BSD socket API 來替 RTP packet 加上 UDP 以及 IP
header(由 OS kernel 負責),完成整個封裝的動作。此時,一個可在網路上傳送的 標準結構化封包(IP packet)便產生了。
當只有一個使用者時,伺服器在傳送完一個 IP 封包後,伺服器便會去檢查
output buffer 是否還有未處理的 payload 要出去,如果尚有 payload,伺服器便會 將剩下來的 payload 傳送出去。
當有兩個使用者以上時,伺服器在傳送完一個 IP 封包後,伺服器便會去檢 查 output buffer 是否還有其他使用者未處理的 payload 要傳送出去,如果尚有 payload,伺服器便去檢查該 payload 的 fNextSendTime。
當 fNextSendTime 小於系統時間(Wall clock),伺服器便進行 payload 的封裝 程序,同樣在封裝完成後便把該 IP 封包經由網路傳送至使用者端。但是 payload 的 fNextSendTime 未小於系統時間(Wall clock),則伺服器便回到 select 函式;如 果伺服器送完某個封包後,發現 output buffer 內已經沒有其它的封包存在了,伺 服器亦會回到 select 函式,重新開始一個新的流程(迴圈),這便是整個單行程串 流伺服器的處理程序。
4.4 . 單行程多使用者的時間控制流程
圖 4.5 單行程多使用者的時間控制流程圖
在單行程串流伺服器中,最重要的部分為傳送封包時的時間控制。封包的時 間控制包含了許多封包時間的轉換機制, 如 parsing order 轉成 display order。
如圖 4.5 紅框內所示,而時間控制機制開始於伺服器對每一個使用者解析
(parse)完一張 frame 之後,當伺服器進入時間控制的區塊(紅框 timing control 部 份)時,伺服器會先計算各張 frame 的 PTS,在計算 PTS 時就需要一個時間轉換 機制,而時間轉換的機制會在後面的 4.5.1 章節中說明。
計算完各張 frame 的 PTS 之後,伺服器又必須把 frame 的 PTS 轉成 DTS,
這裡需要另一個時間轉換機制,同樣請參考 4.5.1 章節。接下來,伺服器便準備 要把 payload 送去做 RTP 的包裝,但是 payload 何時該去做包裝,就必須要靠另 一個時間參數 (fNextSendTime)來做判定。至於 fNextSendTime 是如何得到的,
以及如何用此時間參數來掌握封包傳送的時間,我們會在 4.6.1 章節中說明。