Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以通过TCP发送数据报?_Tcp_Sockets_Datagram - Fatal编程技术网

是否可以通过TCP发送数据报?

是否可以通过TCP发送数据报?,tcp,sockets,datagram,Tcp,Sockets,Datagram,理论上,没有什么可以阻止将TCP套接字与sockdGram一起使用。您将获得可靠的数据报传输。这是否可以使用Berkeley套接字?SOCK_DGRAM,因为该类型为您提供UDP套接字。当然,您可以在TCP中封装UDP,但必须在用户空间中处理UDP部分。某些东西是否可靠取决于线路上的协议。如果你使用TCP,它是可靠的;UDP不是 要创建UDP套接字,请执行以下操作: int s; s = socket(AF_INET, SOCK_DGRAM, 0); 要创建TCP套接字,请执行以下操作: in

理论上,没有什么可以阻止将TCP套接字与sockdGram一起使用。您将获得可靠的数据报传输。这是否可以使用Berkeley套接字?

SOCK_DGRAM,因为该类型为您提供UDP套接字。当然,您可以在TCP中封装UDP,但必须在用户空间中处理UDP部分。某些东西是否可靠取决于线路上的协议。如果你使用TCP,它是可靠的;UDP不是

要创建UDP套接字,请执行以下操作:

int s;
s = socket(AF_INET, SOCK_DGRAM, 0);
要创建TCP套接字,请执行以下操作:

int s;
s = socket(AF_INET, SOCK_STREAM, 0);

有两种常见的方法可以通过线路发送离散的数据块。您可以使用UDP并将离散块作为数据报发送,也可以将结构转换为TCP数据,并将其作为流发送。使用TCP通常更简单,更不容易发生故障。如果您使用UDP,只需超时并继续请求相同的数据,直到您得到它。

不太可能。TCP和UDP是来自同一层的协议,它们的功能仅对它们有意义。以listen()和accept()为例


您可以在TCP数据包中发送UDP头+数据,但这毫无意义。 你为什么要那样做?一种隧道工程?事实上,手工解析和构建UDP数据包非常容易,但在您的场景中我看不到真正的应用程序

理论上,没有什么可以阻止将TCP套接字与sockdGram一起使用。您将获得可靠的数据报传输。使用Berkeley套接字是否可以实现这一点

不,Berkeley API提供了不可靠的数据报或可靠的流


如果您想通过TCP发送可靠的数据块,请使用将流拆分为数据块的协议。这很简单。

您想看的是。它提供了通过可靠的TCP连接发送数据报的能力:

与TCP相反,SCTP可能是 以记录为导向,, 这意味着它传输数据的方式是 消息,以类似于 用户数据报协议(UDP),以便 一次发送的一组字节(消息) 变速箱操作(记录)不正确 阅读时要和那群人完全一样 接收器应用程序。TCP是 面向流,传输流 字节数,它会正确地对其重新排序 如果出现无序交货。信息技术 然而,它并不尊重这个信息 边界,即 以原始数据为基础的数据 在发送器上安装变速器单元

看一看SCTP一对一风格的连接,这可能就是您正在寻找的


大多数Unix/Linux操作系统都有实现,Windows也有第三方实现。有关详细信息,请参阅我链接的Wiki文章的结尾。

我还没有看到任何套接字api为您提供此选项,而且它也会破坏TCP让您控制数据对齐的某些目的。TCP只是传输,它的抽象是一个字节流


您必须在TCP的基础上构建自己的消息结构,该结构为您提供了应用层所关心的消息的概念。

您可以模拟事物,但实际上没有理由这样做。要么你想要可靠的交货,要么你想要及时的交货。TCP给出第一个,UDP给出第二个。这两者不能混用,因为TCP通过反复告诉另一端消息直到消息被确认来实现可靠性。对于流式传输,您通常需要可靠的数据传输(因此您可以重新组合流),但对于顺序不重要的小消息(即数据报),您不需要所有的开销(UDP在很大程度上保证消息至少不会到达时出现乱码;这是TCP和UDP在原始IP上提供的功能之一)


当然,在这两个极端之间还有其他一些有趣的例子。对于实时流式数据(例如视频通话),您可以使用,因为您正在进行流式传输,但可以比延迟更好地从数据丢失中恢复。对于UDP太大的消息(64kB是严格的上限,因为UDP报头的长度字段只有16位),无论如何,您都需要使用TCP进行传输,以便可以重新组装片段(因此SOAP通过TCP通过HTTP而不是通过UDP进行传输)。

我所做的是让数据与TCP数据包对齐。这种安排将允许监控工具以确定性的方式解析数据包。“您可以在TCP数据包内发送UDP头+数据”-但这不会使封装的UDP与TCP数据包对齐。如上所述,该场景允许对TCP之上分层的协议进行确定性剖析。依我看,没有理由这么做。如果你想要TCP的好处,就坚持使用TCP,仅此而已。你见过wireshark如何在TCP之上解析协议吗?这是纯粹的启发式。如果协议的单元与TCP数据包不一致,它就会失败。硬件监控设备也是如此。我想我之前的评论不清楚。当我说“没有理由这么做”时,我的意思是将UDP封装到TCP中,而不是关于对齐。为什么需要将数据放在单独的数据包中才能进行“确定性分析?”为什么不能在流中以单独的结构发送数据。使用固定长度,如果长度可变,则使用前两个字节标记长度。那就很容易了。很多协议已经做到了这一点。Wireshark重建流并向您显示内容。“当然,您可以在TCP中封装UDP,但您必须在用户空间中处理UDP部分。”这不会使封装的UDP与TCP数据包对齐。让我以另一种方式提问:有没有办法控制TCP数据在TCP数据包中的对齐方式?您可能可以通过内核实现来实现这一点,但为什么?是的,您可以控制数据的对齐方式,因为您指定了数据!你为什么不用你想要的任何对齐方式构建一个结构,例如struct{int32_t a,b;uint64_t c},然后使用它呢?当然,我知道SCTP,使用过它,和它的创建者交谈过,设计