我如何确定一个数据包的结束位置和另一个数据包的开始位置

时间:2011-06-22 11:45:01

标签: sockets tcp network-programming

在通过网络发送数据包时,如何确定一个数据包的结束位置以及另一个数据包的开始位置?

发送/接收确认是否是这样做的一种方式?

3 个答案:

答案 0 :(得分:2)

TCP是基于流的协议。也就是说,它为应用程序提供流与数据包或基于消息的接口。如果使用TCP,则应用程序必须实现自己的确定数据包或消息的方法。例如,(a)所有消息都是固定大小,或者(b)每个消息都以其后续大小为前缀,或者(c)数据流中有一个特殊的“记录结束”序列来指示消息边界。在谷歌搜索有关如何在TCP中实现消息边界的大量信息。

答案 1 :(得分:1)

我在这里假设您的意思是应用程序级别的“数据包”。

如果使用UDP,则不需要,因为它是消息协议。 TCP是字节流协议,因此它不能发送数据包,只是字节。如果你需要在TCP上发送比字节流更复杂的东西,你必须在顶部添加另一个协议 - HTTP就是这样一种协议。文本相当容易,因为行有终止字符,通常是CR / LF / CRLF。发送非文本消息需要不同的协议。

TCP经常使用的一种方法是连接,流式传输协议单元,断开连接。这可以正常工作,但由于持续打开和关闭TCP连接的巨大延迟,这种情况很慢。 HTTP通常像这样工作,以便向大量用户提供网页,如果他们在查看页面时保持永久连接,则会不必要地耗尽所有服务器套接字。

如果在发送下一条消息之前已知对等接收绝对必要,则有时需要等待来自对等方的应用程序级别的ACK,但由于连接延迟,这种情况很慢。 TCP没有考虑到这种方法而设计。

如果常用的IP协议无法直接提供您所需的IP协议,您将不得不求助于实现自己的协议。

你发送了什么样的“数据包”?

RGDS, 马丁

答案 2 :(得分:0)

使用TCP套接字,您只需看到可以接收和发送字节的数据流。您无法知道数据包的结束位置和另一个数据包的开始位置。

这是TCP的一个功能(和问题)。大多数人只是将数据读入缓冲区,直到看到换行符(\ n)。然后处理数据并等待下一行。如果传输大量二进制数据,可以先通知接收方有多少字节的数据。

如果数据包边界很重要,您可以使用UDP,但数据包顺序可能会发生变化,或者某些数据包可能会在您不知情的情况下丢失。

较新的SCTP协议的行为与TCP非常相似(丢失的数据包重发,保留数据包排序),但使用SCTP套接字,您可以发送数据包,以便接收方获得完全相同的数据包。