{"id":455,"date":"2022-02-21T21:19:54","date_gmt":"2022-02-21T13:19:54","guid":{"rendered":"https:\/\/www.fanyamin.com\/wordpress\/?p=455"},"modified":"2022-02-21T21:19:54","modified_gmt":"2022-02-21T13:19:54","slug":"%e6%8b%a5%e5%a1%9e%e6%8e%a7%e5%88%b6%e6%8a%80%e6%9c%af%e7%ac%94%e8%ae%b0%e4%ba%8c%ef%bc%9atransport-wide-congestion-control","status":"publish","type":"post","link":"https:\/\/www.fanyamin.com\/wordpress\/?p=455","title":{"rendered":"\u62e5\u585e\u63a7\u5236\u6280\u672f\u7b14\u8bb0\u4e8c\uff1aTransport wide Congestion control"},"content":{"rendered":"<table>\n<thead>\n<tr>\n<th><strong>Abstract<\/strong><\/th>\n<th>\u62e5\u585e\u63a7\u5236\u6280\u672f\u7684\u7b14\u8bb0\u4e8c: TWCC<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Authors<\/strong><\/td>\n<td><a href=\"https:\/\/www.fanyamin.com\">Walter Fan<\/a><\/td>\n<\/tr>\n<tr>\n<td>\u00a0<strong>Category<\/strong>\u00a0\u00a0\u00a0<\/td>\n<td>\u00a0learning\u00a0note\u00a0\u00a0<\/td>\n<\/tr>\n<tr>\n<td><strong>Status<\/strong><\/td>\n<td>WIP<\/td>\n<\/tr>\n<tr>\n<td><strong>Updated<\/strong><\/td>\n<td>2022-2-12<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>\u6982\u8ff0<\/h2>\n<p>\u524d\u9762\u56de\u987e\u62e5\u585e\u63a7\u5236\u7684\u4e00\u4e9b\u7406\u8bba <a href=\"https:\/\/www.jianshu.com\/p\/7a4f72016867\">\u62e5\u585e\u63a7\u5236\u6280\u672f\u7b14\u8bb0\u4e00: \u7406\u8bba\u7bc7<\/a>, \u63a5\u4e0b\u6765\u518d\u56de\u987e WebRTC \u4e2d\u5e94\u7528\u8f83\u5e7f\u7684 Google \u63d0\u51fa\u6765\u7684 GCC(Google Congestion Control), \u5b83\u6709\u4e24\u4e2a\u7248\u672c\uff1a<\/p>\n<ol>\n<li>GCC v1:  \u901a\u8fc7 RTP abs_send_time header \u548c RTCP REMB message \u6269\u5c55\uff0c\u57fa\u4e8e\u4e22\u5305\u548c\u5ef6\u8fdf\u4f30\u7b97\u5e26\u5bbd\u5360\u7528\u548c\u662f\u5426\u6709\u62e5\u585e\uff0c\u4ece\u800c\u8c03\u6574\u5a92\u4f53\u6d41\u7684\u53d1\u9001\u901f\u7387\uff0c\u4e3b\u8981\u7684\u4f30\u7b97\u548c\u51b3\u7b56\u5728\u63a5\u6536\u65b9\uff0c\u91c7\u7528\u4e86\u5361\u5c14\u66fc\u6ee4\u6ce2<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/upload-images.jianshu.io\/upload_images\/1598924-a076a174bc81e454.png?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240\" alt=\"gcc_v1_flow\" \/><\/p>\n<ol start=\"2\">\n<li>GCC v2: \u901a\u8fc7 RTP transport wide cc sn header \u548c RTCP transport feedback message \u6269\u5c55\uff0c\u57fa\u4e8e\u4e22\u5305\u548c\u5ef6\u8fdf\u4f30\u7b97\u5e26\u5bbd\u5360\u7528\u548c\u662f\u5426\u6709\u62e5\u585e\uff0c\u4ece\u800c\u8c03\u6574\u5a92\u4f53\u6d41\u7684\u53d1\u9001\u901f\u7387\uff0c\u4e3b\u8981\u7684\u4f30\u7b97\u548c\u51b3\u7b56\u5728\u53d1\u9001\u65b9\uff0c\u91c7\u7528\u4e86\u7ebf\u6027\u56de\u5f52\u548c\u6700\u5c0f\u4e8c\u4e58\u6cd5<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/upload-images.jianshu.io\/upload_images\/1598924-637b5531e9d71b7b.png?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240\" alt=\"gcc_v2_flow\" \/><\/p>\n<p>\u4e0b\u9762\u6765\u91cd\u70b9\u8bb2\u8bb2  GCC v2.  \u5b83\u9996\u5148\u5b9a\u4e49\u4e86\u5bf9 RTP \u5305\u5934\u548c RTCP \u53cd\u9988\u6d88\u606f\u7684\u6269\u5c55<\/p>\n<h2>RTP \u548c RTCP \u6269\u5c55<\/h2>\n<ol>\n<li>Transport wide sequence numbers header extension \u5728 RTP<br \/>\n\u5305\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u6269\u5c55\u5934\uff0c\u653e\u7f6e\u4f20\u8f93\u5c42\u9762\u7684\u5e8f\u53f7<\/li>\n<\/ol>\n<p>SDP \u5c5e\u6027\uff1a<\/p>\n<pre><code class=\"language-{.}\">a=extmap:5 http:\/\/www.ietf.org\/id\/draft-holmer-rmcat-transport-wide-cc-extensions-01<\/code><\/pre>\n<ol start=\"2\">\n<li>Transport Feedback \u589e\u52a0\u4e00\u4e2a RTCP<br \/>\n\u53cd\u9988\u6d88\u606f\uff0c\u7528\u6765\u53cd\u9988\u63a5\u6536\u5230\u7684\u6570\u636e\u5305\u53ca\u5176\u5ef6\u8fdf\u7684\u4fe1\u606f RTCP-Transport-FB,  \u9ed8\u8ba4\u53d1\u9001\u9891\u7387 1time\/100ms\uff0c\u540c\u65f6\u5176\u52a8\u6001\u9002\u5e94\u4f7f\u7528 5\uff05\u7684\u53ef\u7528\u5e26\u5bbd\uff0c\u6700\u5927\u9891\u7387\u503c\u4e3a 1time\/50ms\u3001\u6700\u5c0f\u9891\u7387\u503c\u4e3a 1time\/250ms\u3002\u4ee5 1time\/100ms \u7684\u9891\u7387\u53d1\u9001\uff0c\u5176\u6700\u5927\u9700\u8981\u8017\u8d39 16kbps \u5e26\u5bbd<\/li>\n<\/ol>\n<p>SDP \u5c5e\u6027\uff1a<\/p>\n<pre><code class=\"language-{.}\">a=rtcp-fb:100 transport-cc<\/code><\/pre>\n<h2>Transport-wide Sequence Number<\/h2>\n<p>\u5728\u6bcf\u4e2a\u8981\u53d1\u9001\u7684 RTP \u5305\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u6269\u5c55\u5934\uff0c\u5305\u542b 16 bits \u7684\u5e8f\u53f7 sequence number. \u5728\u540c\u4e00\u4e2a\u4f20\u8f93\u901a\u9053\u4e2d\uff0c\u6bcf\u53d1\u4e00\u4e2a RTP \u5305\uff0c\u8fd9\u4e2a\u5e8f\u53f7\u5c31\u52a0\u4e00<\/p>\n<pre><code class=\"language-{.}\">0                   1                   2                   3\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|       0xBE    |    0xDE       |           length=1            |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|  ID   | L=1   |transport-wide sequence number | zero padding  |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/code><\/pre>\n<h2>Transport-wide RTCP Feedback Message<\/h2>\n<pre><code class=\"language-{.}\">0                   1                   2                   3\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|V=2|P|  FMT=15 |    PT=205     |           length              |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                     SSRC of packet sender                     |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                      SSRC of media source                     |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|      base sequence number     |      packet status count      |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                 reference time                | fb pkt. count |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|          packet chunk         |         packet chunk          |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n.                                                               .\n.                                                               .\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|         packet chunk          |  recv delta   |  recv delta   |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n.                                                               .\n.                                                               .\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|           recv delta          |  recv delta   | zero padding  |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/code><\/pre>\n<ul>\n<li><strong>version (V)<\/strong>: 2 bits This field identifies the RTP version.  <strong>- RTP \u7684\u7248\u672c\uff0c\u5f53\u524d\u7248\u672c\u90fd\u662f 2.<\/strong><\/li>\n<li><strong>padding (P)<\/strong>: 1 bit If set, the padding bit indicates that the packet contains additional padding octets at the end that are not part of the control information but are included in the length field. <strong>- \u6307\u793a\u662f\u5426\u6709\u586b\u5145\u5185\u5bb9<\/strong><\/li>\n<li><strong>feedback message type (FMT)<\/strong>: 5 bits This field identifies the type of the FB message. It must have the value 15. <strong> - \u53cd\u9988\u6d88\u606f\u7c7b\u578b,  \u6839\u636eRFC4585 \u7684\u5b9a\u4e49\uff0c\u503c\u4e3a 15\uff0c \u542b\u4e49\u662f   Application layer FB (AFB) message \u5e94\u7528\u5c42\u53cd\u9988\u6d88\u606f<\/strong><\/li>\n<li><strong>payload type (PT)<\/strong>: 8 bits This is the RTCP packet type that identifies the packet as being an RTCP FB message. The value must be RTPFB = 205. <strong>- \u8377\u8f7d\u7c7b\u578b\uff0c\u6839\u636eRFC4585 \u7684\u5b9a\u4e49\uff0c\u503c\u4e3a 205\uff0c\u542b\u4e49\u662fTransport layer FB message \u4f20\u8f93\u5c42\u53cd\u9988\u6d88\u606f<\/strong><\/li>\n<li><strong>SSRC of packet sender<\/strong>: 32 bits The synchronization source identifier for the originator of this packet. <strong>- \u8fd9\u4e2a\u53cd\u9988\u6d88\u606f\u5305\u53d1\u8d77\u8005\u7684\u540c\u6b65\u6e90\u6807\u8bc6<\/strong><\/li>\n<li><strong>SSRC of media source<\/strong>: 32 bits The synchronization source identifier of the media source that this piece of feedback  information is related to. TODO: This is transport wide, do we just  pick any of the media source SSRCs? <strong>- \u8fd9\u4e2a\u53cd\u9988\u6d88\u606f\u5305\u5bf9\u5e94\u7684\u5a92\u4f53\u6d41\u7684\u540c\u6b65\u6e90\u6807\u8bc6\uff0c\u8fd9\u4e2a\u503c\u5f85\u786e\u5b9a\uff0c\u56e0\u4e3a\u8fd9\u662f\u4e00\u4e2a\u4f20\u8f93\u901a\u9053\u8303\u56f4\u7684\u53cd\u9988\uff0c\u8fd9\u4e2a\u503c\u5fc5\u8981\u6027\u4e0d\u5927\uff0c\u53ef\u4ee5\u968f\u610f\u9009\u53d6\u4e00\u4e2a media SSRC<\/strong><\/li>\n<li><strong>base sequence number<\/strong>: 16 bits The transport-wide sequence number of the first packet in this feedback. This number is not necessarily increased for every feedback; in the case of reordering it may be decreased.  <strong>- \u8be5 fb \u5305\u9996\u4e2a rtp \u5305\u7684 transport seq\uff0c\u975e rtp \u5305\u5e8f\u5217\u53f7\u3002<\/strong><\/li>\n<li><strong>packet status count<\/strong>: 16 bits The number of packets this feedback contains status for, starting with the packet identified by the base  sequence number.    <strong>- \u8be5 fb packet \u5305\u542b rtp \u5305\u4e2a\u6570\u3002<\/strong><\/li>\n<li><strong>reference time<\/strong>: 24 bits Signed integer indicating an absolute reference time in some (unknown) time base chosen by the sender of  the feedback packets. The value is to be interpreted in multiples of 64ms. The first recv delta in this packet is relative to the reference time. The reference time makes it possible to calculate  the delta between feedbacks even if some feedback packets are lost,  since it always uses the same time base. <strong>- \u53c2\u8003\u65f6\u95f4\uff0cfb \u5305\u9996\u4e2a rtp \u7684\u5230\u8fbe\u65f6\u95f4\/64<\/strong><\/li>\n<li><strong>feedback packet count<\/strong>: 8 bits A counter incremented by one for each feedback packet sent. Used to detect feedback packet losses. <strong>-   \u5df2\u53d1\u9001 feedback \u5305\u8ba1\u6570\u5668\uff0c\u53ef\u7528\u4e8e fb packet \u4e22\u5931\u68c0\u6d4b<\/strong><\/li>\n<li><strong>packet chunk<\/strong>: 16 bits A list of packet status chunks. These indicate  the status of a number of packets starting with the one identified  by base sequence number. See below for details. <strong> -   \u63cf\u8ff0 rtp \u5305 4 \u79cd\u72b6\u6001\uff08\u89c1\uff1a4.2\uff09\uff0c\u6709 Run Length Chunk \u548c Status Vector Chunk \u4e24\u79cd\u683c\u5f0f<\/strong><\/li>\n<li><strong>recv delta<\/strong>: 8 bits For each \\&quot;packet received\\&quot; status, in the  packet status chunks, a receive delta block will follow. See details   below. <strong>-   \u5f53 rtp \u5305\u7684\u72b6\u6001\u4e3a Packet received\uff0c\u901a\u8fc7 recv delta \u8bb0\u5f55\u5176\u4e0e\u524d\u4e00\u4e2a rtp \u5305\u5230\u8fbe\u7684\u65f6\u95f4\u95f4\u9694\u3002<\/strong><\/li>\n<\/ul>\n<h3>Rtp Packet Status<\/h3>\n<p>\u5305\u7684\u72b6\u6001 (Packet Status) \u8868\u793a\u4e3a 2 \u4e2a\u6bd4\u7279\u7684\u7b26\u53f7\uff1a<\/p>\n<ul>\n<li>00 Packet not received \uff08\u5305\u672a\u6536\u5230\uff09<\/li>\n<li>01 Packet received, small delta \uff08\u5305\u6536\u5230\uff0c\u95f4\u9694\u65f6\u95f4\u5f88\u5c0f \uff09<\/li>\n<li>10 Packet received, large or negative delta\uff08<br \/>\n\u5305\u6536\u5230\uff0c\u95f4\u9694\u65f6\u95f4\u5f88\u5927\u6216\u8005\u4e3a\u8d1f\u6570\uff09<\/li>\n<li>11 [Reserved], packet received, w\/o recv delta<br \/>\n(\u5305\u6536\u5230\u4e86\uff0c\u4f46\u662f\u6ca1\u6709\u95f4\u9694\u65f6\u95f4)<\/li>\n<\/ul>\n<h3>Packet chunk<\/h3>\n<p>packet chunk \u5bf9 rtp \u7684\u5230\u8fbe\u72b6\u6001\u8fdb\u884c\u63cf\u8ff0\uff0c\u5b83\u6709\u4e24\u79cd\u7c7b\u578b<\/p>\n<ul>\n<li>Run Length Chunk<\/li>\n<li>Status Vector Chunk<\/li>\n<\/ul>\n<p>\u901a\u8fc7\u7b2c\u4e00\u4e2a\u6bd4\u7279\u4f4d\u6807\u8bc6\u4e86\u662f\u54ea\u79cd\u7c7b\u578b<\/p>\n<ul>\n<li>0 \uff1aRun Length Chunk<\/li>\n<li>1 \uff1aStatus Vector Chunk<\/li>\n<\/ul>\n<h4>Run Length Chunk<\/h4>\n<pre><code class=\"language-{.}\">0                   1\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|T| S |       Run Length        |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/code><\/pre>\n<p>\u5b57\u6bb5\u542b\u4e49\u5982\u4e0b<\/p>\n<ul>\n<li>T (1 bit) : chunk type\uff0c\u5f53\u4e3a Run Length Chunk \uff0c\u6b64\u65f6\u503c\u4e3a 0\u3002<\/li>\n<li>S (1 bit) \uff1apacket status symbo\uff0c2 bits \uff0c\u8868\u793a\u5305\u7684\u5230\u8fbe\u72b6\u6001<\/li>\n<li>Run Length (13 bit) \uff1a\u8868\u793a\u591a\u5c11\u4e2a\u8fde\u7eed\u5305\u7684\u72b6\u6001<\/li>\n<\/ul>\n<p>\u4f8b 1\uff1a<\/p>\n<pre><code class=\"language-{.}\">0                   1\n 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|0|0 0|0 0 0 0 0 1 1 0 1 1 1 0 1|\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n00 \u4ee3\u8868\u5305\u672a\u6536\u5230 &quot;packet not received&quot; \u540e\u976213\u4e2a\u6bd4\u7279\u503c\u4e3a 221\uff0c\u8868\u793a221\u4e2a\u5305\u672a\u6536\u5230<\/code><\/pre>\n<p>\u4f8b 2:<\/p>\n<pre><code class=\"language-{.}\">0                   1\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|0|1 1|0 0 0 0 0 0 0 0 1 1 0 0 0|\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n11 \u4ee3\u8868 &quot;packet received, w\/o recv delta&quot; \uff0c\u5171\u6709 24 \u4e2a\u5305\uff0c\u4e0d\u8fc7\u6ca1\u6709\u95f4\u9694\u65f6\u95f4\u6570\u636e<\/code><\/pre>\n<h4>Status Vector Chunk<\/h4>\n<pre><code class=\"language-{.}\">0                   1\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|T|S|       symbol list         |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<\/code><\/pre>\n<ul>\n<li>T(1 bit): chunk type\uff0c \u5f53\u4e3a Status Vector Chunk \uff0c\u6b64\u65f6\u503c\u4e3a 1\u3002<\/li>\n<li>S(1 bit): symbol size \u7b26\u53f7\u957f\u5ea6\uff0c0 \u8868\u793a\u7b26\u53f7\u957f\u5ea6\u4e3a 14\uff0c 1<br \/>\n\u8868\u793a\u7b26\u53f7\u957f\u5ea6\u4e3a 7<\/li>\n<li>Symbol list(14 bits)\uff0c\u7b26\u53f7\u8868\uff0c\u63cf\u8ff0\u4e86 x \u4e2a\u5305\u7684\u5230\u8fbe\u72b6\u6001\uff0cx<br \/>\n\u7684\u6570\u91cf\u53d6\u51b3\u4e8e S \u7684\u503c\uff0c<\/p>\n<ul>\n<li>\u5f53 S = 0 \u65f6 x = 14\uff0c\u6bcf\u4e2a\u7b26\u53f7\u4e3a 1 \u4e2a\u6bd4\u7279\uff0c 0 \u4ee3\u8868\u6ca1\u6536\u5230\uff0c1<br \/>\n\u4ee3\u8868\u6536\u5230\u4e86<\/li>\n<li>\u5f53 S = 1 \u65f6 x = 7\uff0c \u6bcf\u4e2a\u7b26\u53f7\u4e3a 2 \u4e2a\u6bd4\u7279\uff0c 00\uff0c01\uff0c10\uff0c11<br \/>\n\u8868\u793a\u5305\u7684\u72b6\u6001<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u4f8b 1:<\/p>\n<p>\u8fd9\u5757\u6570\u636e\u4e2d S = 0 \uff0c\u5305\u542b\u4e86 14 \u4e2a\u5305\u7684\u72b6\u6001\uff0c\u7528 14 \u4e2a\u6bd4\u7279\u4f4d\u63cf\u8ff0\uff0c 0 \u4ee3\u8868\u6ca1\u6536\u5230\uff0c1 \u4ee3\u8868\u6536\u5230\u4e86<\/p>\n<pre><code class=\"language-{.}\">1x &quot;packet not received&quot; - \u7b2c\u4e00\u4e2a\u5305\u6ca1\u6536\u5230\n5x &quot;packet received&quot;     - \u4e4b\u540e 5 \u4e2a\u5305\u6536\u5230\u4e86\n3x &quot;packet not received&quot; - \u4e4b\u540e 3 \u4e2a\u5305\u6ca1\u6536\u5230\n3x &quot;packet received&quot;     - \u4e4b\u540e 3 \u4e2a\u5305\u6536\u5230\u4e86\n2x &quot;packet not received&quot; - \u4e4b\u540e 2 \u4e2a\u5305\u6ca1\u6536\u5230<\/code><\/pre>\n<p>\u4f8b 2:<\/p>\n<p>\u8fd9\u5757\u6570\u636e\u4e2d S = 1 \uff0c\u5305\u542b\u4e86 7 \u4e2a\u5305\u7684\u72b6\u6001\uff0c\u6bcf\u4e2a\u5305\u7528 2 \u4e2a\u6bd4\u7279\u6765\u63cf\u8ff0<\/p>\n<pre><code class=\"language-{.}\">1x &quot;packet not received&quot;\n\n1x &quot;packet received, w\/o timestamp&quot;\n\n3x &quot;packet received&quot;\n\n2x &quot;packet not received&quot;<\/code><\/pre>\n<h2>Receive Delta<\/h2>\n<p><strong>Receive Delta<\/strong> \u957f\u5ea6\u4e3a\u4e00\u4e2a\u5b57\u8282\u6216\u4e24\u4e2a\u5b57\u8282,\u8bb0\u5f55\u6bcf\u4e2a\u5305\u4e0e\u4e4b\u524d\u6536\u5230\u7684\u5305\u7684\u95f4\u9694\u65f6\u95f4, \u5b83\u662f 250us \u7684\u500d\u6570 \u56e0\u4e3a <strong>reference_time<\/strong> \u662f\u5f53\u524d\u5305\u7ec4\u7b2c\u4e00\u4e2a packet \u5230\u8fbe\u7684\u65f6\u95f4,, \u6240\u4ee5:<\/p>\n<pre><code class=\"language-{.}\">1st arrive_time = reference_time + receive_delta\n2nd arrtive_time = 1st arrive_time + receive_delta<\/code><\/pre>\n<p>\u5f53\u5305\u7684\u72b6\u6001\u4e3a Packet received\uff0c\u6b64\u65f6 fb packet \u4f1a\u901a\u8fc7 Receive Delta<br \/>\n\u8bb0\u5f55\u5176\u4e0e\u524d\u4e00\u4e2a RTP \u5305\u5230\u8fbe\u65f6\u95f4\u7684\u95f4\u9694\uff0c\u5355\u4f4d\u662f 250us.<\/p>\n<ul>\n<li>\u5f53\u72b6\u6001\u662f \\&quot;Packet received, small delta\\&quot;\uff0c\u7528 8-bit unsigned \u5b58\u50a8<br \/>\ndelta, \u9644\u52a0\u5728 packet status list \u4e4b\u540e\uff0c \u6b64\u65f6 delta \u53d6\u503c\u4e3a<br \/>\n[[0,255] * 250]{.title-ref} , \u8868\u793a\u8303\u56f4\u4e3a [0, 63.75] ms.<\/li>\n<li>\u5f53\u72b6\u6001\u662f \\&quot;Packet received, large or negative delta\\&quot;\uff0c\u7528 16-bit<br \/>\nsigned \u5b58\u50a8 delta\uff0c\u9644\u52a0\u5728 packet status list \u4e4b\u540e, \u6b64\u65f6 delta \u53d6\u503c\u4e3a<br \/>\n[[-32767, 32768] * 250]{.title-ref}, \u8868\u793a\u8303\u56f4\u4e3a [-8192.0,<br \/>\n8191.75] ms.<\/li>\n<li>\u5982\u679c\u95f4\u9694\u65f6\u95f4\u592a\u5927,\u5c31\u9700\u8981\u542f\u7528\u4f7f\u7528\u65b0\u7684 RTCP feedback<br \/>\n\u5305\u4e86\uff0c\u4e0d\u8fc7\u4e00\u822c\u4e5f\u4e0d\u4f1a\u6709\u8fd9\u4e48\u5927\u7684\u5ef6\u8fdf\uff0c\u9664\u975e\u7f51\u7edc\u4e2d\u65ad\u4e86\u3002<\/li>\n<\/ul>\n<h2>\u57fa\u4e8e\u5ef6\u8fdf\u7684\u53d1\u9001\u7aef\u62e5\u585e\u63a7\u5236<\/h2>\n<p>\u53d1\u9001\u7aef\u5e26\u5bbd\u4f30\u8ba1\u7684\u57fa\u672c\u6846\u67b6\u548c\u4e4b\u524d\u7248\u672c\u7684\u63a5\u6536\u7aef\u7684\u6846\u67b6\u7c7b\u4f3c<\/p>\n<p>1)  Pre-filtering: \u8fc7\u6ee4\u6389\u5f53\u7f51\u7edc\u53d1\u751f\u4e2d\u65ad\u6216\u4e00\u4e9b\u7a81\u53d1\u60c5\u51b5, \u589e\u52a0\u4e86\u5728\u5f02\u5e38\u60c5\u51b5\u4e0b\u7684\u5e26\u5bbd\u4fa6\u6d4b\u548c\u8bc4\u4f30<br \/>\n2)  Arrival-time filter: \u7531\u4e4b\u524d\u91c7\u7528\u7684 Kalman Filter \u6539\u6210\u4e86 Trendline filter<br \/>\n3)  Over-use detector: \u4e0e\u9884\u8bbe\u7684\u9608\u503c\u8fdb\u884c\u6bd4\u8f83, \u68c0\u6d4b\u662f\u5426\u6709\u62e5\u585e<br \/>\n4)  Rate control : \u8fdb\u884c\u53d1\u9001\u901f\u7387\u7684\u8c03\u6574, \u53ef\u91c7\u7528 TCP \u4e2d\u4f7f\u7528\u7684AIMD(\u52a0\u589e\u4e58\u51cf\u6cd5)<\/p>\n<h2>\u57fa\u672c\u6d41\u7a0b<\/h2>\n<ol>\n<li>\n<p>\u53d1\u9001\u7aef\u4e3a\u6bcf\u4e2a RTP \u5305\u6dfb\u52a0 transport wide sequence number \u6269\u5c55\u5934,<br \/>\n\u5b83\u662f\u4e00\u4e2a\u4f20\u8f93\u901a\u9053\u8303\u56f4\u7684\u5e8f\u53f7<\/p>\n<\/li>\n<li>\n<p>\u53d1\u9001\u7aef\u4fdd\u5b58\u8fd9\u4e2a\u5e8f\u53f7\u548c\u76f8\u5e94\u7684\u53d1\u9001\u65f6\u95f4 send_time<\/p>\n<\/li>\n<li>\n<p>\u63a5\u6536\u7aef\u8bb0\u5f55 RTP \u5305\u7684\u5230\u8fbe\u72b6\u6001 packet<br \/>\nstatus(\u662f\u5426\u5230\u8fbe,\u5230\u8fbe\u65f6\u95f4),\u5e76\u6784\u9020\u4e00\u4e2a transport wide cc RTCP feedback<br \/>\n\u6d88\u606f, \u53d1\u56de\u7ed9\u53d1\u9001\u65b9<\/p>\n<\/li>\n<li>\n<p>\u53d1\u9001\u7aef\u5c06\u8fd9\u4e9b RTP \u5305\u7684\u53d1\u9001\u65f6\u95f4 send_time, \u5230\u8fbe\u65f6\u95f4 arrive_time<br \/>\n\u53d6\u51fa\u6765, \u5e76\u5c06\u5b83\u4eec\u5206\u7ec4(\u4ee5 5ms \u957f\u5ea6)<\/p>\n<\/li>\n<li>\n<p>\u53d1\u9001\u7aef\u8ba1\u7b97 group one way delay variant \u5305\u7ec4\u7684\u5355\u5411\u5ef6\u8fdf\u53d8\u5316<\/p>\n<\/li>\n<\/ol>\n<blockquote>\n<ul>\n<li>g_i: the last packet arriving time of i-th packet group<\/li>\n<li>G_i: the first packet sending time of i-th packet group<\/li>\n<li>recv_delta_ms = g_i - [g](){i-1}<\/li>\n<li>send_delta_ms = G_i - [G](){i-1}<\/li>\n<li>delta_ms = recv_delta_ms - send_delta_ms<\/li>\n<\/ul>\n<\/blockquote>\n<ol start=\"5\">\n<li>\u8ba1\u7b97\u7d2f\u8ba1\u5ef6\u8fdf\u53d8\u5316<\/li>\n<\/ol>\n<p>$$accumulated_delay<em>i = \\sum<\/em>{j-1}^{i} delta_ms_{j}$$<\/p>\n<ol start=\"6\">\n<li>\u5c06\u7d2f\u79ef\u5ef6\u8fdf\u53d8\u5316\u8fdb\u884c\u6307\u6570\u5e73\u6ed1 exponential backoff filter<\/li>\n<\/ol>\n<p>$$smoothed_delay<em>i = smoothing_coef * smoothed_delay<\/em>{i-1} + (1 - smoothing_coef) * accumulated_delay_i$$<\/p>\n<ol start=\"7\">\n<li>\u4ee5\u5230\u8fbe\u65f6\u95f4\u4e3a\u6a2a\u8f74, \u5ef6\u8fdf\u53d8\u5316\u4e3a\u7eb5\u8f74\u8fdb\u884c\u7ebf\u6027\u56de\u5f52,  \u8ba1\u7b97\u5176\u62df\u5408\u51fa\u7684\u8d8b\u52bf\u7ebf\u7684\u659c\u7387 slope<\/li>\n<\/ol>\n<ul>\n<li>x \u8f74\u4e3a arrive_time_ms_i, \u5e76\u4e0d\u662f\u7b2c i \u4e2a\u5305\u7ec4\u7684\u5230\u8fbe\u65f6\u95f4, \u800c\u662f \u7b2c i \u4e2a\u5305\u7ec4\u6700\u540e\u4e00\u4e2a\u5305\u7684\u5230\u8fbe\u65f6\u95f4\u51cf\u53bb\u7b2c\u4e00\u4e2a\u5305\u7ec4\u7684\u6700\u540e\u4e00\u4e2a\u5305\u7684\u5230\u8fbe\u65f6\u95f4 <\/li>\n<li>y \u8f74\u4e3a smoothed_delay_ms_i, \u5373\u4e0a\u800c\u7b97\u51fa\u7684\u5e73\u6ed1\u7d2f\u8ba1\u5ef6\u8fdf\u53d8\u5316<\/li>\n<\/ul>\n<p>$$slope =  \\sum (x<em>i-x<\/em>{avg})(y<em>i-y<\/em>{avg}) \/ \\sum (x<em>i-x<\/em>{avg})^2$$<\/p>\n<ol start=\"8\">\n<li>\u5c06\u8ba1\u7b97\u51fa\u6765\u7684\u659c\u7387\u4e0e\u4e00\u4e2a\u52a8\u6001\u9608\u503c\u8fdb\u884c\u6bd4\u8f83, \u6765\u53d1\u73b0\u901a\u9053\u662f\u5426\u6709\u62e5\u585e<\/li>\n<\/ol>\n<p>\u6bcf\u6b21\u63a5\u6536\u5230\u89c6\u9891\u5e27 $t_i$ \u65f6\uff0c\u8fc7\u5ea6\u4f7f\u7528\u68c0\u6d4b\u5668\u90fd\u4f1a\u4ea7\u751f\u4e00\u4e2a\u4fe1\u53f7 s\uff0c\u8be5\u4fe1\u53f7\u57fa\u4e8e\u6392\u961f\u5ef6\u8fdf\u68af\u5ea6 $m(t_i)$ \u548c\u9608\u503c $\\gamma$ \u6765\u9a71\u52a8 FSM (\u4e0b\u9762\u7684\u6709\u9650\u72b6\u6001\u673a) \u7684\u72b6\u6001 $\\sigma$\uff1a<\/p>\n<ul>\n<li>\n<p>\u5f53 $m(t<em>i) &gt; \\gamma$ \u65f6\uff0c\u7b97\u6cd5\u901a\u8fc7\u589e\u52a0\u5e27\u95f4\u9694\u65f6\u95f4 $\\Delta T$ \u7684\u53d8\u91cf $t<\/em>{OU}$ \u6765\u8ddf\u8e2a\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u82b1\u8d39\u7684\u65f6\u95f4\u3002 \u5f53 $t<em>{OU}$ \u8fbe\u5230 $\\bar{t}<\/em>{OU}=100ms$ \u4e14 $m(t<em>i) &gt; m(t<\/em>{i-1})$` \u65f6\uff0c\u4ea7\u751f\u8fc7\u5ea6\u4f7f\u7528\u4fe1\u53f7\u3002<\/p>\n<\/li>\n<li>\n<p>\u53e6\u4e00\u65b9\u9762\uff0c\u5982\u679c $m(t_i)$ \u51cf\u5c0f\u5230 $\\gamma$ \u4ee5\u4e0b\uff0c\u5219\u4ea7\u751f\u672a\u5145\u5206\u5229\u7528\u4fe1\u53f7\uff0c\u800c\u5f53 $-\\gamma \\leq m(t_i) \\leq \\gamma$ \u65f6\u89e6\u53d1\u6b63\u5e38\u4fe1\u53f7\u3002<\/p>\n<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/upload-images.jianshu.io\/upload_images\/1598924-3f9030f1eca62ce9.png?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240\" alt=\"\" \/><\/p>\n<ol start=\"9\">\n<li>\u6839\u636e\u4ee5\u4e0a\u7684\u68c0\u6d4b\u7ed3\u679c, \u8c03\u6574\u53d1\u9001\u901f\u7387, GCC \u91c7\u7528 AIMD \u7b97\u6cd5<\/li>\n<\/ol>\n<p>AIMD \u7b97\u6cd5\u6765\u6e90\u4e8e TCP \u534f\u8bae,\u53c2\u89c1 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Additive_increase\/multiplicative_decrease\">https:\/\/en.wikipedia.org\/wiki\/Additive_increase\/multiplicative_decrease<\/a><\/p>\n<p>\u901f\u7387\u63a7\u5236\u5206\u4e3a\u4e24\u90e8\u5206,<\/p>\n<p>1)  \u6839\u636e\u5ef6\u8fdf delay \u6765\u8c03\u6574\u5e26\u5bbd\u4f30\u8ba1,\u6216\u79f0\u53d1\u9001\u901f\u7387<br \/>\n2)  \u6839\u636e\u4e22\u5305 loss \u6765\u8c03\u6574\u5e26\u5bbd\u4f30\u8ba1,\u6216\u79f0\u53d1\u9001\u901f\u7387<\/p>\n<p>\u6700\u7ec8\u4f1a\u7efc\u5408\u6bd4\u8f83 $A_d$ \u548c $A_l$, \u5373\u4e24\u8005\u4e4b\u95f4\u7684\u4e00\u4e2a\u6700\u5c0f\u503c\u6b64<\/p>\n<ul>\n<li>\u4ee5\u4e0b\u4e3a\u5176\u72b6\u6001\u8f6c\u6362\u56fe, \u7a7a\u767d\u5355\u5143\u8868\u793a\u7ef4\u6301\u5f53\u524d\u72b6\u6001<\/li>\n<\/ul>\n<pre><code class=\"language-{.}\">+----+--------+-----------+------------+--------+\n|     \\ State |   Hold    |  Increase  |Decrease|\n|      \\      |           |            |        |\n| Signal\\     |           |            |        |\n+--------+----+-----------+------------+--------+\n|  Over-use   | Decrease  |  Decrease  |        |\n+-------------+-----------+------------+--------+\n|  Normal     | Increase  |            |  Hold  |\n+-------------+-----------+------------+--------+\n|  Under-use  |           |   Hold     |  Hold  |\n+-------------+-----------+------------+--------+<\/code><\/pre>\n<h2>\u5176\u4ed6\u7b97\u6cd5\u7ec6\u8282<\/h2>\n<h3>\u52a8\u6001\u9608\u503c\u7684\u751f\u6210<\/h3>\n<p>\u4e3a\u907f\u514d\u8def\u7531\u961f\u5217\u8fc7\u5c0f\u6216\u7531\u4e8e\u5e76\u53d1\u7684TCP flow \u7ade\u4e89\u6240\u9020\u6210\u7684\u9965\u997f, \u8fd9\u4e2a\u9608\u503c\u7684\u8bbe\u7f6e\u5f88\u5173\u952e. \u9608\u503c\u5982\u679c\u592a\u5c0f\u4f1a\u5bf9\u4e8e\u7f51\u7edc\u7684\u77ac\u65f6\u5e72\u6270\u8fc7\u4e8e\u654f\u611f, \u5982\u679c\u592a\u5927\u5219\u4f1a\u53cd\u5e94\u592a\u8fdf\u949d, \u5f88\u96be\u8bbe\u7f6e\u4e00\u4e2a\u5408\u9002\u7684\u503c. GCC v2 \u91c7\u7528\u4e86\u4e00\u79cd\u5728 GCC v1 \u4e2d\u5b9a\u4e49\u7684\u81ea\u9002\u5e94\u7684\u9608\u503c Adaptive threshold<\/p>\n<p>$$\\gamma (t<em>i) = \\gamma(t<\/em>{i\u22121}) + \\Delta T \u00b7 k_\\gamma (t_i)(|m(t_i)| \u2212 \\gamma(t{i\u22121}))$$<\/p>\n<p>\u8fd9\u91cc\u7684 $\\Delta T$ \u662f\u6307 $t<em>i - t<\/em>{i-1}$, $t_i$ \u662f\u7b2c i-th \u5305\u5230\u8fbe\u7684\u65f6\u95f4<\/p>\n<p>$\\gamma(t_i)$ \u4ee3\u8868\u9608\u503c $m(t<em>i)$ \u4ee3\u8868\u8d8b\u52bf\u659c\u7387 $k<\/em>\\gamma$ \u4ee3\u8868\u9608\u503c\u8c03\u6574\u7cfb\u6570, \u5b9a\u4e49\u5982\u4e0b:<\/p>\n<p>$$\\begin{aligned}<br \/>\nk_\\gamma (t_i) = \\begin{cases}<br \/>\n&amp; \\text{ k_d if } |m(t<em>i)|  &lt; \\gamma (t<\/em>{i-1}) \\<br \/>\n&amp; \\text{ k_u if } otherwise<br \/>\n\\end{cases}<br \/>\n\\end{aligned}$$<\/p>\n<p>\u5728 GCC \u8349\u6848\u4e2d $k_d$ \u53d6\u503c\u4e3a 0.00018, $k_u$ \u53d6\u503c\u4e3a 0.01<\/p>\n<h3>\u6307\u6570\u5e73\u6ed1\u7b97\u6cd5\u548c\u6700\u5c0f\u4e8c\u4e58\u6cd5<\/h3>\n<p>\u901a\u8fc7\u5bf9\u63a5\u6536\u548c\u53d1\u9001\u7684\u5ef6\u8fdf\u7684\u53d8\u5316\uff0c\u8ba1\u7b97\u62e5\u585e\u5ef6\u8fdf\u7684\u53d8\u5316\u8d8b\u52bf\u7684\u659c\u7387 (slope), \u7528\u5230\u4e86\u6307\u6570\u5e73\u6ed1\u7b97\u6cd5\u548c\u6700\u5c0f\u4e8c\u4e58\u6cd5<\/p>\n<h4>EWMA\uff08Exponentially Weighted Moving Average \uff09<\/h4>\n<p>EWMA \u6307\u6570\u52a0\u6743\u79fb\u52a8\u5e73\u6ed1\u6cd5\uff08Exponential Smoothing\uff09\u662f\u5728\u79fb\u52a8\u5e73\u5747\u6cd5\u57fa\u7840\u4e0a\u53d1\u5c55\u8d77\u6765\u7684\u4e00\u79cd\u65f6\u95f4\u5e8f\u5217\u5206\u6790\u9884\u6d4b\u6cd5.<\/p>\n<p>\u5177\u4f53\u89e3\u91ca\u53c2\u89c1<br \/>\n<a href=\"https:\/\/www.itl.nist.gov\/div898\/handbook\/pmc\/section4\/pmc431.htm\">https:\/\/www.itl.nist.gov\/div898\/handbook\/pmc\/section4\/pmc431.htm<\/a><\/p>\n<p>$$S<em>t = \\alpha y<\/em>{t-1} + (1-\\alpha)S_{t-1} \\,\\,\\,\\,\\,\\,\\, 0 &lt; \\alpha \\le 1 \\,\\,\\,\\,\\,\\,\\, t \\ge 3 \\, .$$<\/p>\n<h4>\u6700\u5c0f\u4e8c\u4e58\u6cd5(Least Squars Method)<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/upload-images.jianshu.io\/upload_images\/1598924-5970c77b1ddafb38.png?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240\" alt=\"\" \/><\/p>\n<p>\u8fd9\u4e2a\u659c\u7387\u5c31\u662f\u4f9d\u636e\u516c\u5f0f\u8ba1\u7b97\u5f97\u6765<\/p>\n<p>$$k = \\sum (x<em>i-x<\/em>{avg})(y<em>i-y<\/em>{avg}) \/ \\sum (x<em>i-x<\/em>{avg})^2$$<\/p>\n<p>\u66f4\u591a\u4ee3\u7801\u5206\u6790\u53c2\u89c1 \u201c\u62e5\u585e\u63a7\u5236\u6280\u672f\u7b14\u8bb0\u4e09\uff1a GCC \u5728 WebRTC \u4e2d\u7684\u5b9e\u73b0\u201d<\/p>\n<h2>\u53c2\u8003\u8d44\u6599<\/h2>\n<ul>\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-holmer-rmcat-transport-wide-cc-extensions-01\">RTP Extensions for Transport-wide Congestion Control (draft-holmer-rmcat-transport-wide-cc-extensions-01)<\/a><\/li>\n<li><a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-ietf-rmcat-gcc-02\">A Google Congestion Control Algorithm for Real-Time  Communication<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Abstract \u62e5\u585e\u63a7\u5236\u6280\u672f\u7684\u7b14\u8bb0\u4e8c: TWCC Authors Walter Fan \u00a0Category\u00a0\u00a0\u00a0 \u00a0learning\u00a0note\u00a0\u00a0 Status WIP Updated 2022-2-12 \u6982\u8ff0 \u524d\u9762\u56de\u987e\u62e5\u585e\u63a7\u5236\u7684\u4e00\u4e9b\u7406\u8bba \u62e5\u585e\u63a7\u5236\u6280\u672f\u7b14\u8bb0\u4e00: \u7406\u8bba\u7bc7, \u63a5\u4e0b\u6765\u518d\u56de\u987e WebRTC \u4e2d\u5e94\u7528\u8f83\u5e7f\u7684 Google \u63d0\u51fa\u6765\u7684 GCC(Google Congestion Control), \u5b83\u6709\u4e24\u4e2a\u7248\u672c\uff1a GCC v1: \u901a\u8fc7 RTP abs_send_time header \u548c RTCP REMB message \u6269\u5c55\uff0c\u57fa\u4e8e\u4e22\u5305\u548c\u5ef6\u8fdf\u4f30\u7b97\u5e26\u5bbd\u5360\u7528\u548c\u662f\u5426\u6709\u62e5\u585e\uff0c\u4ece\u800c\u8c03\u6574\u5a92\u4f53\u6d41\u7684\u53d1\u9001\u901f\u7387\uff0c\u4e3b\u8981\u7684\u4f30\u7b97\u548c\u51b3\u7b56\u5728\u63a5\u6536\u65b9\uff0c\u91c7\u7528\u4e86\u5361\u5c14\u66fc\u6ee4\u6ce2 GCC v2: \u901a\u8fc7 RTP transport wide cc sn header \u548c RTCP transport feedback message \u6269\u5c55\uff0c\u57fa\u4e8e\u4e22\u5305\u548c\u5ef6\u8fdf\u4f30\u7b97\u5e26\u5bbd\u5360\u7528\u548c\u662f\u5426\u6709\u62e5\u585e\uff0c\u4ece\u800c\u8c03\u6574\u5a92\u4f53\u6d41\u7684\u53d1\u9001\u901f\u7387\uff0c\u4e3b\u8981\u7684\u4f30\u7b97\u548c\u51b3\u7b56\u5728\u53d1\u9001\u65b9\uff0c\u91c7\u7528\u4e86\u7ebf\u6027\u56de\u5f52\u548c\u6700\u5c0f\u4e8c\u4e58\u6cd5 \u4e0b\u9762\u6765\u91cd\u70b9\u8bb2\u8bb2 GCC v2. \u5b83\u9996\u5148\u5b9a\u4e49\u4e86\u5bf9 [&hellip;] <a class=\"read-more\" href=\"https:\/\/www.fanyamin.com\/wordpress\/?p=455\" title=\"Permanent Link to: \u62e5\u585e\u63a7\u5236\u6280\u672f\u7b14\u8bb0\u4e8c\uff1aTransport wide Congestion control\">&rarr;Read&nbsp;more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-455","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/455"}],"collection":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=455"}],"version-history":[{"count":1,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":456,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions\/456"}],"wp:attachment":[{"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fanyamin.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}