免费注册 查看新帖 |

Chinaunix

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

有个疑惑 TCP协议的 [复制链接]

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
11 [报告]
发表于 2008-11-20 16:48 |只看该作者
对头。

悟性不错。

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
12 [报告]
发表于 2008-11-20 20:32 |只看该作者
原帖由 ssffzz1 于 2008-11-20 16:48 发表
对头。

悟性不错。


牛人。

论坛徽章:
0
13 [报告]
发表于 2008-11-21 10:22 |只看该作者
你这个问题根本就不存在,不需要担心。

因为即使这个情况出现,那TCP也会把FIN方作乱序包。

网络层是不可靠的,TCP最初设计的目的就是可靠传输,当FIN包的序号和上次收到的最大序号不是无缝连接的时候,是不会确认的。

另外,好像FIN包是在所有的包都确认收到后才终止的吧?(不确认)

论坛徽章:
0
14 [报告]
发表于 2008-11-21 15:38 |只看该作者

回复 #5 godlight 的帖子

检查位偏移和identification字段
仔细阅读协议标准

论坛徽章:
0
15 [报告]
发表于 2008-11-21 15:59 |只看该作者
原帖由 hritian 于 2008-11-21 10:22 发表
你这个问题根本就不存在,不需要担心。

因为即使这个情况出现,那TCP也会把FIN方作乱序包。

网络层是不可靠的,TCP最初设计的目的就是可靠传输,当FIN包的序号和上次收到的最大序号不是无缝连接的时候,是 ...


同意,乱序包是不会确认的

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
16 [报告]
发表于 2008-11-21 18:44 |只看该作者
LZ我觉得可能误导你了:

我的意思是在IP协议层面,只要不丢包,B都会收到,但是,在TCP层面,如果先收到一个IP包里面的TCP包是FIN=1,那在这个IP包后面收到的IP包会不会因为之前的那个IP包里面的TCP包FIN=1做了断开连接,而不在进行IP包的分片重组呢

此时应该是进行重组的,因为重组是IP层的事情。而和TCP无关的。因此TCP收到的是重组后的包,但结果是丢弃。

论坛徽章:
0
17 [报告]
发表于 2008-11-21 19:12 |只看该作者
学习。

论坛徽章:
0
18 [报告]
发表于 2008-11-22 11:20 |只看该作者

给你一个详细解释吧

1、IP分片的情况。IP软件包有一个[分片]和[重组]模块,一个IP数据报在传输中可以被ip软件包的[分片]模块分片,在目的接收端B的IP软件包的[重组]模块重新组合。接收端B的IP软件包如果收到乱序的IP报文,是不会把这个包交付到高层TCP协议的,直到收到同一个IP报文的全部分片。所以,如果发送端的FIN被分片,接收端B在收到完整的此IP数据报之前,TCP模块不会收到这个包的任何分片。

2、发送端A发送了一个FIN,这仅代表发送端A想终止传输,并不代表另一端B想终止。这就是说,终止双向链接需要4次握手断开(也有3次握手断开,类似3次握手链接),比如,发送端A向发送端B发一个查询请求,发送端A已经没有更多的数据要发送了,因此可以发送FIN请求一端断开,也称为半断开,然后,另一端B则需要时间处理请求,再把查询结果返回给A,最后B发送FIN。
1)首先是A发送FIN,然后收到来自B的对这个FIN的确认,此时,发送端A将不能发送任何数据包,但可以接受B发来的数据包(这是非常常见的传输模式,客户端发完,终止链接)。
2)发送端B仍旧可以继续发送数据包,直到高层没有更多的数据,发送端B发送FIN,A收到后发送对这个FIN的确认。此时,双方都不能再传输任何数据了。

3、TCP协议规定,对于收到的乱序报文并不丢弃,而是缓存下来(这样做是为了减少更多的重传),立即发送希望接受的报文确认。例如:发送端A发送了以下几个包:第一个:1001-1100,第二个1101-1200,第三个FIN包(序列号是1201,一个虚字节)。
1)第二个包在传输的过程中丢失了,接收端收到第三个包后并不丢弃,而是缓存下来,然后,立即发送一个ACK,确认号是1101(这样做的目的是不必等到发送端A的第二个包超时后重传,发送端A收到3个同样的ACK后立即重传,这是快速重传的概念)。
2)当发送端A收到3个确认号都是1101或者第二个包的超时计时器到时间后,立即重新发送第二个包(之所以可以重传,是因为TCP协议在接收端和发送端都各自建立了两个发送、接收缓存)。
3)这样,当接收端B收到来自A的第二个包后,缓存中的数据都是按序的了。
4)对于按序包,接收端B对序列号的最后一个字节+1,也就是发送确认号是1202的ACK包。
5)发送端A收到确认号是1202后,便不能再发送任何数据了。

[ 本帖最后由 a_la_lei 于 2008-11-22 12:04 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2008-11-23 09:56 |只看该作者
原帖由 a_la_lei 于 2008-11-22 11:20 发表
1、IP分片的情况。IP软件包有一个[分片]和[重组]模块,一个IP数据报在传输中可以被ip软件包的[分片]模块分片,在目的接收端B的IP软件包的[重组]模块重新组合。接收端B的IP软件包如果收到乱序的IP报文,是 ...


不得不顶

论坛徽章:
0
20 [报告]
发表于 2008-11-25 13:30 |只看该作者
又重新复习了一下。有了不同于学习时的理解。
尤其感谢A_LA_LEI
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP