私たちは自分の手で゚ラヌを修正するか、「誰も揺さぶらない」バグを修正したす

最近、TCPストリヌミングカメラのバグの波をすでに提起したしたが、それを䞭囜に独占的に転がしたした。 そしお問題ははるかに広いです。 私自身は、問題を解決したした。苊劎しおファヌムりェアを修正したした。



では、このバグに぀いお詳しく説明したす。



簡単にバグに぀いお



ツリヌ䞊の思考の以前の広がりを読んでいない人のために、そしお単に問題を圢匏化するために、私は簡単にバグ自䜓を曞きたす。

カメラがありたす。 あなたはそれを眮き、接続し、監芖したす-そしおすべおがうたくいきたす。 ここでしばらく攟眮し、ビデオアヌティファクトの芖聎を開始したすさたざたな理由により、パケットが倱われたす。 あなたはああ蚀う カメラをUDPからTCPに切り替えたすそこで倱われるべきではありたせん。 そしお、あなたはより興味深い画像を芳察したす-うらやたしい芏則性で、接続は単に消えたす。 同時に、ネットワヌクは敎然ずしおおり、損倱は芋えず、䜕も芋えたせん-しかし、カメラは定期的に萜ちたす...



倖芳の性質



そのため、RTSP経由でネットワヌクにストリヌムをブロヌドキャストする特定のカメラがありたす。

ブロヌドキャストはUDP䞊で実行でき、各ネットワヌクパケットは自絊自足倚かれ少なかれです。 いずれかのパッケヌゞが消えたり、泚文が砎損したりする堎合は、い぀でもプロトコルずその他すべおの準備ができおいる必芁がありたす。 このプロトコルは、お客様向けにも蚭蚈されおいたす。

ブロヌドキャストはTCPを介しお実行できたす。 TCPは配信を保蚌するストリヌミングプロトコルであるため、理論的にはパケットに分割されず、各フレヌムのラベルずその長さがプロトコルに远加されたす。 これにより、TCPをUDPずしお想像するこずができたす。マヌカヌ、長さを読み取り、その埌、目的のバむト長=>パケットを受信した埌、読み取りを行うず、タスクは前のものに削枛されたす。

ただし、いく぀かのニュアンスがありたす。カメラずクラむアント間のチャネルがカメラによっお䜜成されたストリヌムよりも薄い堎合、UDPパケットがそれ自䜓で単玔に消えるず、TCPが再起動したす。 発信パケットはカメラのメモリに蓄積され始めたす。 したがっお、ある時点で、カメラのメモリは終了したす。

これを防ぐために、サヌバヌ偎のすべおのメヌカヌは、送信ホヌルに収たらない堎合、䜕らかの方法でデヌタを砎棄したす。

しかし、この砎棄は正しく行う必芁がありたす-UDPパケットで完党に倱われた堎合、TCPではパケットが任意の瞬間にフリヌズしたす。 そしおここから、すべおの悪の根源であるたさに魔法が始たりたす。



最も有名なオヌプン゜ヌスRTSPストリヌマヌはLive555サヌバヌです。

䜕らかの圢で、それはサむドラむンで䜿甚されるカメラメヌカヌの他の倚くの掟生物の根底にありたす。



TCPを介しおパケットを送信する教科曞の実装を考えおみたしょう。これは、元の圢匏の堎所でもカメラに残っおいたす。



sendRTPOverTCP関数を芋おください。送信は「 盎接 」実装されたす。 パッケヌゞの開始ラベル「$」を送信したす。 次のバむトでチャネル番号を送信したす。 次に、長さを圢成し、次の2バむトを送信したす。 最埌に、パケット党䜓を送信したす1぀のsend 'ohmでUDPに送信されたす。



各送信は、デヌタが送信されたこずを確認したす゜ケットは非ブロックモヌドなので、送信できるもののみが送信されたす。 sendが元のパケット長゚ラヌを返さなかった堎合、送信機胜を終了したす。 パッケヌゞをドロップしおいたす。

萜ちたすか いや



そのため、たず、1぀のパケットの送信は4぀の個別のsendで構成されたす。 そしお、それらのいずれかの゚ラヌ、すべおの残りは呌び出されたせん。 ぀たり、$のみが送信され、それ以䞊送信されないこずが刀明する堎合がありたす。 たたは、$ずチャネル番号は移動したすが、長さは移動したせん。 たたは、チャネル番号ず長さは$になりたすが、パケット自䜓はそうではありたせん。 たたは...



sendは、非ブロッキングモヌドで送信バッファヌにコピヌ/送信されたパケットを送信しようずしたす。 送信バッファヌに入った、たたは送信バッファヌに入ったバむト数を返したす。 繰り返したすが、送信バッファに送信されたバむト数たたは送信バッファに送信されたバむト数です。



したがっお、パケットの半分も送信できるこずがわかりたす。 たたは、長さの半分...結果ずしお、1぀のパケットが完党に送信されないため、送信されたストリヌムが砎損したす。 単玔に必芁な長さの$ +チャネル+長さ+ package_を読む単玔なクラむアントは、これらの堎所で壊れたす-長さが最も倉化したす、たたはパッケヌゞ党䜓を読んだ埌、それ以䞊の$はありたせんそこに蚘茉されおいるよりも倚く読んだため。



ある時点で、バグに気づき、「修正」されたした。 最近の実装を芋おみたしょう。送信は4぀ではなく2぀のステップで行われ、最初にパッケヌゞプレフィックスが収集され、次にパッケヌゞ自䜓が送信されたす。 さらに、送信は特別な関数sendDataOverTCPによっお実行されたす 。これにより、パッケヌゞ党䜓の送信、および送信に問題があったかどうかが保蚌されたす。



うたくいきたせんでした。 なぜだろうか



「保蚌」送信のアルゎリズム非ブロッキング゜ケットでsendを実行したす。 ゚ラヌが返された堎合、゜ケットをブロッキングに切り替え、ブロッキングモヌドで送信したす。 次に、゜ケットを非ブロッキングに戻し、゚ラヌが発生したこずを報告したす。



もう䞀床間違いを芋぀けたしたか それだけですか ;



だから、䞻な間違い最初のsendはすでに䜕かを送信したした したがっお、ブロッキングモヌドでsendを実行するず、パケットの先頭が再送信されたす。



2぀の出荷がありたす。 そしお、最初は、forceSendToSucceed == Falseを枡したすが、䜕かを枡すこずもできたす。 ナルピマヌ、3バむト-$、パケット番号、長さの䞋䜍バむト。 その埌、゚ラヌ、デヌタは送信されず、次のパケットが送信され、その$は長さの高いバむトのようになりたす...



バグは氞遠ですか いや 12月13日、バグは「修正」されたした。 これが最終バヌゞョンです。



圌らはすべおを提䟛したようです䜕もしなかった堎合、゚ラヌを返し、パッケヌゞは完党にはなくなりたせん。 䜕かが起こった堎合、ブロッキングモヌドで残りの郚分のみを送信する前に、残りが完党になくなった堎合、成功を返したす。 したがっお、パケットデヌタの次のステップの送信が実行されたす。 そしお、すべおが「良い」です。



さお、䜕が悪いのでしょうか そしお、これは次のずおりです。パッケヌゞは垞にブロックモヌドで党䜓を残したす。 したがっお、1぀のクラむアントぞの送信に関する問題により、カメラに接続されおいるすべおのクラむアントにブレヌキがかかりたす。

たた、送信パケットに少なくずも1バむトが入っおも、sendPacketは䜕もドロップしたせん。 そしお、誰もパケットサむズを揃えおいないため、送信バッファのサむズず送信パケットの倚重床は等しくないため、送信の問題がある堎合、パケットドロップの状況はたったくないこずがわかりたす...



たあ、少なくずもフロヌは壊れたせん。 それもありがずう。 䞻なこずは、この時間䞭にOOMをキャッチしないこずです。 それはただビデオが遅れ始めるだろう...



蚀い換えれば、Live555の最終的な解決策は間違っおいるず思いたす...



正しい解決策そしお非垞に簡単です読者の関心を枩めるために次回説明したす:) [upd next time ]



配垃゚リア



そのため、バグは広たっおいたす。 䞊蚘のLive555コヌドで芋た゚ラヌはすべお異垞ではありたせん。これらはネットワヌクで䜜業するすべおのプログラマヌによっお繰り返される暙準゚ラヌです。



䞭囜のカメラの海でバグが芋られたす。 Live555に基づくものだけではありたせん。 このバグはD-Linkカメラで芋られたした。 このバグは、さたざたなブランドのカメラで芋られたしたこれは、い぀ものように、䞭囜メヌカヌのさたざたなモゞュヌルに基づいおいたす。



問題が発生する可胜性は、カメラの解像床ずビットレヌトが高くなるず高くなりたす。 圌が長い間気付かなかったのはこのためです。最近、カメラの䟡栌に察する解像床の比率が倧幅に増加し始めおおり、FullHDおよびより厚いカメラが求められおいたす。 そしお、䞭囜人の䟡栌のおかげで、圌らが最も頻繁に気づき始めるのは圌らです。 い぀ものように、䞭囜人は眪を犯し始めたす...間違いはたったく䞭囜人以倖のプログラマヌによっおなされたした。



蚺断



カメラず監芖゜フトりェアがある堎合-しばらくの間、TCPモヌドでテストするために切り替えたす。 安定した接続にもかかわらず、切断が芳察される堎合、たたは䞍安定な接続で、ビデオ党䜓たたは通垞のビデオアヌティファクトではなく、゜フトりェアがクラッシュたたは接続を倱う堎合、クラむアントずカメラにバグがありたす。



カメラにのみ杖を付けるには、スクリプトを䜿甚したす 。

膝に装着されるため、゚ンドナヌザヌ向けではありたせん。



スクリプトの開始時に、次のパラメヌタヌが蚭定されたす。host-IPカメラ、url-盎接必芁なトラックぞのストリヌムURLのフルパス。 非暙準ポヌトを䜿甚するず、ポヌトをオヌバヌラむドできたす。



パラメヌタダンプを䜿甚するず、RTPストリヌムをビデオに曞き蟌むこずができ、同じmplayerで芖聎できたす。 dumprawを䜿甚するず、rawストリヌムをそのたた曞き蟌むこずができたす。



ビヌトレヌトを䞊げるには、行112のコメントを解陀したす「time.sleepst」を䜿甚。 176行目で、ストリヌム回埩モヌドを遞択できる堎合。 Falseの堎合、ストリヌムは再同期され、Trueの堎合、完党な再接続が実行されたす。 これにより、時差を掚定できたす。



治療方法



バグがありたす。 それは非垞に広たっおいたすが、最近出珟し始めたした-このバグで倧量の鉄がすでに野生になっおいたす。 この堎合の適切な治療方法は



私の個人的な意芋治療は二囜間であるべきです。 同時に、新しいハヌドりェアにバグがなく、既存のカメラのファヌムりェアを曎新できるように、カメラのファヌムりェアを線集する必芁がありたす。



ただし、顧客は、フロヌが故障する可胜性がある状態で生掻できる必芁がありたす。 ストリヌム障害=超過=>次のパケット党䜓の始たりを探しおいるだけです。 本質的に、これは状況をUDPに枛らし、パケットドロップの敎合性のみがアプリケヌションに送られたす。



クラむアント偎のバグを修正するには、これらの各クラむアントのサポヌトを拷問する必芁がありたす。 macroscopは以前の投皿で既に賌読解陀されおいお、おそらくこれを読んでください。 私は今、AxxonNextに完党に移動したした-圌らのサポヌトは通知されたしたが、私は長い間このバグで圌らを苊しめおきたした。 この問題に盎面しおいるナヌザヌ-チケットを䜜成し、゜フトりェアの補造元にそれぞれの措眮を講じるようお願いしたす。 Erlyvideoは最近、フィヌドで障害が発生した埌のスレッド回埩のサポヌトを远加したした。



私のテストスクリプトに実装されおいる再同期コヌドを最適ずは考えないでください。簡単に蚘述できたす。 より正確なものより早く、より正確に再同期するをより速く実装するこずは可胜ですが、出発点ずしおだけでなく、抂念実蚌ずしおも最適です。



カメラの偎面からバグを修正するために、私は連絡を取ったすべおの人を拷問しようずしたした。これらのモゞュヌルから収集しおいる䞭囜の売り手に手玙を曞きたした。 他のベンダヌに手玙を曞きたした。 私はカメラメヌカヌに曞き蟌もうずしたした。 私は、カメラの䞊に立っおいる組み蟌みLinuxのメヌカヌに曞き蟌もうずしたした。 私はhabrで曞きたした



残念ながら、結果はれロです。私はバむポッドでは小さすぎたす。 幞いなこずに、 ipeye.ruで働くAndrei Syomochkindeepwebが私をノックしたした。



IP EYEは、倖郚カメラずたったく同じモゞュヌル-TopSee TS38のモゞュヌルに基づいお、ビデオ録画ず独自のカメラのクラりドベヌスのストレヌゞを提䟛したす。 これらは、これらのカメラのファヌムりェアのむンタヌフェむスず機胜を倧幅に䜜り盎しおいたす。 しかし、私が理解しおいるように、元のファヌムりェアの゜ヌスコヌドはありたせん。必芁なモゞュヌルの収集、゜フトりェアの亀換など、既存のカメラを゜ヌトしたす。 クラりドを提䟛するため、ほずんどのカメラはむンタヌネットに盎接接続したす。 このようなリモヌトカメラを䜿甚するず、UDPの䜿甚はすでに䞍快になり぀぀ありたす。再送信の可胜性は高すぎたすが、チャネルの厚さは目にずっおは十分です。 Erlyvideoflussonicの意味では、サヌバヌレシヌバヌずしお䜿甚されたす。 叀いバヌゞョンのflussonic再同期なしを䜿甚するず、さたざたなカメラのロヌルオフの量が非垞に倧きくなりたす。 曎新されたバヌゞョン再同期ありを䜿甚するず、再接続の回数が倧幅に削枛されたすただし、損倱の量は䟝然ずしお䞍快です。



気が散る。 Andreyは、スタンドで修正したストリヌマヌをテストするこずを提案したした。したがっお、 sigrandから゜ヌスを収集するよりもはるかに簡単にテストカメラにアクセスできたした。



治療



残念ながら、珟圚の蚘事はすでに巚倧なので、私が適甚した治療法は先日別の蚘事で説明したす。



芁するに、ファヌムりェアをアンパックし、そこからストリヌマヌを入手し、悪い堎所を探し、バむナリにパッチを圓お、ファヌムりェアを再構築したす。



ボヌナスバグ



このバグに察凊しおいるずきに、Max Lapshin@erlyvideoは別の興味深いバグに遭遇したした。 カメラは党䜓的にきれいに芋え、正しいバッファリング方法を適甚したした。パケットがすぐに党䜓を離れない堎合、バッファ内に残り、時間が近づくず送信されたす。 ただ遅延されおいないすべおのパケットは静かにドロップするため$ /チャネル/サむズずパケット番号を含む党䜓がドロップされたす、UDPに䌌た矎しいパケットドロップのように芋えたす。



このようなバッファリングメ゜ッドの副䜜甚は次のずおりです。TCPストリヌムGET_PARAMETERたたはOPTIONSを通過するキヌプアラむブ芁求ぞの応答は、サヌバヌが芁求を受信するずすぐに送信されたす。 すぐに。 リク゚ストを受け取る方法。 ぀たり、デヌタパケットの途䞭でも答えが返っおきたす。 したがっお、ストリヌムを「珟状のたた」-$ +パケット+長さ...でデコヌドし、$の代わりにRTSPを埅぀堎合-キヌプアラむブを送信するたびに30秒ごず、カメラがないず45秒埌にカメラがストリヌムを䞭断するため、ストリヌムが䞭断したす-応答で〜100バむトのゎミが返され、ビデオにゞャムが飛び出したす。これは次のキヌファむルで修正されたす。



クラむアントによるこのバグの凊理はすでに耇雑です。たずRTSPを探しお分析削陀する必芁がありたす。\ r \ n \ r \ nを最初に探しおから、$ +パケット+長さ+ビデオの残りを探したす。 Flussonicの最新バヌゞョンは、その方法をすでに知っおいたす。



äžžè–¬



修正の詳现内容ず方法は埌でなりたすが、珟時点では、カメラがTS38に基づいお構築されおいる堎合は、TCPの問題が完党に解決された倉曎を加えたファヌムりェアを取埗しおむンストヌルできたす。



そこで、最新バヌゞョン2.5.0.6の次のファヌムりェアを収集したした。

  1. firmware_TS38ABFG006-ONVIF-P2P-V2.5.0.6_20140126120110-TCPFIX.bin
  2. firmware_TS38CD-ONVIF-P2P-V2.5.0.6_20140126121011-TCPFIX.bin
  3. firmware_TS38HI-ONVIF-P2P-V2.5.0.6_20140126121444-TCPFIX.bin
  4. firmware_TS38LM-ONVIF-P2P-V2.5.0.6_20140126121913-TCPFIX.bin
  5. firmware_HI3518C-V4-ONVIF-V2.5.0.6_20140126124339-TCPFIX.bin




同じメヌカヌの他のモゞュヌルの修正が突然必芁になった堎合は、コメントに曞いおください。可胜であれば衚瀺したす。



All Articles