-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFakeTDLSpecification.html
More file actions
106 lines (106 loc) · 27.4 KB
/
FakeTDLSpecification.html
File metadata and controls
106 lines (106 loc) · 27.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<!doctype html>
<html>
<head>
<title>IntelliJ Markdown Preview</title>
<meta http-equiv="Content-Security-Policy" content="default-src 'none';
script-src 'self';
style-src 'unsafe-inline';
img-src file: *;
connect-src 'none';
font-src * data: *;
object-src 'none';
media-src 'none';
child-src 'none';">
<style>/* Reworked by IntelliJ Team The MIT License (MIT) Copyright (c) JetBrains Adapted from https://github.com/sindresorhus/github-markdown-css The MIT License (MIT) Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ @font-face { font-family: octicons-anchor; src: url(data:font/woff;charset=utf-8;base64,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) format('woff'); } body { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; font-family: Helvetica, Arial, freesans, sans-serif; font-size: 14px; line-height: 1.6; word-wrap: break-word; margin: 0 2em; } strong { font-weight: bold; } img { border: 0; } input { color: inherit; font: inherit; margin: 0; line-height: normal; } html input[disabled] { cursor: default; } input[type="checkbox"] { box-sizing: border-box; padding: 0; } body * { box-sizing: border-box; } input { font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Segoe UI Emoji", "Segoe UI Symbol"; } a { text-decoration: none; } a:hover, a:active { text-decoration: underline; } hr { height: 1px; padding: 0; margin: 20px 0; border: 0 none; } hr:before { display: table; content: ""; } hr:after { display: table; clear: both; content: ""; } blockquote { margin: 0; } ul, ol { padding: 0; margin-top: 0; margin-bottom: 0; } ol ol, ul ol { list-style-type: lower-roman; } ul ul ol, ul ol ol, ol ul ol, ol ol ol { list-style-type: lower-alpha; } dd { margin-left: 0; } .octicon { font: normal normal normal 16px/1 octicons-anchor; display: inline-block; text-decoration: none; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .octicon-link:before { content: '\f05c'; } .markdown-body > *:first-child { margin-top: 0 !important; } .markdown-body > *:last-child { margin-bottom: 0 !important; } .anchor { position: absolute; top: 0; left: 0; display: block; padding-right: 6px; padding-left: 30px; margin-left: -30px; } .anchor:focus { outline: none; } h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1em; margin-bottom: 16px; font-weight: bold; line-height: 1.4; } h1 .octicon-link, h2 .octicon-link, h3 .octicon-link, h4 .octicon-link, h5 .octicon-link, h6 .octicon-link { display: none; color: #000; vertical-align: middle; } h1:hover .anchor, h2:hover .anchor, h3:hover .anchor, h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { padding-left: 8px; margin-left: -30px; text-decoration: none; } h1:hover .anchor .octicon-link, h2:hover .anchor .octicon-link, h3:hover .anchor .octicon-link, h4:hover .anchor .octicon-link, h5:hover .anchor .octicon-link, h6:hover .anchor .octicon-link { display: inline-block; } h1 { font-size: 2.2em; padding-top: 0.6em; } h1 .anchor { line-height: 1; } h2 { font-size: 1.8em; line-height: 1.2; padding-top: 0.6em; } h2 .anchor { line-height: 1.2; } h3 { font-size: 1.3em; line-height: 1; padding-top: 0.6em; } h3 .anchor { line-height: 1.2; } h4 { font-size: 1em; } h4 .anchor { line-height: 1.2; } h5 { font-size: 1em; } h5 .anchor { line-height: 1.1; } h6 { font-size: 1em; } h6 .anchor { line-height: 1.1; } p, blockquote, ul, ol, dl, table, pre { margin-top: 16px; margin-bottom: 16px; } pre.frontmatter-header { background-color: transparent; margin: 0; padding: 0; } ul, ol { padding-left: 2em; } ul ul, ul ol, ol ol, ol ul { margin-top: 0; margin-bottom: 0; } li > p { margin-top: 0; margin-bottom: 0; } dl { padding: 0; } dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: bold; } dl dd { padding: 0 16px; margin-bottom: 16px; } blockquote { padding: 10px 10px 10px 16px; border-left: 2px solid; border-radius: 0 3px 3px 0; } blockquote > :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } table { display: block; width: 100%; overflow: auto; word-break: normal; border-collapse: collapse; border-spacing: 0; font-size: 1em; } table th { font-weight: bold; } table th, table td { padding: 6px 13px; background: transparent; } table tr { border-top: 1px solid; } img { max-width: 100%; box-sizing: border-box; } code { font: 0.9em "JetBrains Mono", Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 0.2em 0.4em; margin: 2px; border-radius: 3px; } pre > code { padding: 0; margin: 0; font-size: 100%; word-break: normal; white-space: pre; background: transparent; border: 0; } .highlight { margin-bottom: 16px; } .highlight pre, pre { font: 0.85em "JetBrains Mono", Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 16px; overflow: auto; line-height: 1.45; border-radius: 3px; } pre code { display: inline; max-width: initial; padding: 0; margin: 0; overflow: initial; line-height: inherit; word-wrap: normal; background-color: transparent; border: 0; } pre code:before, pre code:after { content: normal; } kbd { font: 0.9em "JetBrains Mono", Consolas, "Liberation Mono", Menlo, Courier, monospace; padding: 0.2em 0.4em; margin: 2px; border-radius: 3px; } .task-list-item { list-style-type: none; } .task-list-item + .task-list-item { margin-top: 3px; } .task-list-item input { margin: 0 0.35em 0.25em -0.6em; vertical-align: middle; } :checked + .radio-label { z-index: 1; position: relative; } span.user-del { text-decoration: line-through; } ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-thumb { -webkit-border-radius: 10px; } ::-webkit-scrollbar-track:vertical { -webkit-box-shadow: -1px 0 0 #ededed; } ::-webkit-scrollbar-track { background-color: transparent; } ::-webkit-scrollbar { width: 6px; }</style>
<style>:root { --default-font-size: 19px; } body { background-color: rgba(255, 255, 255, 255.0); font-size: var(--default-font-size) !important; } body, p, blockquote, ul, ol, dl, table, pre, code, tr { color: rgba(8, 8, 8, 255.0); } a { color: rgba(36, 112, 179, 255.0); } table td, table th { border: 1px solid rgba(209, 209, 209, 255.0); } hr { background-color: rgba(209, 209, 209, 255.0); } kbd, tr { border: 1px solid rgba(209, 209, 209, 255.0); } h6 { color: rgba(153, 153, 153, 255.0); } blockquote { border-left: 2px solid rgba(36, 112, 179, 0.4); } blockquote, code, pre { background-color: rgba(212, 222, 231, 0.24705882352941178); } ::-webkit-scrollbar { width: 10px; height: 10px; background-color: rgba(0, 0, 0, 0); } ::-webkit-scrollbar-track { background-color: rgba(0, 0, 0, 0); } ::-webkit-scrollbar-track:hover { background-color: rgba(0, 0, 0, 0); } ::-webkit-scrollbar-thumb { background-color: rgba(115, 115, 115, 0.627451); border-radius: 0px; border-width: 1px; border-style: solid; border-color: rgba(0, 0, 0, 0); background-clip: padding-box; outline: 1px solid rgba(89, 89, 89, 0.627451); outline-offset: -1px; } ::-webkit-scrollbar-thumb:hover { background-color: rgba(115, 115, 115, 0.627451); border-radius: 0px; border-width: 1px; border-style: solid; border-color: rgba(0, 0, 0, 0); background-clip: padding-box; outline: 1px solid rgba(89, 89, 89, 0.627451); outline-offset: -1px; } ::-webkit-scrollbar-corner { background-color: rgba(0, 0, 0, 0); } ::-webkit-scrollbar-button { display:none; }</style>
<style>/* Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. */ .code-fence-highlighter-copy-button { display: flex; position: absolute; float: left; margin-left: -1em; margin-top: -1em; } .code-fence-highlighter-copy-button-icon { visibility: hidden; max-width: 1em; } .code-fence:hover .code-fence-highlighter-copy-button-icon { visibility: visible; /*noinspection CssUnknownTarget*/ content: url("copy-button-copy-icon.png"); } .code-fence:hover .code-fence-highlighter-copy-button:hover .code-fence-highlighter-copy-button-icon { /*noinspection CssUnknownTarget*/ content: url("copy-button-copy-icon-hovered.png"); cursor: pointer; } .code-fence-highlighter-copy-button .tooltiptext { visibility: hidden; width: 120px; background-color: rgba(85, 85, 85, 0.4); color: #fff; text-align: center; border-radius: 6px; padding: 2px 0; position: absolute; font-size: 10px; z-index: 1; top: -4px; left: 120%; opacity: 0; transition: opacity 0.3s; } .code-fence-highlighter-copy-button:hover .tooltiptext { visibility: visible; opacity: 1; }</style>
<style>/* Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. */ .run-icon > img { max-width: 1em; vertical-align: text-top; margin-right: 0.3em; } .code-block { position: absolute; left: 1em; } .hidden { display: none; }</style>
</head>
<body>
<div md-src-pos="0..7592">
<h1 id="faketdl-data-format-specification-" md-src-pos="0..36">FakeTDL Data Format Specification</h1>
<p md-src-pos="38..49"><span md-src-pos="38..49">Version 1.0</span></p>
<h2 id="introduction" md-src-pos="51..66">Introduction</h2>
<p md-src-pos="68..305"><span md-src-pos="68..75">FakeTDL</span> (<span md-src-pos="77..81">v1.0</span>) <span md-src-pos="83..163">is a fictional data format intended to be used to illustrate the data format and</span> <span md-src-pos="164..199">cybersecurity data filtering issues</span> <span md-src-pos="200..222">that arise in military</span> <a href="https://en.wikipedia.org/wiki/Tactical_data_link" md-src-pos="223..299">Tactical Data Link (TDL)</a> <span md-src-pos="300..305">data.</span></p>
<h2 id="faketdl-messages" md-src-pos="307..326">FakeTDL Messages</h2>
<p md-src-pos="328..369"><span md-src-pos="328..368">FakeTDL has only a few kinds of messages</span>:</p>
<ul md-src-pos="371..598">
<li md-src-pos="371..431">Track - an observed or estimated point for a moving entity</li>
<li md-src-pos="432..516">Identity - information about the entity - friend/foe, air, land, sea, weapon, etc.</li>
<li md-src-pos="517..598">Ack - acknowledges receipt of one or more messages that require acknowledgement</li>
</ul>
<h2 id="common-concepts" md-src-pos="600..618">Common Concepts</h2>
<p md-src-pos="620..838"><span md-src-pos="620..686">Every message identifies the sender of that message and send time.</span> <span md-src-pos="687..710">This allows concepts of</span> "<span md-src-pos="712..740">most recent message received</span>" <span md-src-pos="742..745">and</span> "<span md-src-pos="748..771">most recent observation</span>" <span md-src-pos="773..805">to be distinguished as needed to</span> <span md-src-pos="807..838">illustrate filtering scenarios.</span></p>
<h3 id="unit-and-track-numbers" md-src-pos="840..866">Unit and Track Numbers</h3>
<p md-src-pos="868..1078"><span md-src-pos="868..913">Every participating entity is identified by a</span> <em md-src-pos="914..927">Unit Number</em><span md-src-pos="927..928">.</span> <span md-src-pos="929..950">For an entity that is</span> <span md-src-pos="951..997">reporting an observation about another entity,</span> <span md-src-pos="998..1009">this is the</span> <em md-src-pos="1010..1018">source</em> <span md-src-pos="1019..1023">unit</span> <span md-src-pos="1024..1031">number,</span> <span md-src-pos="1032..1061">and the observed entity has a</span> <em md-src-pos="1062..1076">track number</em><span md-src-pos="1076..1077">.</span></p>
<p md-src-pos="1080..1233"><span md-src-pos="1080..1127">Unit and Track numbers are 5 character strings.</span> <span md-src-pos="1128..1156">The first two characters are</span> <span md-src-pos="1157..1170">alphanumeric,</span> <span md-src-pos="1171..1197">allowing only A-Z and 0-9.</span> <span md-src-pos="1198..1219">The last 3 characters</span> <span md-src-pos="1220..1233">are 0-9 only.</span></p>
<p md-src-pos="1235..1345"><span md-src-pos="1235..1305">Filtering logic will often need to perform distinct filtering based on</span> <span md-src-pos="1306..1344">source unit numbers and track numbers.</span></p>
<p md-src-pos="1347..1952"><span md-src-pos="1347..1416">Real TDLs have a number of complexities that are omitted from FakeTDL</span> <span md-src-pos="1417..1455">in the interest of keeping it simpler.</span> <span md-src-pos="1456..1484">For example real TDLs have a</span> <span md-src-pos="1485..1555">way to eliminate duplicate track numbers that occur when more than one</span> <span md-src-pos="1556..1630">participant creates track observations about what turns out to be the same</span> <span md-src-pos="1631..1646">tracked entity.</span> <span md-src-pos="1648..1656">Fake TDL</span> (<span md-src-pos="1658..1669">version 1.0</span>) <span md-src-pos="1671..1722">does not contain track-number management messaging.</span> <span md-src-pos="1724..1730">Hence,</span> <span md-src-pos="1731..1758">scenarios must assume track</span> <span md-src-pos="1759..1787">numbers are enduring and don</span>'<span md-src-pos="1788..1818">t need to be revised/replaced.</span> (<span md-src-pos="1820..1864">Future versions of FakeTDL may revisit this,</span> <span md-src-pos="1865..1889">but we currently believe</span> <span md-src-pos="1890..1951">there is no loss of generality from omitting this capability.</span>)</p>
<h3 id="geolocations" md-src-pos="1954..1970">Geolocations</h3>
<p md-src-pos="1971..2254"><span md-src-pos="1971..2022">Geolocations are captured as lat/lon and elevation.</span> <span md-src-pos="2023..2033">The source</span> (<span md-src-pos="2035..2043">observer</span>) <span md-src-pos="2045..2106">location is typically reported along with the observed entity</span> <span md-src-pos="2107..2116">location,</span> <span md-src-pos="2117..2154">so that the distinction between these</span> (<span md-src-pos="2156..2182">and possibly even distance</span> <span md-src-pos="2184..2196">between them</span>) <span md-src-pos="2198..2253">can contribute to illustrations of filtering decisions.</span></p>
<p md-src-pos="2256..2395"><span md-src-pos="2256..2291">Latitude values are in degrees from</span> <span md-src-pos="2292..2306">-90.0 to 90.0,</span> <span md-src-pos="2307..2310">and</span> <span md-src-pos="2312..2332">longitude values are</span> <span md-src-pos="2333..2349">-180.0 to 180.0.</span> <span md-src-pos="2350..2395">Both are stored as 32-bit IEEE float numbers.</span></p>
<p md-src-pos="2397..2561"><span md-src-pos="2397..2422">Elevation values are from</span> <span md-src-pos="2423..2438">-1000 to 20000,</span> <span md-src-pos="2439..2471">the units of measure are 25 feet</span> <span md-src-pos="2472..2498">above/below Mean Sea Level</span> (<span md-src-pos="2500..2503">MSL</span>)<span md-src-pos="2504..2505">.</span> <span md-src-pos="2506..2561">Elevations are stored as 2-byte signed binary integers.</span></p>
<h3 id="time-fields" md-src-pos="2563..2578">Time Fields</h3>
<p md-src-pos="2580..2949"><span md-src-pos="2580..2654">Times of observations or message send/receive times are measured in hours,</span> <span md-src-pos="2655..2663">minutes,</span> <span md-src-pos="2664..2671">seconds</span> <span md-src-pos="2673..2691">since midnight UTC</span> (<span md-src-pos="2693..2723">also commonly called Zulu time</span>)<span md-src-pos="2724..2725">.</span> <span md-src-pos="2726..2756">Times are stored in 3 bytes in</span> <span md-src-pos="2758..2778">Binary-Coded Decimal</span> (<span md-src-pos="2780..2783">BCD</span>) <span md-src-pos="2785..2800">representation.</span> <span md-src-pos="2801..2818">Hence the time 13</span>:<span md-src-pos="2819..2821">24</span>:<span md-src-pos="2822..2853">47Z is represented as the bytes</span> <span md-src-pos="2855..2860">0x13,</span> <span md-src-pos="2861..2866">0x24,</span> <span md-src-pos="2867..2872">0x47.</span> <span md-src-pos="2873..2903">The hours can only be 0 to 23,</span> <span md-src-pos="2904..2948">the minutes and seconds can only be 0 to 59.</span></p>
<h2 id="faketdl-message-details" md-src-pos="2951..2977">FakeTDL Message Details</h2>
<p md-src-pos="2979..3129"><span md-src-pos="2979..3006">FakeTDL data is big-endian.</span> <span md-src-pos="3007..3056">The data fields are a mixture of binary and text.</span> <span md-src-pos="3058..3128">Text characters are always 8-bit ASCII so 1 character occupies 1 byte.</span></p>
<p md-src-pos="3131..3291"><span md-src-pos="3131..3162">Messages are all 64 bytes long.</span> <span md-src-pos="3163..3204">Unused data bytes at the end of a message</span> <span md-src-pos="3205..3225">are filled with 0x53</span> (<span md-src-pos="3227..3253">which corresponds to ASCII</span> '<span md-src-pos="3255..3256">X</span>' <span md-src-pos="3258..3290">if you look at raw data as text.</span>)</p>
<p md-src-pos="3293..3330"><span md-src-pos="3293..3329">All messages start with these fields</span>:</p>
<ul md-src-pos="3332..3588">
<li md-src-pos="3332..3401">messageType - 1 character (T, D, or A for Track, IDentity, and Ack)</li>
<li md-src-pos="3402..3465">source unit number - originator of the message (5 characters)</li>
<li md-src-pos="3466..3588">message send time - time of day. Note that message send time is distinguished from the time an observation was made.</li>
</ul>
<p md-src-pos="3590..3630"><span md-src-pos="3590..3630">Other fields depend on the message type.</span></p>
<h3 id="track-message" md-src-pos="3632..3649">Track Message</h3>
<p md-src-pos="3651..3865"><span md-src-pos="3651..3714">Track messages each carry information about 1 point on a track.</span> <span md-src-pos="3715..3749">This point can be the start or end</span> <span md-src-pos="3750..3763">of the track,</span> <span md-src-pos="3764..3802">or a waypoint on the track in between.</span> <span md-src-pos="3803..3845">The information can be marked as estimated</span> <span md-src-pos="3846..3865">or actual/observed.</span></p>
<h5 id="track-message-fields-" md-src-pos="3867..3894">Track Message Fields</h5>
<ul md-src-pos="3895..4581">
<li md-src-pos="3895..3986">ack required (whether an ack is required or not) - 1 byte boolean. 0 is false, 1 is true.</li>
<li md-src-pos="3987..4156">messageID (must be sent back on ACK messages) 4 byte unsigned integer. The value zero means "no statement" meaning there is no messageID. The maximum value is 99999.</li>
<li md-src-pos="4157..4189">source (aka observer) lat/lon</li>
<li md-src-pos="4190..4208">source elevation</li>
<li md-src-pos="4209..4245">track number (of observed entity)</li>
<li md-src-pos="4246..4265">observation time</li>
<li md-src-pos="4266..4299">observed lat/lon and elevation</li>
<li md-src-pos="4300..4380">start/end/waypoint - specifies what kind of track point (1 character, S, E, W)</li>
<li md-src-pos="4381..4425">estimated or actual - 1 character (E or A)</li>
<li md-src-pos="4426..4483">course - 2 byte unsigned integer from 0 to 359 degrees.</li>
<li md-src-pos="4484..4581">speed - 2 byte unsigned integer from 0 to 2000 data-miles per hour. (A data-mile is 6000 feet)</li>
</ul>
<h5 id="about-inter-message-track-filtering" md-src-pos="4583..4624">About Inter-Message Track Filtering</h5>
<p md-src-pos="4626..4824"><span md-src-pos="4626..4694">A principal goal for FakeTDL has been to enable creation of data for</span> <span md-src-pos="4696..4791">data filtering scenarios where state must be saved and messages cannot be processed until other</span> <span md-src-pos="4793..4823">related messages are received.</span></p>
<p md-src-pos="4826..5209"><span md-src-pos="4826..4871">FakeTDL track messages are able to illustrate</span> <em md-src-pos="4872..4899">inter-message correlation</em><span md-src-pos="4899..4900">.</span> <span md-src-pos="4902..4914">For example,</span> <span md-src-pos="4915..4971">a track way-point message may need to be routed based on</span> <span md-src-pos="4973..5067">the geolocation of the start point of the track and whether that start point is inside/outside</span> <span md-src-pos="5069..5102">of certain geo-region boundaries;</span> <span md-src-pos="5103..5111">however,</span> <span md-src-pos="5112..5150">the start point location is carried by</span> <span md-src-pos="5152..5176">a separate track message</span> (<span md-src-pos="5178..5207">sharing the same track number</span>)<span md-src-pos="5208..5209">.</span></p>
<h3 id="identity-message" md-src-pos="5211..5231">Identity Message</h3>
<p md-src-pos="5232..5540"><span md-src-pos="5232..5281">Identity messages carry the more slowly changing,</span> <span md-src-pos="5282..5297">or non-changing</span> <span md-src-pos="5298..5332">information about a track or unit.</span> <span md-src-pos="5333..5350">Most importantly,</span> <span md-src-pos="5351..5366">it contains IFF</span> (<span md-src-pos="5368..5390">Identity Friend or Foe</span>) <span md-src-pos="5392..5399">status,</span> <span md-src-pos="5400..5403">but</span> <span md-src-pos="5404..5461">also descriptive information about the type of an entity.</span> <span md-src-pos="5462..5527">Data filtering rules often redact or block some kinds of identity</span> <span md-src-pos="5528..5540">information.</span></p>
<h5 id="identity-message-fields" md-src-pos="5542..5571">Identity Message Fields</h5>
<ul md-src-pos="5572..6815">
<li md-src-pos="5572..5663">ack required (whether an ack is required or not) - 1 byte boolean. 0 is false, 1 is true.</li>
<li md-src-pos="5664..5833">messageID (must be sent back on ACK messages) 4 byte unsigned integer. The value zero means "no statement" meaning there is no messageID. The maximum value is 99999.</li>
<li md-src-pos="5834..5896">track number (of the entity being described by this message)</li>
<li md-src-pos="5897..5915">observation time</li>
<li md-src-pos="5916..6010">IFF - Identity Friend or Foe - indicates Friend, Enemy, or Unknown (1 character, F, E, or U)</li>
<li md-src-pos="6011..6090">entity category (Land, Sea, Sub, Air, Weapon) (1 character, L, S, U, A, or W)</li>
<li md-src-pos="6091..6189">type - numeric identifier of specific entity (2 byte unsigned integer) 0 means type unspecified.</li>
<li md-src-pos="6190..6815">description (text) - up to 38 characters of text restricted to:
<ul md-src-pos="6258..6815">
<li md-src-pos="6258..6324">Upper case letters, digits, spaces, parentheses, square brackets</li>
<li md-src-pos="6327..6387">These punctuation characters ".-_/:" (without the quotes).</li>
<li md-src-pos="6390..6485">Spaces and punctuation characters must have non-punctuation characters surrounding them.</li>
<li md-src-pos="6488..6541">The text must begin with an alpha-numeric character</li>
<li md-src-pos="6544..6650">The text must end with an alpha-numeric character, closing parenthesis, or closing square bracket.</li>
<li md-src-pos="6653..6718">Control characters like line endings and TABs are not allowed.</li>
<li md-src-pos="6721..6815">Trailing unused characters (of the available length) are filled with NUL (character code 0).</li>
</ul></li>
</ul>
<h3 id="ack-message" md-src-pos="6819..6834">Ack Message</h3>
<ul md-src-pos="6835..6962">
<li md-src-pos="6835..6868">dest unit number (5 characters)</li>
<li md-src-pos="6869..6962">messageID (being acknowledged) (repeats up to 12 times) (each is a 4 byte unsigned integer)</li>
</ul>
<p md-src-pos="6964..7200"><span md-src-pos="6964..7034">One ack message can acknowledge the receipt of multiple track/identity</span> <span md-src-pos="7036..7076">messages that requested acknowledgement.</span> <span md-src-pos="7077..7085">That is,</span> <span md-src-pos="7086..7105">fakeTDL can be used</span> <span md-src-pos="7106..7174">to illustrate scenarios where acks are sent infrequently relative to</span> <span md-src-pos="7175..7200">track and ident messages.</span></p>
<p md-src-pos="7202..7450"><span md-src-pos="7202..7267">FakeTDL contains ack messages because TDLs generally require that</span> <span md-src-pos="7269..7300">some messages are acknowledged.</span> <span md-src-pos="7301..7313">For example,</span> <span md-src-pos="7314..7318">when</span> <span md-src-pos="7320..7390">an Identity message changes the IFF of an entity from Enemy to Friend,</span> <span md-src-pos="7391..7450">then an ACK must be sent back to the source of that update.</span></p>
<p md-src-pos="7452..7591"><span md-src-pos="7452..7512">This required ack feature in fakeTDL allows it to be used to</span> <span md-src-pos="7514..7537">illustrate the critical</span> <span md-src-pos="7538..7591">need for bidirectional communications in TDL systems.</span></p>
</div>
</body>
</html>