Syn 三次与FiN四次相关讨论

来源:互联网 发布:大型酒店网络解决方案 编辑:程序博客网 时间:2024/05/21 09:55

     我们知道序列号和确认号是用来保证tcp可靠传输的,序列号的增加通常表示发送的数据多少。但有时候是不是想不通为什么syn和fin也会占用一个序列号。

       首先,tcp是一个支持可靠数据传输的网络协议,怎么做到可靠传输?主要是看“确认”这个步骤来做到的,也就是ack号。用ack号来表达我这边已经收到了你传过来的东西,注意 这里的东西是一个广义的概念,包含了数据和命令两种内容。在可靠的tcp传输过程中,用于建议和释放这个可靠通道的东西就是命令。

         至于为什么需要这两个过程,很简单,可靠的通信需要双方通信之前做一些协商,确认了双方的“底子”,然后喊一声“开始”。同样在结束的时候通知一下对方“我不再发送数据啦”。一个开始,一个结束,这两和过程都是需要双方主动参与和确认回复的,当一方说我想开始一段可靠连接,并且给予了相关自己的情况数据,另外一方,则需要对这一命令进行确认,确认只能通过确认号来做。这个事情在断开连接的时候也是一样的。

         我们知道tcp除了syn和fin还有其它的标志,为什么他们不需要占用一个序列号呢?首先,ack就不用说了,它本身就是为了确认这个动作而生的,如果在给它一个序列号,就意味着还要给这一序列号进行ack,这是一个很奇怪的事情。pus,urg是一个属性,一个附加在一段数据传输上的属性,它不属于命令或数据,rst比较特殊,它似乎是一个命令,但是基本上如果需要用这个命令的时候,tcp的可靠性也基本没有了,所以对这个命令进行确认已经无意义啦。

       总的来说,tcp是用“确认”这个手段来保证可靠的,在tcp整个过程中,我们需要确认syn,fin,两个命令,以及数据传输,这样才能保证可靠。


       三次握手其实是通信双方互喊开始然后确认而已,中间的是为了节约将ack和syn放一起而已,其实这里的放一起,跟数据通信时带着ack的意义是一样的。那么为什么要四次分手呢?不能和三次握手一样吗?不行,因为通信是双方的,你说完你该说的,不代表我就说完了,所以四次握手应该是两次说再见。那这就引出另外一个问题啦,结束的时候可以出现到通道的情况,那开始的时候为什么不能也这样呢?不能是只先一方对另外一方说,如果另一方需要说的时候再开启这个通道吗?但是之所以为什么不这么干可能是因为同时建立双通道的代价并不高,分开建立两个通道的方发会让过程变复杂