原始套接字和普通的TCP套接字有啥不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始套接字和普通的TCP套接字有啥不同?相关的知识,希望对你有一定的参考价值。

原始套接字可以读写内核没有处理的IP数据包,而流套接字(就是TCP流)只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。

这两句程序你就可以创建一个原始套接字.然而这种类型套接字的功能却与TCP或者UDP类型套接字的功能有很大的不同:TCP/UDP类型的套接字只能够访问传输层以及传输层以上的数据,因为当IP层把数据传递给传输层时。

下层的数据包头已经被丢掉了.而原始套接字却可以访问传输层以下的数据,,所以使用raw套接字你可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作.

比如:通过sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))方式创建的raw socket就能直接读取链路层的数据.

1、使用原始套接字时应该注意的问题(参考<<unix网络编程>>以及网上的优秀文档)

2、对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交给对应的

UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或者其它类型的数据,调用socket。


参考技术A 我们常见的就是原始、tcp、udp3种套接字,主要区别:
原始套接字可以读写内核没有处理的IP数据包,而流套接字(就是TCP流)只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。

telnet 与原始 tcp 连接有何不同

【中文标题】telnet 与原始 tcp 连接有何不同【英文标题】:How does telnet differ from a raw tcp connection 【发布时间】:2012-09-25 16:01:42 【问题描述】:

我正在尝试通过 python 脚本向服务器发送命令。我可以看到正在服务器上建立套接字连接。但是我发送的命令似乎没有通过(服务器对套接字进行读取)。 服务器当前支持 telnet 命令解释器。即:你telnet到命令地址和端口,你就可以开始发送了 字符串命令。 我的问题是,与使用 telnet 相比,通过 tcp 套接字发送字符串有什么根本不同。 我使用了原始套接字和 Twisted 框架。

【问题讨论】:

区别就像汽车和发动机的区别一样。 Telnet 可以使用 TCP 套接字实现,就像汽车可以使用特定类型的引擎制造一样。 【参考方案1】:

Telnet 是一种传递有关通信通道的控制信息的方法。它定义了行缓冲、字符回显等,并在连接开始时(以及在极少数情况下,在会话期间)通过一系列 will/wont/do/dont 消息完成。

这可能不是您的服务器文档的意思。相反,这可能意味着您可以使用诸如“Telnet”之类的程序打开到端口的 TCP 套接字,并与服务器上的命令解释器进行交互。

当 Telnet 程序连接时,它通常会在实际响应之前侦听这些控制消息,因此将使用实际上不使用 telnet 协议的 TCP/socket 连接,恢复为简单的原始管道。服务器必须做所有的字符回显、行缓冲等。

所以在你的的情况下,服务器很可能使用一个没有 telnet 转义序列的原始 TCP 流,因此没有区别。

【讨论】:

python 在这方面非常出色。有一个 telnetlib。 @Brian_White,您能否提供“恢复为简单的原始管道”的文档参考? 我不确定它是否属于任何 RFC。该声明来自我编写telnet 客户端并将其与现有客户端的行为进行比较的经验,因此是“典型”限定词。当然,它不会完全是原始的,因为不能直接传递IAC 字符,但这对于控制台用户界面来说通常不是问题。您可以使用telnet 连接到任何开放端口(例如web 端口80)自行检查,并观察客户端没有发送IAC 控制序列。 第三句没看懂。如果我跟踪连接,它看起来很原始。 假设您的意思是第三个段落:唯一的区别是流中嵌入了一些控制序列。 IAC FOO BAR(二进制,而不是 ascii)如果服务器从不发送它们(并且许多系统没有),那么您将拥有与原始连接非常相似的东西。我说“相似”是因为它不是完全 8 位干净的;任何IAC (0xFF) 字符都应转义为IAC IAC【参考方案2】:

请记住,Telnet 是一个应用层协议,而 TCP 是一个传输层协议。 Telnet 使用 TCP 来传输数据。这是 Telnet 和 TCP 之间的一个很大的根本区别。

见:OSI Model wikipedia page

【讨论】:

【参考方案3】:

来自Wikipedia page telnet

...用户数据与 Telnet 控制信息散布在带内...

所以,回答你的问题,是的,telnet 确实不同于原始套接字。

RFC 854 描述了 telnet 协议,如果您想尝试实现它,或者如果您更喜欢现有的 python 客户端,可以使用telnetlib。

【讨论】:

以上是关于原始套接字和普通的TCP套接字有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章

网络骇客初级之原始套接字(SOCK_RAW)

原始套接字编程

怎么用python和原始套接字发送一tcp数据包

Python原始套接字编程

原始套接字-自定义IP首部和TCP首部

linux原始套接字-构造IP_TCP发送与接收