рдЖрдИрдкреА(рдЯреАрдПрд╕) рд╕реНрдЯреНрд░реАрдо рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЯреАрдПрд╕рдбрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЬ рдЖрдИрдкреА(рдЯреАрдПрд╕) рд╕реНрдЯреНрд░реАрдо рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ (рдорд╛рд▓рд┐рдХрд╛рдирд╛) рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИрдВ VB ╨╕ iQ, рдЙрдирдХреЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рдлреА рд╕рдореГрджреНрдз рд╕рдореВрд╣ рд╣реИ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЯреАрд╡реА рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрдбрд╝реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЯреАрдПрд╕рдбрдХрд╕реАрд╕реА (рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛рдЙрдВрдЯрд░) рдХрд╛рдЙрдВрдЯрд░ рдФрд░ рдмрд┐рдЯрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдЖрдИрдкреА (рдЯреАрдПрд╕) рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдиреНрдпреВрдирддрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрдЯреНрдЯреЗ рдкрд░ рджрд┐рдП рдЧрдП L2 рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдХреЗрдЯреЛрдВ рдХреЗ рдиреБрдХрд╕рд╛рди рдпрд╛ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ (рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдореЙрдирд┐рдЯрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрддрд╛рд░реЛрдВ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдкрдврд╝рдХрд░)ред

TSDuck рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ

рдЯреАрдПрд╕рдбрдХ рдЯреАрдПрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд (2-рдХреНрд▓реЙрдЬ рдмреАрдПрд╕рдбреА рд▓рд╛рдЗрд╕реЗрдВрд╕) рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ (рдХрдВрд╕реЛрд▓ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдХрд╕реНрдЯрдо рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдпрд╛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рд╣реИред рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЖрдИрдкреА (рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ/рдпреВрдирд┐рдХреИрд╕реНрдЯ), http, hls, dvb рдЯреНрдпреВрдирд░, рдбреЗрдХреНрдЯреЗрдХ dvb-asi рдбреЗрдореЛрдбреБрд▓реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЯреАрдПрд╕-рд╕реНрдЯреНрд░реАрдо рдЬрдирд░реЗрдЯрд░ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рд╕реЗ рд░реАрдбрд┐рдВрдЧ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдлрд╝рд╛рдЗрд▓, рдЖрдИрдкреА (рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ/рдпреВрдирд┐рдХрд╛рд╕реНрдЯ), рдПрдЪрдПрд▓рдПрд╕, рдбреЗрдХреНрдЯреЗрдХ рдбреАрд╡реАрдмреА-рдПрдПрд╕рдЖрдИ рдФрд░ рд╣рд╛рдИрдбреЗрд╕ рдореЙрдбреНрдпреВрд▓реЗрдЯрд░, рдкреНрд▓реЗрдпрд░реНрд╕ (рдПрдордкреНрд▓реЗрдпрд░, рд╡реАрдПрд▓рд╕реА, рдПрдХреНрд╕рдИрдПрди) рдФрд░ рдбреНрд░реЙрдк рдкрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд┐рдиреНрди рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрдЖрдИрдбреА тАЛтАЛрд░реАрдореИрдкрд┐рдВрдЧ, рд╕реНрдХреНрд░реИрдореНрдмрд▓рд┐рдВрдЧ / рдбрд┐рд╕рдХреНрд░реИрдореНрдмрд▓рд┐рдВрдЧ, рд╕реАрд╕реА рдХрд╛рдЙрдВрдЯрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдмрд┐рдЯрд░реЗрдЯ рдЧрдгрдирд╛ рдФрд░ рдЯреАрдПрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рдиред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЖрдИрдкреА рд╕реНрдЯреНрд░реАрдо (рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрд┐рдЯрд░реЗрдЯ_рдореЙрдирд┐рдЯрд░ (рдирд╛рдо рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ) рдФрд░ рдирд┐рд░рдВрддрд░рддрд╛ (рд╕реАрд╕реА рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЖрдИрдкреА рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рдХреЛ TSDuck рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд┐рд░реНрдорд╛рдг/рдкреИрдХреЗрдЬ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореМрдЬреВрджрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП TSDuckред рд╡реЗ рдбреЗрдмрд┐рдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдбреЗрдмрд┐рдпрди 8 рдФрд░ рдбреЗрдмрд┐рдпрди 10 рдХреЗ рддрд╣рдд рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрд╕реНрдХрд░рдг TSDuck 3.19-1520 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, Linux рдХреЛ OS рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рдорд╛рдзрд╛рди рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдмрд┐рдпрди 10 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП CentOS 7 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)

TSDuck рдФрд░ OS рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ TSDuck рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдпрд╛ OS (рд╕реЙрдХреЗрдЯ) рд╕реНрддрд░ рдкрд░ рдХреЛрдИ рдЧрд┐рд░рд╛рд╡рдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЗрд╕рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдпрд╣ рдЕрдиреБрдорд╛рди рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╣рд╛рдВ рд╣реБрдИ - рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдпрд╛ "рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░"ред рдЖрдк рдПрдердЯреВрд▓ -рдПрд╕ рдПрдердПрдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рд╕реНрддрд░ рдкрд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреНрдпреВрдирд┐рдВрдЧ рдЙрд╕реА рдПрдердЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ (рдЖрдорддреМрд░ рдкрд░, рдЖрдкрдХреЛ рдЖрд░рдПрдХреНрд╕ рдмрдлрд░ (-рдЬреА) рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдХреБрдЫ рдСрдлрд▓реЛрдб (-рдХреЗ) рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ)ред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрд╢рдВрд╕рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреЛрд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝реА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧрд┐рд░рд╛рд╡рдЯ рдЕрдиреНрдп рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреЛрд░реНрдЯ рдкрд░ рд╣реБрдИ рдереАред рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдПрдХ рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдорд┐рдиреА-рдХрдВрдкреНрдпреВрдЯрд░/рдПрдирдпреВрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдмрд╛рдХреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдПрдХ рднреМрддрд┐рдХ рдкреЛрд░реНрдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдбреНрд░реЙрдкреНрд╕ рдХреЛ рдвреВрдВрдврдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрдЬрдмрд╛рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕реНрд╡рд╛рдЧрдд

TSDuck рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдкрд╣рд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдиреЗрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рд╣реЛрд╕реНрдЯ рдХреЗ рднреАрддрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рдирд╛:

ip netns add P #╤Б╨╛╨╖╨┤╨░╤С╨╝ netns P, ╨▓ ╨╜╤С╨╝ ╨▒╤Г╨┤╨╡╤В ╨┐╤А╨╛╨╕╤Б╤Е╨╛╨┤╨╕╤В╤М ╨░╨╜╨░╨╗╨╕╨╖ ╤В╤А╨░╤Д╨╕╨║╨░
ip link add type veth #╤Б╨╛╨╖╨┤╨░╤С╨╝ veth-╨┐╨░╤А╤Г - veth0 ╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╨╝ ╨▓ netns ╨┐╨╛ ╤Г╨╝╨╛╨╗╤З╨░╨╜╨╕╤О (╨▓ ╤Н╤В╨╛╤В ╨╕╨╜╤В╨╡╤А╤Д╨╡╨╣╤Б ╨▒╤Г╨┤╨╡╤В ╨│╨╡╨╜╨╡╤А╨╕╤А╨╛╨▓╨░╤В╤М╤Б╤П ╤В╤А╨░╤Д╨╕╨║)
ip link set dev veth1 netns P #veth1 - ╨┐╨╛╨╝╨╡╤Й╨░╨╡╨╝ ╨▓ netns P (╨╜╨░ ╤Н╤В╨╛╨╝ ╨╕╨╜╤В╨╡╤А╤Д╨╡╨╣╤Б╨╡ ╨▒╤Г╨┤╨╡╤В ╨┐╤А╨╕╤С╨╝ ╤В╤А╨░╤Д╨╕╨║╨░)
ip netns exec P ifconfig veth1 192.0.2.1/30 up #╨┐╨╛╨┤╨╜╨╕╨╝╨░╨╡╨╝ IP ╨╜╨░ veth1, ╨╜╨╡ ╨╕╨╝╨╡╨╡╤В ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨║╨░╨║╨╛╨╣ ╨╕╨╝╨╡╨╜╨╜╨╛
ip netns exec P ip ro add default via 192.0.2.2 #╨╜╨░╤Б╤В╤А╨░╨╕╨▓╨░╨╡╨╝ ╨╝╨░╤А╤И╤А╤Г╤В ╨┐╨╛ ╤Г╨╝╨╛╨╗╤З╨░╨╜╨╕╤О ╨▓╨╜╤Г╤В╤А╨╕ nents P
sysctl net.ipv6.conf.veth0.disable_ipv6=1 #╨╛╤В╨║╨╗╤О╤З╨░╨╡╨╝ IPv6 ╨╜╨░ veth0 - ╤Н╤В╨╛ ╨┤╨╡╨╗╨░╨╡╤В╤Б╤П ╨┤╨╗╤П ╤В╨╛╨│╨╛, ╤З╤В╨╛╨▒╤Л ╨▓ ╤Б╤З╤С╤В╤З╨╕╨║ TX ╨╜╨╡ ╨┐╨╛╨┐╨░╨┤╨░╨╗ ╨┐╨╛╤Б╤В╨╛╤А╨╛╨╜╨╜╨╕╨╣ ╨╝╤Г╤Б╨╛╤А
ifconfig veth0 up #╨┐╨╛╨┤╨╜╨╕╨╝╨░╨╡╨╝ ╨╕╨╜╤В╨╡╤А╤Д╨╡╨╣╤Б veth0
ip route add 239.0.0.1 dev veth0 #╤Б╨╛╨╖╨┤╨░╤С╨╝ ╨╝╨░╤А╤И╤А╤Г╤В, ╤З╤В╨╛╨▒╤Л ╨Ю╨б ╨╜╨░╨┐╤А╨░╨▓╨╗╤П╨╗╨░ ╤В╤А╨░╤Д╨╕╨║ ╨║ 239.0.0.1 ╨▓ ╤Б╤В╨╛╤А╨╛╨╜╤Г veth0

рдкрд░реНрдпрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рд╣реИ. рд╣рдо рдЯреНрд░реИрдлрд╝рд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ:

ip netns exec P tsp --realtime -t 
 -I ip 239.0.0.1:1234 
 -P continuity 
 -P bitrate_monitor -p 1 -t 1 
 -O drop

рдЬрд╣рд╛рдВ "-p 1 -t 1" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рд░ рд╕реЗрдХрдВрдб рдмрд┐рдЯрд░реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рд╣рд░ рд╕реЗрдХрдВрдб рдмрд┐рдЯрд░реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╣рдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ 10Mbps рдХреА рдЧрддрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

tsp -I craft 
 -P regulate -b 10000000 
 -O ip -p 7 -e --local-port 6000 239.0.0.1:1234

рдЬрд╣рд╛рдВ "-p 7 -e" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ 7 TS рдкреИрдХреЗрдЯ рдХреЛ 1 IP рдкреИрдХреЗрдЯ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╣рд╛рд░реНрдб (-e) рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдЖрдИрдкреА тАЛтАЛрдкреИрдХреЗрдЯ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ 7 рдЯреАрдПрд╕ рдкреИрдХреЗрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ:

* 2020/01/03 14:55:44 - bitrate_monitor: 2020/01/03 14:55:44, TS bitrate: 9,970,016 bits/s
* 2020/01/03 14:55:45 - bitrate_monitor: 2020/01/03 14:55:45, TS bitrate: 10,022,656 bits/s
* 2020/01/03 14:55:46 - bitrate_monitor: 2020/01/03 14:55:46, TS bitrate: 9,980,544 bits/s

рдЕрдм рдХреБрдЫ рдмреВрдВрджреЗрдВ рдбрд╛рд▓реЗрдВ:

ip netns exec P iptables -I INPUT -d 239.0.0.1 -m statistic --mode random --probability 0.001 -j DROP

рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

* 2020/01/03 14:57:11 - continuity: packet index: 80,745, PID: 0x0000, missing 7 packets
* 2020/01/03 14:57:11 - continuity: packet index: 83,342, PID: 0x0000, missing 7 packets 

рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ. рдкреИрдХреЗрдЯ рд╣рд╛рдирд┐ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ (рдЖрдИрдкреА рдиреЗрдЯрдПрдирдПрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдкреА рдЖрдИрдкреАрдЯреЗрдмрд▓реНрд╕ -рдПрдл) рдФрд░ рдЬрдирд░реЗрдЯрд░ рдмрд┐рдЯрд░реЗрдЯ рдХреЛ 100 рдПрдордмреАрдкреАрдПрд╕ рддрдХ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реАрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдФрд░ 75 рдХреЗ рдмрдЬрд╛рдп рд▓рдЧрднрдЧ 100 рдПрдордмреАрдкреАрдПрд╕ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реЗ рджреЛрд╖реА рдард╣рд░рд╛рдпрд╛ рдЬрд╛рдП - рдЬрдирд░реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рд╕рдордп рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╕рдорд╕реНрдпрд╛ рдЙрд╕рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдкреИрдХреЗрдЯ (700000 рдЯреАрдПрд╕ рдкреИрдХреЗрдЯ = 100000 рдЖрдИрдкреА рдкреИрдХреЗрдЯ):

# ifconfig veth0 | grep TX
       TX packets 151825460  bytes 205725459268 (191.5 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# tsp -I craft -c 700000 -P regulate -b 100000000 -P count -O ip -p 7 -e --local-port 6000 239.0.0.1:1234
* count: PID    0 (0x0000):    700,000 packets
# ifconfig veth0 | grep TX
        TX packets 151925460  bytes 205861259268 (191.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рд▓реНрдХреБрд▓ 100000 рдЖрдИрдкреА рдкреИрдХреЗрдЯ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП (151925460-151825460)ред рддреЛ рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо veth1 рдкрд░ RX рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдЦреНрддреА рд╕реЗ veth0 рдкрд░ TX рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдлрд┐рд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЙрдХреЗрдЯ рд╕реНрддрд░ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

# ip netns exec P cat /proc/net/udp                                                                                                           
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
  133: 010000EF:04D2 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 72338 2 00000000e0a441df 24355 

рдпрд╣рд╛рдВ рдЖрдк рдмреВрдВрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ = 24355 рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЯреАрдПрд╕ рдкреИрдХреЗрдЯ рдореЗрдВ, рдпрд╣ 170485 рдпрд╛ 24.36 рдХрд╛ 700000% рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЦреЛрдИ рд╣реБрдИ рдмрд┐рдЯрд░реЗрдЯ рдХрд╛ рд╡рд╣реА 25% рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдореЗрдВ рдмреВрдВрджреЗрдВ рд╣реИрдВред рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдорддреМрд░ рдкрд░ рдмрдлрд░ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЙрдХреЗрдЯ рдмрдлрд░ рдЖрдХрд╛рд░ рдФрд░ рдЕрдзрд┐рдХрддрдо рд╕реЙрдХреЗрдЯ рдмрдлрд░ рдЖрдХрд╛рд░ рджреЗрдЦреЗрдВ:

# sysctl net.core.rmem_default
net.core.rmem_default = 212992
# sysctl net.core.rmem_max
net.core.rmem_max = 212992

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдлрд░ рдЖрдХрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реЙрдХреЗрдЯ 208 рдХреЗрдмреА рдХреЗ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡реЗ рдЕрдзрд┐рдХ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЙрдиреНрд╣реЗрдВ рд╡рд╣ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдЖрдк рдЖрдИрдкреА рдЗрдирдкреБрдЯ (-рдмрдлрд░-рдЖрдХрд╛рд░) рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рдЯреАрдПрд╕рдкреА рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЙрдХреЗрдЯ рдЖрдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рдЫреВрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдзрд┐рдХрддрдо рд╕реЙрдХреЗрдЯ рдмрдлрд░ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЯреАрдПрд╕рдкреА рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВрдЧреЗ:

sysctl net.core.rmem_max=8388608
ip netns exec P tsp --realtime -t -I ip 239.0.0.1:1234 -b 8388608 -P continuity -P bitrate_monitor -p 1 -t 1 -O drop

рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░ рдХреА рдЗрд╕ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЕрдм рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рдмрд┐рдЯрд░реЗрдЯ рд▓рдЧрднрдЧ 100 рдПрдордмреАрдкреАрдПрд╕ рд╣реИ, рдХреЛрдИ рд╕реАрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВред

рдЯреАрдПрд╕рдкреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реАрдкреАрдпреВ рдЦрдкрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реАред рдПрдХ рдХреЛрд░ i5-4260U CPU @ 1.40GHz рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, 10Mbps рдкреНрд░рд╡рд╛рд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП 3-4% CPU, 100Mbps - 25%, 200Mbps - 46% рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред % рдкреИрдХреЗрдЯ рд▓реЙрд╕ рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╕реАрдкреАрдпреВ рдкрд░ рд▓реЛрдб рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдШрдЯ рд╕рдХрддрд╛ рд╣реИ)ред

рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ 1Gb/s рд╕реЗ рдЕрдзрд┐рдХ рдХреА рд╕реНрдЯреНрд░реАрдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдкрд░ рдкрд░реАрдХреНрд╖рдг

рд╡реАрде рдЬреЛрдбрд╝реА рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рджреЛ рд╣реЛрд╕реНрдЯ рдпрд╛ рдПрдХ рд╣реЛрд╕реНрдЯ рдХреЗ рджреЛ рдкреЛрд░реНрдЯ рд▓реЗрдиреЗ рд╣реЛрдВрдЧреЗ, рдкреЛрд░реНрдЯ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдкрд░ рдЬрдирд░реЗрдЯрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рджреВрд╕рд░реЗ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХред рдпрд╣рд╛рдВ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рд▓реЛрд╣реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рддрдирд╛ рдХрдордЬреЛрд░ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рдЙрддрдирд╛ рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред

рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА (рдЬрд╝реИрдмрд┐рдХреНрд╕) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЯреАрдПрд╕рдкреА рдореЗрдВ рдПрд╕рдПрдирдПрдордкреА рдпрд╛ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдХреЛрдИ рдорд╢реАрди-рдкрдардиреАрдп рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИред рд╕реАрд╕реА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо 1 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдкреИрдХреЗрдЯ рд╣рд╛рдирд┐ рдХреЗ рдЙрдЪреНрдЪ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд╕рд╛рде, рдмрд┐рдЯрд░реЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕реИрдХрдбрд╝реЛрдВ/рд╣рдЬрд╛рд░реЛрдВ/рджрд╕рд┐рдпреЛрдВ рд╣рдЬрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд╕реАрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдмрд┐рдЯрд░реЗрдЯ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рдиреЗ рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рджреБрд░реНрдШрдЯрдирд╛рдПрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдЯреАрдПрд╕рдкреА рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдФрд░ рдПрдХрддреНрд░реАрдХрд░рдг (рд╕реАрд╕реА рджреНрд╡рд╛рд░рд╛), рдпрд╛рдиреАред рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред
  2. рдЯреАрдПрд╕рдкреА рд╕реНрд╡рдпрдВ рдФрд░/рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрд┐рдЯрд░реЗрдЯ_рдореЙрдирд┐рдЯрд░ рдФрд░ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдорд╢реАрди-рдкрдардиреАрдп рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  3. рдЕрдкрдирд╛ рдЖрд╡реЗрджрди tsduck рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд┐рдЦреЗрдВред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рдпрд╛рд╕ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╡рд┐рдХрд▓реНрдк 1 рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ tsduck рд╕реНрд╡рдпрдВ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп (рдЖрдзреБрдирд┐рдХ рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рднрд╛рд╖рд╛ (C++) рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреИрд╢ рдкрд╛рд░реНрд╕рд░+рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 10 рдПрдордмреАрдкреАрдПрд╕ рд╕реНрдЯреНрд░реАрдо рдФрд░ 50% рдкреИрдХреЗрдЯ рд╣рд╛рдирд┐ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐) рдкрд░, рдмреИрд╢ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреАрдПрд╕рдкреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3-4 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд рдХрд░рддреА рд╣реИред рдпрд╣ рдкрд░рд┐рджреГрд╢реНрдп рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдиреАрдЪреЗ рд╣реИ

рд╢реАрд░реНрд╖ рдкрд░ рдиреВрдбрд▓реНрд╕

#!/usr/bin/env bash

missingPackets=0
ccErrorSeconds=0
regexMissPackets='^* (.+) - continuity:.*missing ([0-9]+) packets$'
missingPacketsTime=""

ip netns exec P tsp --realtime -t -I ip -b 8388608 "239.0.0.1:1234" -O drop -P bitrate_monitor -p 1 -t 1  -P continuity 2>&1 | 
while read i
do
    #line example:* 2019/12/28 23:41:14 - continuity: packet index: 6,078, PID: 0x0100, missing 5 packets
    #line example 2: * 2019/12/28 23:55:11 - bitrate_monitor: 2019/12/28 23:55:11, TS bitrate: 4,272,864 bits/s
    if [[ "$i" == *continuity:* ]] 
    then
        if [[ "$i" =~ $regexMissPackets ]]
        then
            missingPacketsTimeNew="${BASH_REMATCH[1]}" #timestamp (seconds)
            if [[ "$missingPacketsTime" != "$missingPacketsTimeNew" ]] #new second with CC error
            then
                ((ccErrorSeconds += 1))
            fi
            missingPacketsTime=$missingPacketsTimeNew
            packets=${BASH_REMATCH[2]} #TS missing packets
            ((missingPackets += packets))
        fi
    elif [[ "$i" == *bitrate_monitor:* ]]
    then
        : #...
    fi
done

рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдзреАрдореА рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреИрд╢ рдореЗрдВ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдереНрд░реЗрдб рдирд╣реАрдВ рд╣реИрдВ, рдмреИрд╢ рдЬреЙрдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдкрд░ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рдорд┐рд╕рд┐рдВрдЧрдкреИрдХреЗрдЯ рдХрд╛ рдорд╛рди рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ (рдЬрдм рд╣рд░ рд╕реЗрдХрдВрдб рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдЯрд░реЗрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ)ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмреИрд╢ рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рдПрдХ рд░реИрдкрд░ (рдкрд╛рд░реНрд╕рд░ + рдПрдЧреНрд░реАрдЧреЗрдЯрд░) рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рд╕рдорд╛рди рдЧреЛрд▓рд╛рдВрдЧ рдХреЛрдб рдХреА рд╕реАрдкреАрдпреВ рдЦрдкрдд рдЯреАрдПрд╕рдкреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ 4-5 рдЧреБрдирд╛ рдХрдо рд╣реИред рдЧреЛрд▓рд╛рдВрдЧ рдХреЗ рд╕рд╛рде рдмреИрд╢ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдХрд╛рд░рдг рд░реИрдкрд░ рдХреА рдЧрддрд┐ рд▓рдЧрднрдЧ 16 рдЧреБрдирд╛ рд╣реЛ рдЧрдИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ (рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реАрдкреАрдпреВ рдУрд╡рд░рд╣реЗрдб 25%)ред рдЧреЛрд▓рд╛рдВрдЧ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИ рдпрд╣рд╛рдВ.

рд░реИрдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛

рд░реИрдкрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдордбреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╣рд╛рдВ). рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд░реИрдкрд░ рдХреЛ /opt/tsduck-stat/ рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ (go build tsduck-stat.go) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЛрдиреЛрдЯреЛрдирд┐рдХ рдШрдбрд╝реА (>=1.9) рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЧреЛрд▓рд╛рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ systemctl рд╕рдХреНрд╖рдо рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ [рдИрдореЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд]:1234 рдлрд┐рд░ systemctl рдкреНрд░рд╛рд░рдВрдн рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдБ [рдИрдореЗрд▓ рд╕рдВрд░рдХреНрд╖рд┐рдд]: 1234ред

рдЬрд╝реИрдмрд┐рдХреНрд╕ рд╕реЗ рдЦреЛрдЬ

рдЬрд╝реИрдмрд┐рдХреНрд╕ рдХреЛ рдЪрд╛рд▓реВ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕рдореВрд╣ рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ (discovery.sh), рдЬрд╝реИрдмрд┐рдХреНрд╕ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реИ - /opt/tsduck-stat рдореЗрдВред рдЬрд╝реИрдмрд┐рдХреНрд╕-рдПрдЬреЗрдВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╕реНрдХрд╡рд░реА рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ .conf рдлрд╝рд╛рдЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП zabbix-рдПрдЬреЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВред

рдЬрд╝реИрдмрд┐рдХреНрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ

рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ (tsduck_stat_template.xml) рдореЗрдВ рдСрдЯреЛрдбрд┐рд╕реНрдХрд╡рд░ рдирд┐рдпрдо, рдЖрдЗрдЯрдо рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рдЧреНрд░рд╛рдлрд╝ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЪреЗрдХрд▓рд┐рд╕реНрдЯ (рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛)

  1. рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЯреАрдПрд╕рдкреА "рдЖрджрд░реНрд╢" рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкреИрдХреЗрдЯ рдирд╣реАрдВ рдЧрд┐рд░рд╛рддрд╛ рд╣реИ (рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реАрдзреЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ), рдпрджрд┐ рдмреВрдВрджреЗрдВ рд╣реИрдВ, рддреЛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл 2 рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд▓реЗрдЦ рдХрд╛ рдкрд╛рда рджреЗрдЦреЗрдВред
  2. рдЕрдзрд┐рдХрддрдо рд╕реЙрдХреЗрдЯ рдмрдлрд╝рд░ рдХреЛ рдЯреНрдпреВрдирд┐рдВрдЧ рдХрд░реЗрдВ (net.core.rmem_max=8388608)ред
  3. tsduck-stat.go рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ (tsduck-stat.go рдмрдирд╛рдПрдВ)ред
  4. рд╕реЗрд╡рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ /lib/systemd/system рдореЗрдВ рд░рдЦреЗрдВред
  5. Systemctl рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛рдПрдБ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХрд╛рдЙрдВрдЯрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреЗ рд╣реИрдВ (grep "" /dev/shm/tsduck-stat/*)ред рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рд╕реНрдЯреНрд░реАрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдорд▓реНрдЯреАрдХрд╛рд╕реНрдЯ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╢рд╛рдпрдж rp_filter рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рдпрд╛ рд╕реНрд░реЛрдд рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдмрдирд╛рдПрдВред
  6. рдбрд┐рд╕реНрдХрд╡рд░реА.рд╢ рдЪрд▓рд╛рдПрдБ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ json рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
  7. рдЬрд╝реИрдмрд┐рдХреНрд╕ рдПрдЬреЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЬреЛрдбрд╝реЗрдВ, рдЬрд╝реИрдмрд┐рдХреНрд╕ рдПрдЬреЗрдВрдЯ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред
  8. рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдЬрд╝реИрдмрд┐рдХреНрд╕ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ рдЙрд╕ рд╣реЛрд╕реНрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬрд┐рд╕ рдкрд░ рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрд╝реИрдмрд┐рдХреНрд╕-рдПрдЬреЗрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рд▓рдЧрднрдЧ 5 рдорд┐рдирдЯ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рджреЗрдЦреЗрдВ рдХрд┐ рдирдП рдбреЗрдЯрд╛ рддрддреНрд╡, рдЧреНрд░рд╛рдлрд╝ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо

рдЖрдИрдкреА(рдЯреАрдПрд╕) рд╕реНрдЯреНрд░реАрдо рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЯреАрдПрд╕рдбрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдкреИрдХреЗрдЯ рд╣рд╛рдирд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рдЧрднрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдирд┐рдЧрд░рд╛рдиреА рди рдХрд░рдиреЗ рд╕реЗ рддреЛ рдмреЗрд╣рддрд░ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реАрдбрд┐рдпреЛ рдЕрдВрд╢реЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рддреЗ рд╕рдордп CC "рдиреБрдХрд╕рд╛рди" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд░реВрд╕реА рд╕рдВрдШ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЯреАрд╡реА рдХреЗрдВрджреНрд░реЛрдВ рдкрд░ рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рдд CC рдХрд╛рдЙрдВрдЯрд░ рдХреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд┐рдП рдмрд┐рдирд╛), рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╕рдорд╛рдзрд╛рди SCTE-35 рд▓реЗрдмрд▓ (рдпрджрд┐ рд╕реНрдЯреНрд░реАрдо рдЬрдирд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рджреВрд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдкрд░рд┐рд╡рд╣рди рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЬрд┐рдЯрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ (рдЖрдИрдПрдЯреА) рдХреА рдХрдореА рд╣реИред рдЯреАрд╡реА рдЙрдкрдХрд░рдг (рдЪрд╛рд╣реЗ рд╡рд╣ рдореЙрдбреНрдпреВрд▓реЗрдЯрд░ рд╣реЛ рдпрд╛ рдЕрдВрддрд┐рдо рдЙрдкрдХрд░рдг) рдореЗрдВ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЬрд┐рдЯрдмрдлрд░ рдХреЛ рдЕрдирдВрдд рддрдХ рдлреБрд▓рд╛рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЬрдм рдкрд╛рд░рдЧрдорди рдореЗрдВ рдмрдбрд╝реЗ рдмрдлрд╝рд░реНрд╕ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрдпреВрдУрдПрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдРрд╕реЗ рд░реАрдпрд▓рдЯрд╛рдЗрдо рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЬрд┐рдЯрд░ рддреИрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ