有关TCP应用层超时重发的问题

oldmtn 2014-08-03 07:02:39
目前使用TCP在服务端和客户端已建立一个连接,服务端发送一个数据包A给客户端,然后设置了一个1秒的超时;
假设在客户端接收到A之前,已经超时,那么此时服务端会再次发送A;

请问此后客户端有没有可能2次都接收到A?

因为是TCP,其本身已具有超时重发的机制,那么第一个数据包A若没有被客户端收到的话,TCP自己会重发的。

这样一来客户端就2次接收到A了,请问是不是这样?
...全文
887 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljs966 2016-11-24
  • 打赏
  • 举报
回复
自己在写程序也会用到像TCP这样的协议来传输东西。比如发送了123后 当你的超时时间到了没有接到对方的回应,此时有接受到了456,程序有循环了一遍有吧456给发送出去了,那么这个超时判断在什么时候判断重发呢 ,,难道是发送123然后等着什么都不干让对方发送应答吗?
worldy 2015-03-13
  • 打赏
  • 举报
回复
引用 7 楼 oldmtn 的回复:
那请指教如何使用TCP真正确保可靠传输?
TCP协议本身就是确保在不可靠的网络下可靠的传输,LZ不需要有此担心
shenyi0106 2015-03-13
  • 打赏
  • 举报
回复
如果LZ没有人为的调用多次send的话,接收端是不会受到两次相同内容的。 因为TCP协议栈发送端存在发送窗口用来进行拥塞和流量控制,接收端同样存在接收窗口,协议栈如果在一个过程中受到两次相同的包,会自动覆盖上一次受到的内容,这些过程对7层透明
oldmtn 2014-08-04
  • 打赏
  • 举报
回复
那请指教如何使用TCP真正确保可靠传输?
SiGoYi 2014-08-04
  • 打赏
  • 举报
回复
感觉楼主好像是在代码里自己做了处理,自己做处理是会收到2次的,如果是TCP的话如果网络正常的话基本都会成功发送的,只有异常情况下才会发不过去,楼主不用怀疑tcp,它自己有处理,我们干预不了。
  • 打赏
  • 举报
回复
引用 3 楼 oldmtn 的回复:
[quote=引用 1 楼 my3439955 的回复:] tcp是传输数据的工具,你告诉tcp什么东西,tcp就帮你传输什么东西。你告诉tcp一个abc,tcp就传输abc。如果中途遇到不稳定,tcp自动重传。但是无论如何,tcp只会给对方的接受者上报abc或者错误。 重传是内部的机制,应用层是看不到的
中途遇到不稳定,这个和我的问题有点出入。 我是这么想的,就是TCP发送一个包A,中途没有问题,并且在中途过程我自己设置的超时到了,又将包A发送一次,那么客户端很可能就一次性收到2个包A。 [/quote] 首先你设置的那个超时不是tcp内部的超时,tcp内部重传的超时是无法简单就能干涉的 其次就算tcp内部重发了包,和上层应用无关 第三,如果是你自己重发了包,那需要自行处理。不过我很怀疑你已经做到了自行重发包,tcp不是这么用的
Eleven 2014-08-03
  • 打赏
  • 举报
回复
如果你的应用程序由于超时再次调用send函数又发一次的话,你的接收端是有可能收到2次A的。
oldmtn 2014-08-03
  • 打赏
  • 举报
回复
引用 1 楼 my3439955 的回复:
tcp是传输数据的工具,你告诉tcp什么东西,tcp就帮你传输什么东西。你告诉tcp一个abc,tcp就传输abc。如果中途遇到不稳定,tcp自动重传。但是无论如何,tcp只会给对方的接受者上报abc或者错误。 重传是内部的机制,应用层是看不到的
中途遇到不稳定,这个和我的问题有点出入。 我是这么想的,就是TCP发送一个包A,中途没有问题,并且在中途过程我自己设置的超时到了,又将包A发送一次,那么客户端很可能就一次性收到2个包A。
dvlinker 2014-08-03
  • 打赏
  • 举报
回复
丢包重传应该是需要人为干预的,没做过相关东西,帮忙顶一下!
  • 打赏
  • 举报
回复
tcp是传输数据的工具,你告诉tcp什么东西,tcp就帮你传输什么东西。你告诉tcp一个abc,tcp就传输abc。如果中途遇到不稳定,tcp自动重传。但是无论如何,tcp只会给对方的接受者上报abc或者错误。 重传是内部的机制,应用层是看不到的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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