2011-06-22 37 views
0

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

正在发送/接收确认的,这样做的一种方式?

+0

你能阐述一下什么样的数据包或插座?例如。使用TCP套接字,你只需要一个数据流。你看不到数据包边界在哪里。使用UDP套接字,您将收到一个包含recv()的数据包。然后,SCTP协议具有有点像TCP流的SEQPACKET,但保留了数据包边界。 – jkj

+0

它的TCP套接字@jkj的情况 –

回答

2

我在这里假设你指的是应用程序级别的数据包。

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

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

如果在发送下一条消息之前知道对等接收是绝对必要的,那么等待来自对等方的应用级ACK有时是必要的,但同样由于连接延迟而导致这种情况很慢。 TCP的设计并没有考虑到这种方法。

如果通常可用的IP协议不能直接提供你所需要的,你将不得不求助于实现你自己的。

你发送什么样的'数据包'?

RGDS, 马丁

0

使用TCP套接字,你刚才看到您可以接收和发送的字节数据流。你无法知道一个数据包在哪里结束,另一个从哪里开始。

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

如果数据包边界是很重要的,你可以使用UDP但随后的数据包的顺序可能会改变或者某些数据包可能会在途中丢失,不用您知道。

较新的SCTP协议的行为很像TCP(丢失的数据包是重发,分组排序保持不变),但与SCTP插座,使接收端收到一模一样的包,你可以发送数据包。

2

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

相关问题