如何在java中的TCP套接字中检测重新传输的数据包以丢弃它们

teo*_*jan 1 java sockets

我有时收到已收到的数据包(我使用嗅探器和系统确认它们).现在我读取所有数据(直到套接字超时),然后发送新请求,但这很难看.我正在考虑使用序列号,但我没有在Socket接口中找到它.有线索吗?

dty*_*dty 6

不,你没有.如果接收TCP堆栈错过了一个数据包,它会重新请求它,但是它不能将原始数据包传递给你,因为它错过了它.如果它收到它已收到的数据包,它将丢弃它.

TCP将按发送顺序传送所有发送的字节.没有别的(好吧,除了断开连接的一些边缘情况).

还有其他事情正在发生.

编辑:

为了清楚起见,我在谈论通过套接字的InputStream传递给应用程序的字节.线路上发生的事情在很大程度上是无关紧要的,除非你有一些可怕的网络重传问题,你正试图调查.如果接收堆栈确实获得了重复数据包,它将确认它,因为如果没有,那么发送方将再次重新发送它.