2013-01-13 71 views
3

尽管TCP是一种可靠的协议,它提供了重传和确认机制,但我相信它不是100%可靠的,因为send()的成功返回并不能确保数据已到达目标端点,并且仅意味着数据被复制到内核​​缓冲区。TCP 100%可靠吗?

应用程序是否有任何机制知道数据是否已成功到达目的地?

一个可能的解决方案可能是在应用程序层建立一些确认机制?

+6

事实上,如果您不能相信您的平台的TCP实现,那么在您的应用程序层建立一个确认机制。 –

+2

然后,确认机制100%可靠吗? –

+7

不可能使任何协议100%可靠。见[两个将军问题](http://en.wikipedia.org/wiki/Two_Generals'_Problem) – Barmar

回答

-2

当然TCP是可靠的协议,如果你想知道通过网络端口发送和接收的数据,使用wireshark软件捕获传输和接收的数据。通过wireshark你可以追踪数据包。

+0

如何使用wireshark远程帮助_application_知道是否它的传输被收到了?! – Alnitak

+0

请看看如何使用wireshark你可以捕获正在远离你的机器的数据包和进入你的机器的数据包 –

+1

你错过了这一点。当然,您可以使用wireshark进行交通流量的“第三方”分析。你不能使用它是为了告诉特定的应用程序它自己的数据包是否已被接收。 – Alnitak

1

您可以构建自己的应用程序,由接收方向发件人回复成功消息,如果没有收到成功消息,则根据需要重新发送。

在Java中,JMS做这个工作,我认为应该有一些现有的库做相同的C.

2

TCP是在这个意义上可靠发送要么

  1. 接收他们的信息(相同的顺序,相同的内容);假设内置的校验和不发生故障,它可能,因为它是唯一的16位OR
  2. 并不

接收使用TCP,接收到的消息不应该OUT-有序或缺少中间消息。

要区分个案1和2,您应该实施确认机制。一个好的想法也可以确保优于CRC的消息完整性是发回MD5或其他传入消息的散列。

+0

TCP使用校验和,而不是CRC。 – Barmar

+0

@Barmar CRC _is_校验和! – Alnitak

+0

CRC不仅仅是一个校验和,它使用位移来防止重新排序,校验和不会检测到。 – Barmar