ãã¡ãããè³é調éã¯æå°éã§ãããèšç»ã¯å£®å€§ã§ããããããã¹ãŠãç§èå°ããåéãããŸãã
詳现ã¯å°ãåŸã§èª¬æããŸãããããã«ç§ãå€ãã®ããšãçµéšãããèå³æ·±ããã°ã®1ã€ããããŸãã
ã ãããããã¯ãã¹ãŠå°ããªãã®ã§å§ãŸããŸãã-ã·ã³ãã«ãªããŒã ã«ã¡ã©ãæãã²ã©ããã®ã¯ã IPãšããŒã ã®ã¿ã䜿çšãã ããšããååã«åºã¥ããŠæ®åœ±ãããŸããã ãã®åŸããœãããŠã§ã¢ã®æ€çŽ¢ããã»ã¹ãéå§ãããŸããïŒå¥ã®æçš¿ã®ãããã¯ã¯ãåã³åŸã§ãªããŸãïŒ...æåŸã«ã1ã€ã®ãã£ãã«ã®Macroscopã§ä¿®æ£ãããŸããã æ°ã¶æã§ããããé£ã¹ç©ã飲ã¿ç©ãé Œãããšã¯ãããŸããã§ããã
ãããŠä»ã§ã¯ãã¹ãŠãæ©èœããŠããããã«èŠããŸãããã©ããããããå®æçã«ã¯ã©ãã·ã¥ããŸãã ããŒã»ã³ãããããã¯ãŒã¯ããœãããŠã§ã¢ãç«æã®å€©æ°ãªã©ããã¹ãŠã«çœªãç¯ããŸãã...ãã°ã«ãããµããŒãã¯ãã«ã¡ã©ãå®æçã«èœã¡ãããšã瀺ããŠããŸãã
æŽæ°
ã¯ããããå€ãã®ã«ã¡ã©ãè³Œå ¥ããŸããããå質ãšäŸ¡æ Œã¯ãã£ãšé«ããªããŸããã ç°ãªãé±ã®3ã€ã®çŸããæ¥ã«æ inessãå æããåŸããã¹ãŠã1éã«ããŠã³ããããã³ã³ãã¥ãŒã¿ãŒã«æã¡èŸŒãŸããæ¥ç¶ãããŸããã ãããŠããœãããŠã§ã¢åæã®2åç®ã®å埩ãè¡ããããããã«ã¡ã©ããã倧ããããã人éçã«ãªããã€ã³ã¿ãŒãã§ãŒã¹ããã䟿å©ã«ãªããŸãã... 2åç®ã®åæã®åŸãAxxonNextãç«ã£ãŠããŸãã ã¯ããé ãã®ã¿ãæ°ããã¬ãã«ã«éããŸãããTCPãæå¹ã«ãããšãã«ã¡ã©ã¯5ã10åããšã«ã»ãŒåæããŠäœäžããŸãã ãããŠãUDPãä¿æããŠãããšãäœãããããªãã®ã§ã¢ãŒãã£ãã¡ã¯ããäžæããŸãã
ç§ã¯ãã±ãã§ãã®äž»é¡ã«ã€ããŠäžå¹³ãèšãã maxlapshinãåããããã¯ãã¡ãŒã ãŠã§ã¢ãç¬èªã®åªåã«ãã£ãŠäœæãããäžåœã®ã«ã¡ã©ã®å®å®ãããã°ã§ãããšèšããŸãïŒã¯ã©ã€ã¢ã³ãã«ãããã®æéããªããã°ããŽãã¯ã¹ããªãŒã ã«å ¥ããŸãã ã¢ãªã«ã¢ãŒã§è²©å£²ãããŠãããããåé¡ã培åºçã«è§£æ±ºããããšããããšã«ããŸããã ç§ã¯ããŸããŸãªèšèã§äœåºŠããã°ã説æããããšããŸããããç§ãã¡ã¯ã©ã¡ããè±èªãæãŸãããã®ãå€ãããããã³ãŒãã衚瀺ãããã ãã§ããããšã«æ°ä»ããŸããã
çºæã®ç¬¬äžæ®µéïŒçç±ãèŠã€ãã
ãã®ããããŸãtcpdumpã䜿çšããŠãåŽã®ç¶æ³ãåŸ ã¡ãŸãã å°ãåŸ ã£ãŠã5åã§3æãé£ããŸããã äœãèµ·ãã£ãã®ããç解ããã«ã¯ïŒ 150äžãã±ããã®ã¹ããªãŒã ...ããããã1å°ã®ã«ã¡ã©ã ããæ®ããŠãã£ã«ã¿ãªã³ã°ããŸãã 次ã«ãCtrl + F => tcp.flags.syn == 1 =>åæ¥ç¶ã®éå§ç¹ãèŠã€ããããããã¹ã¯ããŒã«ããŠãäœãèµ·ãã£ãããç解ããŸã...
ã³ã³ãã¥ãŒã¿ãŒã®äžéšã§æ¥ç¶ãéããããããšãããããŸã...ããããåã«ãWin = 11460ãWin = 10200ãWin = 8940ãæ··ä¹±ããŠããã ãã§ããã€ãŸããã¯ã©ã€ã¢ã³ãã«ã¯å®éã«æéããããŸããã åæ¢åæ¢åæ¢ã ã©ãããŠéã«åããªãã®ïŒ AMD Phenom II X6 1100TïŒ ããããå€ã§ãã IOïŒ ãããã£ãŠãå¥ã®ãã£ã¹ã¯ã«èšé²ããæ£ã«äŒãŸãªãã£ãã ãããŠãããšãã°èŠèŽã«äŸåããã§ããã-ããããååšããŸãã...äžè¬çã«ãç§ãã¡ã¯å°ãé«ãã¹ã¯ããŒã«ããŸãïŒ
ã§ããããæåéãäžç¬åã«ã圌ãã¯äžè¬çã«ZeroWindowã«å»ããŸããã æ£ç¢ºã«ã¯æéããããŸããã ãããããªãåŽã§ããïŒïŒ äžã«ã¹ã¯ããŒã«ããŠãå¥ã®åŽãèŠãŠ......
ãããã£ãŠãZeroWindowãæ倧2.5ç§é芳å¯ããŸã-ã²ãŒãã«ãŸã£ããç»ããŸããã äžã«ã¹ã¯ããŒã«ãããšãç解ãå§ããŠããããã§ãïŒ
èŠãŠã¿ããšãTCPã¹ã¿ãã¯ã®åäœãéåžžã«æªãïŒã«ã¡ã©ïŒãããã...ïŒããã®åŸRTPã¹ããªãŒã ãè¿·ããŸãã-ããæç¹ã§ãDynamicRTP-Type-96ã§ã¯ãªããRTSP Continuationãé²ã¿ãŸããã
çµè«ãšããŠãã·ãã¥ã¬ãŒã·ã§ã³ã«å¿ èŠãªã®ã¯ãRTPã¹ããªãŒã ãèŠæ±ãããããå°ãåŒãåºããŠããsleepïŒïŒãå®è¡ããã¹ããªãŒã ãäžæãããã©ããã確èªããããšã ãã§ãã
ãã©ã³ã±ã³ã·ã¥ã¿ã€ã³ã®ããŒããèŠã€ãã
ãã¹ãããŒã¹ããã°ããæããå¿ èŠãããå Žåã¯ã©ãããŸããïŒ ã¹ã¯ãªããèšèªãæ¢è£œã®ã©ã€ãã©ãªã®ã»ããã䜿çšããŠããã¹ãŠãäžç·ã«äœãäžããŠãã ããã Googleã«ä¹ã蟌ã¿ãŸãã Python + ONVIFã è ã£ãã Ruby + ONVIFã ããã ruby-onvif-clientããããŸã ã OK ã¹ããªãŒã URLããã£ãããããŸããã ãã°ãããã§ããããããã³ã«ïŒ.. UDPãHTTPãTCP ...çµæã¯1ã€ã§ã-çŽ æŽããããonvifã䜿çšããŠURLããã£ããããæ¹æ³ãåŠã³ãŸããã
ã«ãŒã«ïŒ åã¿ãŸããã ããŠãRuby + RTSP ...ã»ããã©ã€ãã©ãªããããŸãã 圌ã«URLãåãŸããŠãã ããã Basicã®ã¿ã§ãã°ã€ã³ãè©Šã¿ãŸãã ããå°ãã°ãŒã°ã«ã æ®å¿µã 次ã«ã1ã€ã®æ¹æ³ãæ®ã£ãŠããŸã-ãã¡ã€ã«ã§ãã ç§ãã¡ã¯ãç±ãéã§ã¯ãã ä»ãã ãéäžã§ã«ããã®éæ³ã®ããªã¥ãŒã ãèªããŸãïŒãæ£çŽãªãååž°ãæ£ããè¡ãæ¹æ³ãæããŠãããã®ã§ããªã¿ãŒã³ãšã€ãŒã«ãã¯æ£ããæ©èœããŸããïŒæ©èœã®èª¬æããå¿ èŠãªããšãã©ã®ããã«æšæž¬ã§ããŸããïŒæ£ãã...ãããåãé€ãã®ã¯ç°¡åã§ã圌女-ãããŠãããããããªã³ãŒããããã³çµ¹ã®ãããªé«ªïŒã
ãããŠåã³åã³ãrtsp_clientã¯æ©èœããŸãã 2çªç®ã®ãŠã£ã³ããŠã§tcpdumpãéããŸã...ãããŒïŒ ONVIFã®IãèŠæ±ããŸããïŒprotocol =>â TCPâã äžäœäœã ããªãUDPãªã®ãïŒ
ããªãã®æã«ã¯ãã ããŠ...ãïŒ UDPã¯lib/rtsp/client.rb@request_transportã«åºå®ãããŠããŸãã ããã§ãåãçª/ TCPã§ããã«ã¯ãã ä»ãããŸãã ç§ãã¡ã¯å§ããŸã-ããã¯èœã¡ãŸãã ãªãã§ïŒ ã©ããžïŒ ãããclient_portãå¿ èŠã§ã... TCPã®å Žåãã©ã®client_portã§ããïŒ 554ã«ãªãå Žåã¯ãrtp_portãããŒãã³ãŒãããŸãããããã£ãŠããµãŒããŒã«ã¯IPãå¿ èŠã§ã-ããŒãã³ãŒãã Opaã¯ããbindïŒïŒãã§ã¯ããŒã554ã«ç§»åããã«ãŒãã§ã¯ãªãããšèšãããšã¯ã§ããŸããã è«ççã§ãã ããã§ããªãã§ããïŒ ãŸã...ããã¯RTPã«ãããŸã::ã¬ã·ãŒã㌠... init_socketãã¢ãŒãã§èŠãïŒTCP and wonder-ãªã圌ã¯ã¬ã·ãŒããŒã«TCPServerãå¿ èŠãªã®ã§ããïŒ äœããæ£ãããããŸããã æããã«ãTCPã§æ瀺çã«ãããã°ããŠãã人ã¯ããŸããã§ããã
ããžãã¯ãç解ããããšããŠæ°ååŸãèŠæçŒã¯å£ããªãããšã«æ°ä»ããŸããã
ãã©ã³ã¹ããŒãïŒRTP / AVP / TCP;ãŠããã£ã¹ã;å®å = 172.28.1.199;ãœãŒã¹= 172.28.1.95;ã€ã³ã¿ãŒãªãŒã= 0-1
ãã...äœãã€ã³ã¿ãŒãªãŒããããŠããŸããïŒ GoogleïŒrtp interleaved => Wikipedia =>ãinterleavedãããŒãžã§æ€çŽ¢=>ã¯ãïŒ ãã®ãããRTPãšRTSPã¯åãæ¥ç¶ã§åäœããŸãïŒ
ç§ã®ã¿ã¹ã¯ã®ããã«ç§ã¯æ¬åœã«ç·šéããããªãããŸãã¯ççŽã«ããããªãã®ã§ãrtspã©ã€ãã©ãªãæšãŠãŸã-ããã§ã¯æããã«è¯ãæ¹æ³ã§ã¢ãŒããã¯ãã£ãããçŽãå¿ èŠããããŸãã
ã¢ã¡ãŒããè²ãŠã
ãããã£ãŠãåã³ãŒãã«ãªããŸããrtspããããŸãã//ã«ã¡ã©ã®urlããããããŒãžããæ¥ç¶äžã®ãã¬ã€ã³äžã«åçããå¿ èŠããããŸã...åæ¢ããŸãïŒ æåã¯ã URLããããŸãã ã«ã¡ã©ããããŸãã ãã°ãåçŸããã¿ã¹ã¯ããããŸãã ãªãONVIFãå¿ èŠãªã®ã§ããïŒ RTSPãéžã¶çç± çãããªã¯ãšã¹ãããŠããŠã³ããŒãããã ãã§ãã
ããã«èšã£ãŠãã£ãã DESCRIBEïŒ ãããŠããªããããå¿ èŠãªã®ã...æåã«ã»ããã¢ãããã»ãã·ã§ã³ãååŸããå ŽæããããŠåœŒå¥³ãšãã¬ã€ããã ãã§ãã
æåã®çµéšã¯ã圌ãããã§æ¿èªããå¿ èŠãšããªãããšã瀺ããŸããã
ãããïŒ ããã«æ®åœ±ãããæåã®ãã³ã±ãŒãïŒ åçŽãªã¹ã¯ãªããããã°ãå®å šã«åçŸããŸãã-ã¹ãªãŒãåŸïŒïŒ 'ãããŠã¹ããªãŒã ã¯çªç¶é³ŽããŸããã
ãã ããTCPãŠã£ã³ããŠãæäœããã«ã¯ãTCP_WINDOW_CLAMPãèšå®ã§ããå¿ èŠããããŸãã ãã®ããã«ãsetsockopt TOãå®è¡ããå¿ èŠããããŸããããœã±ãããäœæããåŸã«æ¥ç¶ããŸãã
ãããŠãã«ãŒãã«ã§ãããè¡ãæ¹æ³ã¯ïŒ ãããš... Googleã調æ»ããŠããŸã...空ã§ãã ãœãŒã¹ã調ã¹ãŸã-init_inetsock_internal ...ã€ããžã¯ããããŸãïŒ ãŸããrsock_socketïŒïŒãäœæããããã«rsock_connectïŒïŒãäœæããŸãã ãããŒ
ããŠãç§ã¯ãŸã ã«ãããæ¬åœã«å¥œãã§ã¯ãããŸããã 2åã§pythonã«æžãæããsetsockoptãè¿œå ããŸãã RTPãã±ããçªå·ã®åæãè¿œå ããŸãã
åæã®çµæïŒæ å ±éã¯ãåæãŠã£ã³ããŠã®ãµã€ãºãã«ã¡ã©ãæ£åžžã«éä¿¡ããåã«ã«ã¡ã©ãã©ãã ãå£ãããã«å¿ããŠå€åããŸãã ãããã圌ã¯çµæãèŠçŽãã売ãæã«ãã°ã¬ããŒããæžããŠã圌ããéçºè ã«ãã¡ãŒã ãŠã§ã¢ãæž¡ãããã«ããŸããã
ç§ã¯èœã¡çããŠããã ãããã maxlapshinã¯ã©ãã«ããã®ãã°ãšäžç·ã«æ®ããããšãã§ãããã©ããå°ããã ãããŠãããã«ã¯è¿œå ã®çºæãå¿ èŠã§ããã
ååãšããŠããããšäžç·ã«æ®ããæ¹æ³ã¯ïŒ
1ïŒé害ã远跡ããèªåã§åæ¥ç¶ã§ããŸã
2ïŒãããŒãäžæããã®ãåŸ ããã«ãèªåã®ã©ã°ã远跡ã§ããŸãïŒæ¹æ³ã¯ããããŸããããã§ããŸãïŒã
3ïŒã¹ããªãŒã ãšã®åæã埩å ããããšããããšãã§ããŸãã
ãããã£ãŠãã¬ã€ãºã³ãŒã«ã§ã¯ãªãåæ¥ç¶ã³ãŒã«ã䜿çšããRTPãã±ããã®æ°ã®éãã«ãã£ãŠæ倱ãåæããŸãã ãã€ã³ã1ã§åŠçãããšãæ倱ã¯çŽ1500ã1800 RTPãã±ããïŒ1ç§ãããçŽ600ãã±ããã®ã¹ãªãŒãïŒïŒïŒã§ãã
ã¹ãªãŒãçŽåŸã«åæ¥ç¶ããŸãïŒïŒã çµæã¯ãŸã£ããåãã§ãã
æ€çŽ¢æ¹æ³ "$ \ x00"ã«ããååæãç¶æããŸã-ããã¯ããããããŸãã æ€çŽ¢æ¹æ³ã$ \ x00 [LEN] {len bytes} $ \ x00ãã䜿çšããŠååæãç¶æããŸã-å®å®ããŠåäœããæ倱ã¯åæ¥ç¶ããã1.5åå°ãªããªããŸãã ãã ããæãéèŠãªããšã¯ãTCPæ¥ç¶ã倱æããªãããšã§ããã€ãŸããTCPãŠã£ã³ããŠãšåä¿¡ãããã¡ãŒã®é©å¿ã¢ã«ãŽãªãºã ã¯åŒãç¶ãæ©èœããŸãã ãã®çµæãæ¥ç¶ã®éå§æã«1-2ã®é害ãçºçããåŸãã¹ããªãŒã ã¯åã«äžæãåæ¢ããŸããsleepïŒïŒã¯å®æçã«ã¯ã©ã€ã¢ã³ããèœã¡çãããã¹ããªãŒã ã¯èœã¡ãŸããã
çµæãšããŠåŸããããã¹ãã¹ã¯ãªããã¯ãã³ãŒãã®å質ã§èŒããŸããããæŠå¿µå®èšŒã®æ©èœãå®å šã«å®è¡ããŸãã
ãããŠä»ãã€ãã«ãã¿ã€ãã«ã§å°ãããã質åã«æ¥ãŸããã
ããã¯ãã°ã§ããããããšãæ©èœã§ããïŒ
ç§ã®å人çãªæèŠã¯ãæ¥ç¶ãå®å šã«åæãããããæ¬åœã«åªããŠããŸããæ¥ç¶ã«ã¯å€æ°ã®RTPãã±ãããååšãããããåé¡ãªã倱ãããããªã¥ãŒã ã枬å®ã§ããŸãã
ãã£ãã«ããããã¯ãŒã¯åž¯åå¹ ãããèãå Žå-æ倱ãå¢å ããããã5ç§ä»¥äžã«ããã£ãŠæ倱ãæ€åºããŸã-ç©ããã«ãã£ãã«ã®åãã«ã€ããŠäžå¹³ãèšãããšãã§ããŸãïŒäœå質ã§åæ¥ç¶ãããã±ãŒãã«ãå€æŽãããåååçºé»æãçç ŽããããŸãã¯ãã®ä»ã®å¯Ÿå¿æ¹æ³ãã®åé¡ïŒ; åé¡ããäœããã®çç±ã§ã¬ã·ãŒããŒãåã«ã¬ãŒãã¢ãŠãããæéããªãããšã§ããå Žå-ååæåäœ=幞çŠã UDPã¢ãããŒããšTCPã¢ãããŒãã®å©ç¹ãåæã«çµã¿åãããŠå©çšã§ããŸããäœããå®å šã«æªãå Žåãæçã倱ãããŸãã ãã以å€ã®å Žåãåéä¿¡ã¯èªåçã«è¡ãããåé¡ã¯çºçããŸããã
ãŸãããã¡ãŒã ãŠã§ã¢ã®ã©ã®ãããªãã°ã«ã€ããŠè©±ããŸããã...ãããããã°ã¯ç°¡åã§ããsendïŒsomedataãsomelenïŒã¯ããšã©ãŒã®å Žåã¯<0ãè¿ãããšã©ãŒãçºçããå Žåã¯ãã€ãæ°ãè¿ããŸãã ãããŠããã¹ãŠã®åå¿è ãããã¯ãŒã¯éçºè ã®ãæ°ã«å ¥ãã®ééãïŒsendïŒsomedataãsomelenïŒã¯somelenãããå°ãªãäœããè¿ãããšãã§ããŸã-ããã¯ãããã¡ã«åãŸããŸããã§ããã
ãããåŠçãããªãå Žåãsomedataããã®ããŒã«ã¯åã«å€±ãããŸã-éä¿¡ããããç Žæ£ãããŸããã
ä¿®æ£æ¹æ³
ãã®æ¹æ³ã§ä¿®æ£ããã«ã¯ãé ä¿¡ãããŠããªãéšåãèšæ¶ãããã®æ®ãã®sendïŒïŒããã¹ãŠããã¹ãŠéä¿¡ãããŸã§ãéä¿¡ãåæ¢ããå¿ èŠããããŸãã ãã®åŸã_next_ãã±ããã®éä¿¡ãéå§ããå¿ èŠããããŸãïŒãããã¡ãåžžã«ããžãŒã ã£ããã±ãããç Žæ£ããŸãïŒã 次ã«ãTCPãšUDPã®æ··åã®åäœãååŸããŸãããã¯ã©ã€ã¢ã³ãããã±ããã®å¢çãšéæ³ã®ååæãè¡ãå¿ èŠã¯ãããŸããã
ã¡ãŒã«ãŒããã®ãã°ãä¿®æ£ããŠãããããšãé¡ã£ãŠããŸãããã°ãããããšãäžåœã®ã«ã¡ã©çšã®ãã¹ãŠã®äžåœèªãã¡ãŒã ãŠã§ã¢ã¯ã1åã®äžæãštmãªãã§æ£åžžã«åäœããŸãã
åã³ã®æºïŒLIVE555ãžã¥ã©çŽ
ãµããŒã macroscopã¯ãLIVE555ã2011幎ã«çºè¡šããããšããäºå®ã«éŠ¬é¹¿ããäžæ³šæãæ±ããŸããããã®ãããbinwalk + dd + mountã䜿çšããŠããã¡ãŒã ãŠã§ã¢ã®å éšã調ã¹ãŸããã rtsp_streamerãšçå®ã2011幎ããã
live.2013.10.09.tar.gzãšlive.2014.02.19.19.tar.gzã®2ã€ã®ããŒãžã§ã³ã®å·®åã調ã¹ãŸããã
diff --git a/liveMedia/RTPInterface.cpp b/liveMedia/RTPInterface.cpp index d45e5a8..3d88d55 100644 --- a/liveMedia/RTPInterface.cpp +++ b/liveMedia/RTPInterface.cpp @@ -324,19 +325,23 @@ Boolean RTPInterface::sendRTPorRTCPPacketOverTCP(u_int8_t* packet, unsigned p } Boolean RTPInterface::sendDataOverTCP(int socketNum, u_int8_t const* data, unsigned dataSize, Bool - if (send(socketNum, (char const*)data, dataSize, 0/*flags*/) != (int)dataSize) { - // The TCP send() failed. - - if (forceSendToSucceed && envir().getErrno() == EAGAIN) { - // The OS's TCP send buffer has filled up (because the stream's bitrate has exceeded the cap + int sendResult = send(socketNum, (char const*)data, dataSize, 0/*flags*/); + if (sendResult < (int)dataSize) { + // The TCP send() failed - at least partially. + + unsigned numBytesSentSoFar = sendResult < 0 ? 0 : (unsigned)sendResult; + if (numBytesSentSoFar > 0 || (forceSendToSucceed && envir().getErrno() == EAGAIN)) { + // The OS's TCP send buffer has filled up (because the stream's bitrate has exceeded + // the capacity of the TCP connection!). // Force this data write to succeed, by blocking if necessary until it does: + unsigned numBytesRemainingToSend = dataSize - numBytesSentSoFar; #ifdef DEBUG_SEND - fprintf(stderr, "sendDataOverTCP: resending %d-byte send (blocking)\n", dataSize); fflush(st + fprintf(stderr, "sendDataOverTCP: resending %d-byte send (blocking)\n", numBytesRemainingToS #endif makeSocketBlocking(socketNum); - Boolean sendSuccess = send(socketNum, (char const*)data, dataSize, 0/*flags*/) == (int)dataS + sendResult = send(socketNum, (char const*)(&data[numBytesSentSoFar]), numBytesRemainingToSen makeSocketNonBlocking(socketNum); - return sendSuccess; + return sendResult == (int)numBytesRemainingToSend; } return False; }
ãããŠãããã¯changelog.txtããã®åãæãã§ãïŒ
2013.12.04:
- Updated the "sendDataOverTCP()" function (in "RTPInterface.cpp") to allow for the possibility of
one of the "send()" calls partially succeeding - ie, writing some, but not all, of its data.
- Fixed a couple of minor bugs. (Thanks to "maksqwe1ukr.net".)
? . , LIVE555 .
, -- topsee; MontaVista. , .