@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/06/09/001-tcp-send-receive-message-framing/#article>
    schema:about <https://comcomponent.com/knowledge/tcp-byte-stream/>, <https://comcomponent.com/knowledge/application-framing/>, <https://comcomponent.com/knowledge/length-prefix-framing/> ;
    schema:mentions <https://comcomponent.com/knowledge/fixed-length-framing/>, <https://comcomponent.com/knowledge/delimiter-framing/>, <https://comcomponent.com/knowledge/self-describing-framing/>, <https://comcomponent.com/knowledge/nagle-algorithm/>, <https://comcomponent.com/knowledge/socket-dataavailable/>, <https://comcomponent.com/knowledge/message-boundary-mismatch/>, <https://comcomponent.com/knowledge/io-loop-until-complete/>, <https://comcomponent.com/knowledge/tls-record/>, <https://comcomponent.com/knowledge/concurrent-write-interleaving/>, <https://comcomponent.com/knowledge/wireshark/>, <https://comcomponent.com/knowledge/pktmon/>, <https://comcomponent.com/knowledge/npcap/>, <https://comcomponent.com/knowledge/asynchronous-io/> .

<https://comcomponent.com/knowledge/tcp-byte-stream/> a skos:Concept ;
    skos:prefLabel "TCPのバイトストリーム性"@ja ;
    skos:definition "TCPが保証するのは送ったバイト列が順序を保って重複・欠落なく届くことだけであり、送信側のSend単位を受信側のReceive単位として保存することは保証しないという性質である。"@ja ;
    skos:altLabel "TCPは順序付きのバイトストリーム"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/message-boundary-mismatch/> .

<https://comcomponent.com/knowledge/application-framing/> a skos:Concept ;
    skos:prefLabel "アプリケーションプロトコルのフレーミング"@ja ;
    skos:definition "受信側が、受け取ったバイト列のどこからどこまでが1メッセージなのかを判断する、アプリケーションプロトコル側の仕組みである。"@ja ;
    skos:altLabel "フレーミング"@ja ;
    skos:altLabel "メッセージ境界の決定"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/message-boundary-mismatch/> .

<https://comcomponent.com/knowledge/length-prefix-framing/> a skos:Concept ;
    skos:prefLabel "長さプレフィックス方式"@ja ;
    skos:definition "メッセージの先頭に本文長を置き、そのバイト数だけ本文を読むフレーミング方式で、任意のバイナリを含められ最大サイズ制限も入れやすい。"@ja ;
    skos:altLabel "長さプレフィックス"@ja ;
    ks:implements <https://comcomponent.com/knowledge/application-framing/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/tcp-byte-stream/> ;
    ks:requires <https://comcomponent.com/knowledge/io-loop-until-complete/> .

<https://comcomponent.com/knowledge/message-boundary-mismatch/> a skos:Concept ;
    skos:prefLabel "送信区切りと受信区切りのずれ(分割・結合)"@ja ;
    skos:definition "TCPの送信単位と受信単位が一致しないために、1メッセージが複数回の受信に分割されたり、複数メッセージが1回の受信に結合されたりする現象である。"@ja ;
    skos:altLabel "分割・結合"@ja ;
    skos:altLabel "フレーミングの不具合"@ja ;
    ks:verifiedBy <https://comcomponent.com/knowledge/wireshark/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/pktmon/> .

<https://comcomponent.com/knowledge/fixed-length-framing/> a skos:Concept ;
    skos:prefLabel "固定長方式"@ja ;
    skos:definition "常に決まったバイト数を1メッセージとするフレーミング方式で、境界は明確だが可変長データを扱いにくい。"@ja ;
    skos:altLabel "固定長電文"@ja ;
    ks:implements <https://comcomponent.com/knowledge/application-framing/> ;
    ks:requires <https://comcomponent.com/knowledge/io-loop-until-complete/> .

<https://comcomponent.com/knowledge/delimiter-framing/> a skos:Concept ;
    skos:prefLabel "区切り文字方式"@ja ;
    skos:definition "改行など特定のバイト列までを1メッセージとするフレーミング方式である。"@ja ;
    skos:altLabel "改行区切り"@ja ;
    ks:implements <https://comcomponent.com/knowledge/application-framing/> ;
    ks:requires <https://comcomponent.com/knowledge/io-loop-until-complete/> .

<https://comcomponent.com/knowledge/self-describing-framing/> a skos:Concept ;
    skos:prefLabel "自己記述形式"@ja ;
    skos:definition "HTTPのContent-Lengthやchunkedのように、形式そのものの中に長さや終端を表す情報を持たせるフレーミング方式である。"@ja ;
    skos:altLabel "Content-Length" ;
    skos:altLabel "chunked" ;
    ks:implements <https://comcomponent.com/knowledge/application-framing/> .

<https://comcomponent.com/knowledge/nagle-algorithm/> a skos:Concept ;
    skos:prefLabel "Nagleアルゴリズム(Socket.NoDelay)"@ja ;
    skos:definition "小さな送信をまとめて送るかどうかを調整するアルゴリズムで、Socket.NoDelayをtrueにすると無効化できる送信遅延・効率に関する設定である。"@ja ;
    skos:altLabel "Socket.NoDelay" ;
    skos:altLabel "Nagle" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/application-framing/> .

<https://comcomponent.com/knowledge/socket-dataavailable/> a skos:Concept ;
    skos:prefLabel "NetworkStream.DataAvailable"@ja ;
    skos:definition "その瞬間にローカルの受信バッファに読み取り可能なデータがあるかどうかだけを示す、.NETの NetworkStreamのプロパティである。"@ja ;
    skos:altLabel "DataAvailable" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/application-framing/> .

<https://comcomponent.com/knowledge/tls-record/> a skos:Concept ;
    skos:prefLabel "TLSレコード"@ja ;
    skos:definition "TLSが暗号化通信を運ぶ際に使う内部的な伝送単位で、アプリケーションメッセージの境界とは一致しない。"@ja ;
    skos:altLabel "TLS Record" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/application-framing/> .

<https://comcomponent.com/knowledge/concurrent-write-interleaving/> a skos:Concept ;
    skos:prefLabel "並行Writeによるアプリケーションレベルの混線"@ja ;
    skos:definition "同じTCP接続に対して複数のタスクが同時にフレームを書き込むと、ヘッダーと本文の順序が混ざってしまう問題である。"@ja ;
    skos:altLabel "並行書き込みの混線"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/message-boundary-mismatch/> .

<https://comcomponent.com/knowledge/io-loop-until-complete/> a skos:Concept ;
    skos:prefLabel "必要バイト数まで読み切る/書き切るループ"@ja ;
    skos:definition "Read/ReceiveやSend/Writeの戻り値が要求したサイズより少ないことがあるため、目的のバイト数に達するまで繰り返し呼び出す実装パターンである。"@ja ;
    skos:altLabel "ReadUntilFullOrEndAsync" ;
    skos:altLabel "SendAllAsync" ;
    skos:altLabel "Stream.ReadExactly" ;
    ks:prevents <https://comcomponent.com/knowledge/message-boundary-mismatch/> .

<https://comcomponent.com/knowledge/asynchronous-io/> a skos:Concept ;
    skos:prefLabel "非同期I/O"@ja ;
    skos:definition "要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。"@ja ;
    skos:altLabel "Asynchronous I/O" ;
    skos:altLabel "オーバーラップI/O"@ja .

<https://comcomponent.com/knowledge/wireshark/> a skos:Concept ;
    skos:prefLabel "Wireshark"@ja ;
    skos:definition "キャプチャしたパケットをパケット詳細ペインとバイト列ペインで対応づけて表示できる、パケット解析ツール。"@ja .

<https://comcomponent.com/knowledge/pktmon/> a skos:Concept ;
    skos:prefLabel "Packet Monitor(pktmon)"@ja ;
    skos:definition "Windows標準でパケットキャプチャができるツールで、取得したETLはpcapngに変換してWiresharkで開ける。"@ja ;
    skos:altLabel "pktmon.exe" .

<https://comcomponent.com/knowledge/npcap/> a skos:Concept ;
    skos:prefLabel "Npcap"@ja ;
    skos:definition "Windowsでループバック(127.0.0.1)のトラフィックをキャプチャするために必要なパケットキャプチャドライバーである。"@ja ;
    skos:altLabel "Npcap driver" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tcp-byte-stream/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    schema:description "TCPは送ったバイト列の順序・重複なし・欠落なしの到達だけを保証し、Sendした単位がReceiveの単位として保存されることは保証しないため、分割や結合が起こり得る"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/application-framing/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    schema:description "受信側でメッセージ境界を判断する仕組み(フレーミング)を設ければ、分割・結合によるメッセージ境界のずれに正しく対応できる"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/fixed-length-framing/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "固定長方式は、常に決まったバイト数を1メッセージとすることでフレーミングを実現する"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/delimiter-framing/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "区切り文字方式は、改行など特定のバイト列までを1メッセージとすることでフレーミングを実現する"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/length-prefix-framing/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "長さプレフィックス方式は、先頭に本文長を置きそのバイト数だけ本文を読むことでフレーミングを実現する"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/self-describing-framing/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "自己記述形式は、HTTPのContent-Lengthのように形式内に長さや終端の情報を持たせることでフレーミングを実現する"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9110.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/length-prefix-framing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/tcp-byte-stream/> ;
    schema:description "独自プロトコルを作るなら、本文に任意のバイナリを含められ、受信側の実装が明確で、最大サイズ制限も入れやすい長さプレフィックス方式がまず検討候補になる"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/nagle-algorithm/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "Socket.NoDelay(Nagleアルゴリズムの無効化)は送信の遅延・効率の調整であり、メッセージ境界を保存する設定ではないため、フレーミングの代わりにはならない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.nodelay?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/socket-dataavailable/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "DataAvailableはその瞬間にローカル受信バッファに読み取り可能なデータがあるかを示すだけで、アプリケーション上の1メッセージが完了したことを意味しない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.networkstream.dataavailable?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/tls-record/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/application-framing/> ;
    schema:description "TLSレコードは内部的な伝送単位であり、アプリケーションメッセージの境界ではないため、TLS化してもアプリケーション層でのフレーミング設計は必要になる"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc8446.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/concurrent-write-interleaving/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    schema:description "同じTCP接続に複数タスクが同時にフレームを書き込むと、ヘッダーと本文が混ざるアプリケーションレベルの混線が起き、受信側のフレーム復元が壊れる"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/io-loop-until-complete/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    schema:description "Read/Receiveの戻り値のバイト数だけを信用し、必要なバイト数を読み切るまでループすることで、途中で切れた受信を1メッセージとして誤処理しない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readexactly?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/io-loop-until-complete/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/asynchronous-io/> ;
    schema:description "ReadAsync/WriteAsyncのような非同期I/Oを使う場合でも、要求サイズに届くまで読み書きを繰り返すという考え方は同じである"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.net.sockets.networkstream.read?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/wireshark/> ;
    schema:description "Follow > TCP Streamで復元したバイト列を見て、送信側のフレーム組み立てと受信側の復元処理のどちらが壊れているかを切り分けられる"@ja ;
    ks:evidence <https://wiki.wireshark.org/CaptureSetup/Loopback> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/message-boundary-mismatch/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/pktmon/> ;
    schema:description "Windows標準のpktmonでキャプチャしたETLをpcapngに変換し、Wiresharkで開いて同様に確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows-server/networking/technologies/pktmon/pktmon> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/length-prefix-framing/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/io-loop-until-complete/> ;
    schema:description "4バイトヘッダーも本文も分割され得るため、ヘッダーと本文それぞれを読み切るまでのループが前提になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readexactly?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/fixed-length-framing/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/io-loop-until-complete/> ;
    schema:description "固定長方式でも、1回のReadAsyncで指定バイト数がすべて返るとは限らないため、読み切るまでのループが必要になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.readexactly?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/delimiter-framing/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/io-loop-until-complete/> ;
    schema:description "改行が来るまでバイトを蓄積し、1行分そろってからデコードするなど、区切りが確認できるまで読み続ける実装が必要になる"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9293.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wireshark/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/npcap/> ;
    schema:description "Windowsでループバック(127.0.0.1)を見るにはNpcapが必要になる"@ja ;
    ks:evidence <https://wiki.wireshark.org/CaptureSetup/Loopback> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
