TCP / IP实施一般问题

时间:2013-11-09 02:38:54

标签: c# sockets tcpclient tcp-ip tcpserver

我已经实现了这里显示的概念; http://wiki.unity3d.com/index.php/Simple_TCP/IP_Client_-_Server在团结之外,它有效。 (虽然我不得不从头开始创建TCPIPServerApp,因为我无法在任何地方找到基础项目)。

我有一些关于如何正确使用tcp / ip的一般性问题。我已经对tcp / ip本身进行了一些研究,但我仍然有点困惑。

似乎使用上述方法并不能保证我会看到消息(res)。它只检查每次更新,以查看res中是否有不同的消息。如果发送多条消息并且程序滞后或者什么,我会错过早期的数据包怎么办?我应该做一个数组,以便存储最后的X条消息吗?

我如何知道收到的数据?我是否需要添加消息ID并在我自己的ack中构建数据?

在设置连接之前,我应该检查端口是否正在使用吗?

对不起所有问题。这对我来说都是新的,但我非常喜欢这个!

......下面已经回答安东,谢谢

听起来tcp使用自己的数据包编号来确保数据包在另一端以正确的顺序结束。如果丢失数据包,后续数据包会被丢弃怎么办?或者这是编号和数据包排序,仅用于处理分解为多个数据包的数据?

TCP会在必要时自动将数据分成多个数据包吗?

1 个答案:

答案 0 :(得分:0)

首先,TCP是一个连接完整协议,因此在发送任何段(因此在TCP级别调用的数据)之前,使用标准TCP握手连接客户端和服务器 TCP handshake

因此,在客户端收到的每个段之后,它会发回一个确认。所以只有在那之后服务器发送另一个段。实际上他们不发送一个段,但为了减少流量,服务器可以发送许多段。但是,想法仍然是一样的。同样,TCP是一种可靠的协议,与UDP相比,客户端永远不会发回确认。因此,UDP的一个例子是任何射击游戏,我们不依赖于每个细分市场。每个人都肯定在游戏中看到了所谓的滞后。

当然,TCP使用ack ID来确定该段是否已被确认!但它还需要知道如何构建所有段。记住所有数据是分批发送的,之后需要重新构建!

再次,TCP细分数据如何取决于许多因素,并且它足够聪明,可以找到最佳方法。例如,某些网络可以使用防火墙来阻止大于某个大小的数据包。因此,TCP段大小可以不同。