-
QUIC RTT ⇄{fmtMs(m['rtt.p50'])}悬停看 p95 / p99
+
+ RTT ⇄
+ QUIC {fmtMs(m['rtt.p50'])}
+ TCP {fmtMs(m['tcp.rtt.p50'])}
+ 悬停看 p95 / p99
{series.error ? 数据未更新 : null}
-
- {dialer} → {listener}
- {upText}
-
-
- {(s ? lossUp : Array.from({ length: common.cells }, () => null)).map((value, i) => (
-
- ))}
-
+
{dialer} → {listener}
+ {row('up-quic', 'QUIC', '去程丢包', m['loss.up'], lossText(m['loss.up']), lossUp)}
+ {row('up-tcp', 'TCP', '去程重传', m['tcp.retrans.up'], retransText(m['tcp.retrans.up']), retransUp)}
-
- {listener} → {dialer}
- {downText}
-
-
- {(s ? lossDown : Array.from({ length: common.cells }, () => null)).map((value, i) => (
-
- ))}
-
-
-
-
- TCP RTT ⇄{fmtMs(m['tcp.rtt.p50'])}
-
-
-
-
- {dialer} → {listener}
- {retransText(retransUpValue)}
-
-
- {(s ? retransUp : Array.from({ length: common.cells }, () => null)).map((value, i) => (
-
- ))}
-
-
-
-
- {listener} → {dialer}
- {retransText(retransDownValue)}
-
-
- {(s ? retransDown : Array.from({ length: common.cells }, () => null)).map((value, i) => (
-
- ))}
-
+
{listener} → {dialer}
+ {row('down-quic', 'QUIC', '回程丢包', m['loss.down'], lossText(m['loss.down']), lossDown)}
+ {row('down-tcp', 'TCP', '回程重传', m['tcp.retrans.down'], retransText(m['tcp.retrans.down']), retransDown)}
diff --git a/web/display/src/display.css b/web/display/src/display.css
index 440fcb4..46ab000 100644
--- a/web/display/src/display.css
+++ b/web/display/src/display.css
@@ -1388,15 +1388,13 @@
}
.line-mini-quic-head > span,
-.line-mini-direction-head > span:first-child,
-.line-mini-tcp-head > span:first-child {
+.line-mini-direction-head > span:first-child {
color: var(--app-ink-muted);
font-size: 10px;
font-weight: 600;
}
-.line-mini-quic-head > strong,
-.line-mini-tcp-head > strong {
+.line-mini-quic-head strong {
color: var(--app-ink);
font-size: 14px;
font-weight: 700;
@@ -1410,15 +1408,13 @@
white-space: nowrap;
}
-.line-mini-direction,
-.line-mini-tcp {
+.line-mini-direction {
display: grid;
gap: 3px;
min-width: 0;
}
-.line-mini-direction-head,
-.line-mini-tcp-head {
+.line-mini-direction-head {
display: flex;
align-items: baseline;
gap: 6px;
@@ -1426,33 +1422,43 @@
line-height: 1.25;
}
-.line-mini-direction-head > span:first-child,
-.line-mini-tcp-head > span:first-child {
+.line-mini-direction-head > span:first-child {
font-weight: 500;
white-space: nowrap;
}
-.line-mini-direction-head .line-mini-badge,
-.line-mini-tcp-head .line-mini-badge {
+.line-mini-direction-head .line-mini-badge {
margin-left: auto;
}
-.line-mini-direction-head > .line-mini-direction-name {
+.line-mini-route {
min-width: 0;
overflow: hidden;
+ color: var(--app-ink);
+ font-size: 11px;
+ font-weight: 600;
text-overflow: ellipsis;
+ white-space: nowrap;
}
-.line-mini-tcp {
+.line-mini-row {
+ display: grid;
+ gap: 3px;
+ min-width: 0;
+}
+
+.line-mini-rtt {
+ display: inline-flex;
+ align-items: baseline;
+ gap: 4px;
+}
+
+.line-mini-direction + .line-mini-direction {
margin-top: 2px;
padding-top: 5px;
border-top: 1px solid var(--app-outline-soft);
}
-.line-mini-tcp-head > strong {
- font-size: 12px;
-}
-
.line-mini-badge {
display: inline-flex;
align-items: center;