PPTP 连接通过将有效负载数据包装到 PPP 中,然后通过先前协商的增强型 GRE 链路发送它来传输有效负载数据。
根据 PPTP RFC,以下情况成立:
封装的 PPP 数据包本质上是 PPP 数据包,没有任何媒体特定的成帧元素。不包括 HDLC 标志、位插入、控制字符或控制字符转义。不会通过隧道发送 CRC。
因此,PPP 数据中的任何内容都必须进行转义,并且所有字符都被视为普通字符而不是控制字符。
然而,PPTP 也在2.15 节Set-Link-Info
中定义了一个消息。Set-Link-Info并且此消息的唯一目的是设置 ACCM,它代表异步控制字符映射。它还定义,除非发送此消息,否则对方应假定0xFFFFFFFF
为默认值。
ACCM 的唯一目的是告诉对方哪些控制字符必须转义,但第 4 节禁止转义控制字符,那么设置 ACCM 不是零还有什么目的?如果默认值表示所有低于 ASCII 码 32 的字符都必须转义,但又禁止转义,那么会发生什么行为?
我发现的所有实现都完全忽略了 ACCM,从不逃避任何东西,但这使得Set-Link-Info
消息完全没有意义,因为它永远不会产生影响。有人可以阐明这个矛盾吗?
相关的 RFC: