在一个客户端/服务器应用程序中,文本数据的长度会在客户端和服务器之间来回发送。如何标记正在发送的数据包的末尾?例如,当服务器从客户端接收数据包时,服务器如何知道客户端数据包已经完全接收?
告诉服务器它将要接收到的数据包的全部长度,还是有一些东西标记数据包的末尾更常见?
发送的一些数据只有几个字符长,而有些则可能有数千个字符。
告诉服务器它将要接收到的数据包的全部长度,还是有一些东西标记数据包的末尾更常见?
发送的一些数据只有几个字符长,而有些则可能有数千个字符。
TCP提供连续的数据流。TCP使用数据包实现,但TCP的整个重点是隐藏它们。
将其视为要在其上绘制的墙壁。墙壁由砖块构成。砖块用砂浆粘合在一起,并涂抹灰泥,使墙面变得光滑。砖块是IP数据包,TCP是灰泥。
因此,您现在拥有了经过平滑处理的TCP隧道,并且希望在其中添加一些结构。您想要绘制方框,以使绘画彼此分离。这就是您要做的事情:在数据中添加一些“管理”结构(在绘画周围添加方框)。
许多协议使用“数据包”的概念,这是一堆数据,以固定格式的管理标头开头。标头包含足够的信息来决定数据包的结束位置;例如,包括数据包长度。HTTP使用Content-Length
标头进行此操作,或者(使用HTTP / 1.1)使用“分块传输编码”,其中数据被分成一个或多个小数据包,每个小数据包都具有仅由小数据包长度指示器构成的简单标头。
另一种方法是使用特殊的终止序列,该序列不能出现在“正常数据”中。如果您的数据是文本,则可以使用值为零的字节作为终止符。
另一种方法是使用自我终止数据。这是一种结构化的数据,可以在任何时候知道元素的结束位置。例如,XML数据组织为嵌套的标记对,如<foo>...</foo>
。当到达结束标记(</foo>
)时,您就知道元素已完成。
从HTTP中获取启示。
使用字符终止序列,或在消息头中指定长度,或使用两者的巧妙组合。
就像HTTP一样:标头以CR-LF-CR-LF结束。如果标头之后有数据,则数据长度在其中一个标头中。