免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: C.J
打印 上一主题 下一主题

TCP的许多不解 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-10-26 17:12 |只看该作者
RFC TCP

Reliability:
    The TCP must recover from data that is damaged, lost, duplicated, or
    delivered out of order by the internet communication system.  This
    is achieved by assigning a sequence number to each octet
    transmitted, and requiring a positive acknowledgment (ACK) from the
    receiving TCP.  If the ACK is not received within a timeout
    interval, the data is retransmitted.
  At the receiver, the sequence
    numbers are used to correctly order segments that may be received
    out of order and to eliminate duplicates.  Damage is handled by
    adding a checksum to each segment transmitted, checking it at the
    receiver, and discarding damaged segments.

是否有问题?

论坛徽章:
0
22 [报告]
发表于 2009-10-26 17:36 |只看该作者
仔细想了想,我觉得如果ack 1丢失了,但是收到ack 2了,那么发送端就认为1和2都成功发送了,这不会引起什么问题
因为1和2确实都被收到了,接受端如果没收到1只收到2,是不会发送ack 2的,所以只要收到ack 2了,那就证明1肯定也被成功的接收了。
tcp不对ack报文进行确认。
如果ack 1中还带有数据,那么如果这个包丢失了,就会产生重传了,也不会引起问题。

论坛徽章:
0
23 [报告]
发表于 2009-10-26 17:42 |只看该作者
原帖由 C.J 于 2009-10-26 17:12 发表
RFC TCP

Reliability:
    The TCP must recover from data that is damaged, lost, duplicated, or
    delivered out of order by the internet communication system.  This
    is achieved by assig ...


我暂时确认是这个答案了。 因为我们近期实现了L2TP,老大说,L2TP这个机制抄的TCP,就是没收到的重传。

论坛徽章:
0
24 [报告]
发表于 2009-10-26 19:28 |只看该作者

回复 #23 C.J 的帖子

你应该相信22楼的帖子。

毫无疑问,既然B把ack1, ack2和ack3都发送出去了,尽管中途ack1丢失了,可以肯定,B已经收到了A发送的报文1和2。否则B不可能发送ack2和ack3的。

这题目估计是你随机想出来的,应该是成块数据流类型。
如果是交互式数据流,并且启用了Nagle算法,则要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。(《TCP/IP协议详解》(卷一))按照这个算法的要求,在ack1报文未收到之前,A是不会发送2和3的。关闭了Nagle的交互式数据流倒是支持你所举的例子。

既然是成块数据流,一般不会一个报文一个ack。即使是一个报文一个ack,那么22楼的理解也是对的,因为报文2都确认了,自然报文1也被收到了,不然B是不会确认报文2的。另外,TCP协议要求双方都要支持“经受时延的ACK"(delayed ack)(RFC 1122),你并没有说ACK一定不会到达A。

这里不涉及超时和重传。

[ 本帖最后由 wangdan1600 于 2009-10-26 19:31 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2009-10-27 09:39 |只看该作者
ack N不代表接收到了第N个报文,而代表期待接收第N个报文,就是说N前面的报文都收到了,现在希望收到N。
tcp协议要求如果没有收到第N个报文(但是第N-1及前面的都收到了),而乱序收到了N+1及以后报文的时候要发送ACK N表示还没有接收到第N个
当发送方连续收到三个ACK N报文的时候可以认为N号报文已经丢失,会立刻重发,而不用等待超时,这是tcp的快速重传算法
不知道说清楚了没有

论坛徽章:
0
26 [报告]
发表于 2009-10-27 10:10 |只看该作者
原帖由 chary8088 于 2009-10-27 09:39 发表
ack N不代表接收到了第N个报文,而代表期待接收第N个报文,就是说N前面的报文都收到了,现在希望收到N。
tcp协议要求如果没有收到第N个报文(但是第N-1及前面的都收到了),而乱序收到了N+1及以后报文的时候要 ...


是这样的,但是这题目描述的不是这个现象。

乱序收到报文是可以的,但是TCP要求接收到乱序的这一方需要发送第一个没被确认的报文。比如说:
B收到了1,2,3,5,6,7这几个报文,B应当把1,2,3送给应用层,并向对端发送ack4(也就是期望接收第四个报文)并启动重传定时器,并把5,6,7这几个报文缓存起来。如果在重传定时器超时后还没收到报文4,则重传ack4,具体重传多少次我忘了。

就这个题目来说,如果没收到报文1,那么应重传ack1,而不会向A发送ack2和ack3。

论坛徽章:
1
技术图书徽章
日期:2013-09-25 21:06:29
27 [报告]
发表于 2009-10-27 23:51 |只看该作者

回复 #1 C.J 的帖子

TCP是面向连接的,UDP是面向无连接的,打个比方:我们平时使用的QQ,我们聊天的文字记录比较重要是使用的TCP协议,而当我们通过视频聊天的时候有大量的视频图像的内容,这个时候就是使用的UDP,因为信息量大,UDP的方式适合。

滑动窗口是传输中的一种机制,保证了发送方和接受方速率匹配的一个过程。

论坛徽章:
0
28 [报告]
发表于 2009-10-28 09:47 |只看该作者
原帖由 yuloveban 于 2009-10-27 23:51 发表
TCP是面向连接的,UDP是面向无连接的,打个比方:我们平时使用的QQ,我们聊天的文字记录比较重要是使用的TCP协议,而当我们通过视频聊天的时候有大量的视频图像的内容,这个时候就是使用的UDP,因为信息量大,UD ...


不是吧,我记得聊天的文字信息也是UDP的。。。IM软件使用UDP而不使用TCP是为了保证他的即时性的,上层应用完全可以保证可靠性,超时重传都由上层来处理,所以UDP完全没有问题

论坛徽章:
0
29 [报告]
发表于 2009-10-28 09:53 |只看该作者

回复 #28 testvpn 的帖子

嗯 文字消息也是UDP的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP