当使用TCP/IP套接字时,应用程序知道TCP数据报的长度吗?还是说他们只是在一个无限的流中读取(和写入)?
0 533
1
该提问暂无详细描述
收藏
2021-01-26 10:35 更新 高大的香菜 •  1579
共 1 个回答
高赞 时间
0

TCP/IP最基本的抽象是应用程序只能看到字节流,但是应用程序有时可以使用一些“副作用”来推断TCP报文段的边界。比如如果读取速度比发送方的发送速度快,那么在接收方看来,读取数据是突然发生的;再比如,接收方几乎可以一次读取报文中的所有数据,但随后直到接收到下一个报文,接收方只能等待。如果你在recv()上循环,缓冲区为空,你会看到重复接收零字节;当接收一个报文段时,你会看到一个Packet的大小。 当你在发送数据时,一旦你的缓冲区被填满,你会注意到同样的交错,当一个报文段的内存被堆栈释放之后,它就能够分配一个新的报文段,在短暂等待之后,你就可以填充这个报文段了。 如果在异步模式下运行套接字,上述操作通常会更简单。一些API可以查看缓冲区中保存的内容的数量,你可以使用“分块”的方法来增加和减少这些值。还有一些API可以告诉你处理的包的数量,如果用流来查看,你就能够或多或少地看到包的边界在哪里。这些都是间接的东西,不是应用程序应该依赖的东西,但是在实际应用中还是会被用到。

收藏
2021-01-26 10:57 更新 太阳照常升起 •  1394