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