我有时收到已收到的数据包(我使用了嗅探器和系统确认它们)。现在我读取所有数据(直到套接字超时),然后发送新请求,但这很难看。我正在考虑使用序列号,但我没有在Socket接口中找到它。有线索吗?
答案 0 :(得分:6)
不,不。如果接收TCP堆栈错过了一个数据包,它会重新请求它,但是它不能将原始数据包传递给你,因为它错过了它。如果它收到了它已收到的数据包,它就会丢弃它。
TCP将按发送顺序传送所有发送的字节。没有别的(好吧,除了断开连接的一些边缘情况)。
还有其他事情正在发生。
编辑:
要清楚,我在谈论通过套接字的InputStream传递给应用程序的字节。线路上发生的事情在很大程度上是无关紧要的,除非你有一些可怕的网络重传问题,你正试图调查。如果接收堆栈确实收到重复的数据包,它会确认它,因为如果没有,那么发送方将再次重新发送它....
答案 1 :(得分:2)
听起来你正试图解释TCP已经处理过的事情。它具有内置的序列号,并将为您处理任何丢失的数据,并且从接收点应等待,直到您收到所有预期的数据,而不是重新发出请求。如果您不想在发出新请求之前等待响应完成,请考虑使用多个连接进行管道连接请求。