aboutsummaryrefslogtreecommitdiffstats
path: root/docs/design/011-pure-transport.md
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-29 16:46:19 +0100
committereunhhu <[email protected]>2026-09-29 16:46:19 +0100
commit2a9960f086eeccf2ee58decc11b6d3f2de13699e (patch)
treecfb5430747f6995c902f201303ffdb3a597dd243 /docs/design/011-pure-transport.md
parent1521fb498afa85ee6d03bdb347e700da2187d85c (diff)
downloadpure-2a9960f086eeccf2ee58decc11b6d3f2de13699e.tar.gz
pure-2a9960f086eeccf2ee58decc11b6d3f2de13699e.zip
Specify the link (012) and make it the default between nodes (011)
012 says what goes on the wire, enough for another implementation: the header, the key id, the version and why it is not negotiated on the wire, the static secret, HKDF's salt and infos, the nonce, epochs' chain, the thirteen frames byte by byte, what each side must do, the values that are the spec's and those each side picks, the two words a receiver says (LOST, REFUSED), what an attacker gets, and what is known not to hold. A receiver written from it alone, in Python, links with a pure-serve node through epoch 1 (check.py). 011's last row of its stop table is met: H1-H4 held, every check passes, CPU within 10 % of QUIC at 61 B and 25 % under it from 1 KiB, the share with TCP within 25 %, 3,097 lines of C. Links without connections are now the default between Pure nodes; HTTP stays the boundary to others, and relayed sealed sends stay as they are. 006, 009 and the README say so.
Diffstat (limited to 'docs/design/011-pure-transport.md')
-rw-r--r--docs/design/011-pure-transport.md22
1 files changed, 21 insertions, 1 deletions
diff --git a/docs/design/011-pure-transport.md b/docs/design/011-pure-transport.md
index 034321e..5513476 100644
--- a/docs/design/011-pure-transport.md
+++ b/docs/design/011-pure-transport.md
@@ -1,6 +1,7 @@
# 011 — 연결 없는 전송: 전송의 상태를 앱의 데이터로
-작성일: 2026-09-28(같은 날 첫 판을 버리고 다시 씀). 상태: 설계. 1단계를 구현했고 M1, M2, M4, M5, M6를 쟀다.
+작성일: 2026-09-28(같은 날 첫 판을 버리고 다시 씀). 상태: 채택(2026-09-29). Pure 노드 사이 전달의 기본이다. 명세는
+[012](012-link-protocol.md)다.
[외부 피드백 002](../outside-feedback/feedback-002.md)의 "QUIC을 능가할 자체 raw socket 프로토콜"에서 시작한다.
1단계(링크 시제품과 kill -9 검사)는 [093](../research/093-connectionless-link.md)에 있다. 어느 쪽을 죽여도 핸드셰이크 없이
@@ -49,6 +50,25 @@ M3(저장소 옮기기, H3)는 [100](../research/100-moved-receiver.md)에 있�
- M5를 ngtcp2와도 쟀다. 1 KiB 이상에서 Pure가 두 QUIC 모두보다 25 % 넘게 가볍고, 61 B에서는 ngtcp2의 1.04배, quinn의 0.90배다.
- 패킷마다의 스트림 이름은 비용이 아니었다. 빼 보니 잡음 안이라 되돌렸다.
+5단계(채택과 명세)는 2026-09-29에 했다. 중단 기준표의 마지막 줄대로다.
+
+- H1–H4가 모두 섰다.
+- 잃음·겹침 검사, 논스 검사, 보안 검사를 모두 통과한다.
+- 전달당 CPU는 1 KiB 이상에서 두 QUIC보다 25 % 넘게 가볍다. 61 B에서는 ngtcp2의 1.04배로 10 % 안이다.
+- TCP와의 몫은 ±25 % 안이다.
+- 전송 코드는 C 3,097줄이다.
+
+그래서 연결 없는 링크를 노드 사이 전달의 기본으로 삼는다(`--send OUTPUT=pure://host:port/INPUT`). HTTP 전달은 제3자와
+브라우저를 잇는 경계로 남고, 중계를 지나는 봉인한 전달([088](../research/088-sealed-sessions.md))도 그대로다. M6를 ngtcp2와
+재지는 않았다. 가드레일은 quinn과 TCP로 쟀다.
+
+명세 [012](012-link-protocol.md)를 쓰면서 구현의 구멍 셋을 찾아 고쳤다.
+- 받는 쪽이 받지 않는 스트림을 보내는 쪽은 아무 말도 듣지 못해 매초 다시 보냈다. 이제 REFUSED로 이유를 듣고 드물게 다시 시도한다.
+- 받는 쪽이 쥘 수 없는 16–64 MiB 기록이 영원히 다시 갔다.
+- 한 노드의 출력 셋 이상이 같은 노드로 가면 run들이 받는 쪽의 두 자리를 서로 밀어냈다.
+
+명세만 보고 파이썬으로 따로 쓴 받는 쪽이 `pure-serve` 노드와 에폭 바꿈까지 맞붙는다.
+
2026-09-29에 링크를 `link/`로 뗐다([009](009-layout.md)). 프로토콜은 이제 소켓, 스레드, 시계가 없는 상태이고
(`link/link-protocol.h`), UDP와 스레드는 그 위의 층이다. 그래서 한 스레드가 링크 여럿을 들 수 있다. M2를 이 보내는 쪽으로
다시 돌렸더니 결과가 같았다. 다만 재시작 뒤 가장 늦은 저장이 1초였다. 받았다고 했지만 저장 소식이 없는 기록을 1초 기다리기