TCP是否会自动重发?

james_hw 2011-03-13 04:47:06
现在有一个现象,客户端发送了一条消息,服务器端有较小概率收到2条一模一样的消息。

当时的链路情况不是很稳定,不知道有没有朋友遇到同样的问题?

怀疑会不会在链路不稳定时,底层socket会自动重发
...全文
488 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanghehong 2011-03-13
  • 打赏
  • 举报
回复
TCP作为一种可靠传输协议,是有超时自动重传机制没错。

RFC 793:

. If the ACK is not received within a timeout
interval, the data is retransmitted.

不过这个重传对应用程序是透明的,对应用来说,这会收到一个,因为TCP加序号然后做了重复的过滤:

At the receiver, the sequence
numbers are used to correctly order segments that may be received
out of order and to eliminate duplicates.

楼主这个问题,得再自己对自己的发送和接受应用程序做更仔细的调试。基本上和TCP无关。


- 千里孤行


maoxing63570 2011-03-13
  • 打赏
  • 举报
回复
记得,如果因为网络传输超时,TCP协议会对重复得到的包直接丢弃,然后发送确认
arong1234 2011-03-13
  • 打赏
  • 举报
回复
虽然都可能出错,但是TCP底层出错的可能性比你程序出错的可能性要小得多,因此仅仅根据自己日志就去怀疑TCP是没有道理的。

最直观的办法是在发送端和接收端同时用netmon或者其他sniffer抓包,看看到底谁发了重复的报文
[Quote=引用 6 楼 jamesf1982 的回复:]
引用 4 楼 qq120848369 的回复:
再咋样收到两条说明客户端用户自主发送了两次,与协议无关。

通过日志验证的确只send了一次
[/Quote]
arong1234 2011-03-13
  • 打赏
  • 举报
回复
TCP会自动过滤多余的自动重传消息,你服务器收到重复的消息应该和TCP无关,因为TCP确保你收到且只收到一份你发出的消息
[Quote=引用 2 楼 jamesf1982 的回复:]
引用 1 楼 csuxiaowu 的回复:
TCP 协议中的自适应的超时重传

能说明一下这个超时重传机制么?有没有办法防止服务器端收到2条一模一样的消息?
[/Quote]
james_hw 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
再咋样收到两条说明客户端用户自主发送了两次,与协议无关。
[/Quote]
通过日志验证的确只send了一次
james_hw 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 freefice 的回复:]
异步通信机制,需要添加流水号与校验码,根据流水号确定是否是重发信息,根据校验码确定是否要重发。
[/Quote]

这是一个办法,不过服务器端为每个客户端分配流水号与校验码则工作量亦不轻松。能否从socket上配置避免其自动重发?
qq120848369 2011-03-13
  • 打赏
  • 举报
回复
再咋样收到两条说明客户端用户自主发送了两次,与协议无关。
庄鱼 2011-03-13
  • 打赏
  • 举报
回复
异步通信机制,需要添加流水号与校验码,根据流水号确定是否是重发信息,根据校验码确定是否要重发。
james_hw 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csuxiaowu 的回复:]
TCP 协议中的自适应的超时重传
[/Quote]
能说明一下这个超时重传机制么?有没有办法防止服务器端收到2条一模一样的消息?
Csuxiaowu 2011-03-13
  • 打赏
  • 举报
回复
TCP 协议中的自适应的超时重传

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧