天天看點

【原創】Character Generator Protocol

=== 

      character generator protocol (chargen) 是在 rfc 864 中由 jon postel 定義的 internet protocol suite 中的一個服務。主要用于測試、調試,以及測量的目的。該協定很少被使用,因為其固有的設計缺陷容易導緻誤用和攻擊。 

      任意 host 都可以通過 tcp 或 udp 方式連接配接到支援 character generator protocol 并啟用了該服務的伺服器上,預設端口号為 19。當采用 tcp 方式成功連接配接時,伺服器端将開始連續不斷的發送任意字元到該連接配接上的 host,直到 host 主動關閉該連接配接為止。當采用 udp 方式時,伺服器端會在每一次收到來自 host 的資料報時,回複包含随機數(0~512)的字元形式 udp 資料報。伺服器接收到的任何資料均會被丢棄。 

      在大多數類 unix 作業系統上,chargen 服務被放置在 inetd 或 xinetd 守護程序中。chargen 伺服器通常預設情況下不被使能。 

      chargen 服務可以作為産生位元組流的源用于調試 tcp 網絡程式代碼,比如,邊界檢查和緩存管理。該服務同樣可以作為帶寬測量或 qos 調優的通用負載産生的源。 

      典型的 chargen 服務會話看起來如下:用于通過 telnet 用戶端連接配接到(提供該服務的)伺服器上,使用者連續不斷的接收來自服務端的位元組流。盡管在 rfc 864 裡沒有指定位元組流的資料格式,但推薦的格式為(事實上的标準)循環左移含有 72 個 ascii 字元的行。 

<a href="http://my.oschina.net/moooofly/blog/265332#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<code>$ telnet localhost chargen</code>

<code>trying 127.0.0.1...</code>

<code>connected to localhost.</code>

<code>escape character is</code><code>'^]'</code><code>.</code>

<code>!"</code><code>#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefgh</code>

<code>"</code><code>#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghi</code>

<code>#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghij</code>

<code>$%&amp;'()*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijk</code>

<code>%&amp;'()*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijkl</code>

<code>&amp;'()*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklm</code>

<code>'()*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmn</code>

<code>()*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmno</code>

<code>)*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnop</code>

<code>*+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopq</code>

<code>+,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqr</code>

<code>,-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrs</code>

<code>-.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrst</code>

<code>.</code><code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstu</code>

<code>/0123456789</code><code>:;&lt;=&gt;?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuv</code>

<code>^]</code>

<code>telnet&gt; quit</code>

<code>connection closed.</code>

這個資料将一直持續到目前 tcp 連接配接被關閉為止(比如上面通過 ^] 來停止 telnet 會話)。 

附:網上找的一個用 erlang 實作的 chargen 服務的程式。 

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

<code>-module(chargen).</code>

<code>-author(</code><code>'jesse e.i. farmer &lt;[email protected]&gt;'</code><code>).</code>

<code>-</code><code>export</code><code>([listen</code><code>/1</code><code>]).</code>

<code>-define(start_char, 33).</code>

<code>-define(end_char, 127).</code>

<code>-define(line_length, 72).</code>

<code>-define(tcp_options, [binary, {packet, 0}, {active,</code><code>false</code><code>}, {reuseaddr,</code><code>true</code><code>}]).</code>

<code>% call chargen:listen(port) to start the service.</code>

<code>listen(port) -&gt;</code>

<code>        </code><code>{ok, lsocket} = gen_tcp:listen(port, ?tcp_options),</code>

<code>        </code><code>accept(lsocket).</code>

<code>% wait</code><code>for</code> <code>incoming connections and spawn the chargen loop when we get one.</code>

<code>accept(lsocket) -&gt;</code>

<code>        </code><code>{ok, socket} = gen_tcp:accept(lsocket),</code>

<code>        </code><code>spawn(fun() -&gt; loop(socket) end),</code>

<code>loop(socket) -&gt;</code>

<code>        </code><code>loop(socket, ?start_char).</code>

<code>loop(socket, ?end_char) -&gt;</code>

<code>        </code><code>loop(socket, ?start_char);</code>

<code>loop(socket, startchar) -&gt;</code>

<code>        </code><code>line = make_line(startchar),</code>

<code>        </code><code>case</code> <code>gen_tcp:send(socket, line) of</code>

<code>                </code><code>{error, _reason} -&gt;</code>

<code>                        </code><code>exit</code><code>(normal);</code>

<code>                </code><code>ok -&gt;</code>

<code>                        </code><code>loop(socket, startchar+1)</code>

<code>        </code><code>end.</code>

<code>make_line(startchar) -&gt;</code>

<code>        </code><code>make_line(startchar, 0).</code>

<code>% generate a new chargen line -- [13, 10] is crlf.</code>

<code>make_line(_, ?line_length) -&gt;</code>

<code>        </code><code>[13, 10];</code>

<code>make_line(?end_char, pos) -&gt;</code>

<code>        </code><code>make_line(?start_char, pos);</code>

<code>make_line(startchar, pos) -&gt;</code>

<code>        </code><code>[startchar | make_line(startchar + 1, pos + 1)].</code>

繼續閱讀