我在进行网络编程时遇到问题。我正在使用TCP协议在服务器和客户端之间进行通信。我的代码正在运行,但我还是无法检测到数据是否已成功发送或是否失败。我有以下问题:
您可以使用C#,Java或PHP进行解释。
答案 0 :(得分:2)
关于TCP / IP如何工作的解释最好留作研究练习,而不是特设的SO问题。虽然通常的第一站可能是Wikipedia,但这可能不会从概念层面给你一个很好的介绍。在评论中还有一个指向TCP tutorial的链接。
然而,实际上,正如名称所述,TCP是一种传输控制协议,它提供了一种可靠传递字节流的机制。给定一个字节流,TCP基本上确保接收器以正确的顺序接收字节。如果流中间的一个字节“丢失”,则TCP可以检测到这一点,并将安排其重新传输。所有这一切对接收方都是透明的。 TCP的神奇之处在于接收方只是从套接字读取数据,并且数据显示完整且顺序正确。
使用TCP套接字时,不处理ACK,NACK和重新传输。所有这些对您的应用程序都是透明的。
现在,您可以检测到另一端已经消失,但您无法知道另一端是否确实收到了您的消息。这是Two General's Problem。
但实际上,如果您对TCP的工作方式感兴趣,请阅读W Richard Stevens' TCP/IP Illustrated。不要试图让你离开,但要理解它,你真的需要离开并阅读它(在线或死树)。
答案 1 :(得分:1)
通常,无论您使用哪种函数发送数据都会返回发送的字节数,您必须对其进行计数并确保它们都已发送完毕。具体示例here。
发送ACK(nowledgement)数据包:在建立与另一个套接字的连接期间,在发送数据时和终止与远程主机的连接时。基本上,它们旨在让对方知道您的结束是否已收到所发送的数据。除非你编写原始套接字,否则你不会对它们进行编码,我不建议这是因为显而易见的原因(例如实现标准)。此外,除非您拥有root / administrator访问权限,否则在大多数系统中禁止打开原始套接字。如果您仍然对原始套接字感兴趣,请阅读this;您还应该阅读TCP RFC及其相关文件。
SSL实现取决于您想要这样做,这意味着,您希望协议如何工作。 PHP特定的OpenSSL函数是here。如果您想了解有关HTTPS内部工作的更多信息,我相信您应该阅读here。
另外,如果您正在制作自己的协议,我相信看一眼Google's Protocol Buffers可能会有用。毋庸置疑,在尝试之前,你应该对互联网如何运作以及你自己进入的目标有所了解。
PS:关于原始套接字,你真的应该尝试用一些C知识来做它们,因为某些原因似乎很少或几乎没有其他语言的文档(可能因为真的没有必要触摸它们)。无论如何,这可能很有用:http://www.tenouk.com/Module43a.html