【原创】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 字符的行。  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ telnet localhost chargen
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]' .
!" #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
" #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
$%&'()*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk
%&'()*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
&'()*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklm
'()*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn
()*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno
)*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnop
*+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq
+,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr
,-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs
-. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst
. /0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
/0123456789 :;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv
^]
telnet> quit
Connection closed.
这个数据将一直持续到当前 TCP 连接被关闭为止(比如上面通过 ^] 来停止 telnet 会话)。  

===  

附:网上找的一个用 erlang 实现的 chargen 服务的程序。 
?
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
-module(chargen).
-author( 'Jesse E.I. Farmer <jesse@20bits.com>' ).
 
- export ([listen /1 ]).
 
-define(START_CHAR, 33).
-define(END_CHAR, 127).
-define(LINE_LENGTH, 72).
 
-define(TCP_OPTIONS, [binary, {packet, 0}, {active, false }, {reuseaddr, true }]).
 
% Call chargen:listen(Port) to start the service.
listen(Port) ->
         {ok, LSocket} = gen_tcp:listen(Port, ?TCP_OPTIONS),
         accept(LSocket).
 
% Wait for incoming connections and spawn the chargen loop when we get one.
accept(LSocket) ->
         {ok, Socket} = gen_tcp:accept(LSocket),
         spawn(fun() -> loop(Socket) end),
         accept(LSocket).
 
loop(Socket) ->
         loop(Socket, ?START_CHAR).
 
loop(Socket, ?END_CHAR) ->
         loop(Socket, ?START_CHAR);
loop(Socket, StartChar) ->
         Line = make_line(StartChar),
         case gen_tcp:send(Socket, Line) of
                 {error, _Reason} ->
                         exit (normal);
                 ok ->
                         loop(Socket, StartChar+1)
         end.
 
 
make_line(StartChar) ->
         make_line(StartChar, 0).
 
% Generate a new chargen line -- [13, 10] is CRLF.
make_line(_, ?LINE_LENGTH) ->
         [13, 10];
make_line(?END_CHAR, Pos) ->
         make_line(?START_CHAR, Pos);
make_line(StartChar, Pos) ->
         [StartChar | make_line(StartChar + 1, Pos + 1)].



目录
相关文章
|
10月前
|
前端开发 安全
| ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lin
| ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lin
477 0
|
API
JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Invalid escape sequence at line
JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Invalid escape sequence at line
137 0
|
程序员 Go API
|
弹性计算 Linux Docker
|
分布式数据库 Hbase
thriftpy2.protocol.exc.TProtocolException: No protocol version header
thriftpy2.protocol.exc.TProtocolException: No protocol version header
317 0
thriftpy2.protocol.exc.TProtocolException: No protocol version header
|
Java 关系型数据库 MySQL
mybatis学习(8):The server time zone value ‘???ú±ê×??±??‘ is unrecognized or represents more
mybatis学习(8):The server time zone value ‘???ú±ê×??±??‘ is unrecognized or represents more
158 0
mybatis学习(8):The server time zone value ‘???ú±ê×??±??‘ is unrecognized or represents more
solidity中transfer异常"send" and "transfer" are only available for objects of type address
solidity中transfer异常"send" and "transfer" are only available for objects of type address
441 0
艾伟:[原创]谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList)。
828 0
|
XML 分布式计算 MaxCompute