码迷,mamicode.com
首页 > 其他好文 > 详细

个人对TCP3次握手和4次挥手的理解

时间:2019-03-27 00:01:52      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:tcp连接   三次握手   位置   数据包   传输数据   ase   通信   表示   利用   

首先SYN这个标志位是用于发起TCP连接的,所以第一次握手,A-》B的时候SYN=1,同时第二次握手B-》A的时候,因为要接受其TCP连接,所以其SYN也=1.
 也就是前两次握手 SYN都=1
 
 
然后就可以讨论下SEQ(数据序号)和ACK(确认序号)这两个概念
SEQ是指 当前 数据包在整个数据包中的位置
ACK是指 希望下个数据发过来的首数据的位置
比如0-700的数据接收完了,下一个想接受的是701开始的数据,所以这时候ACK就为701
 
然后再详细说下TCP3次握手中他们的变化
 
首先是第一次握手A-》B,因为是第一次握手,所以 当前数据包 在 整个数据包的位置为 0 
所以此时SEQ=0
又因为对方没有传过任何数据,所以期望对方传的数据包首位也是在0的
所以此时ACK也=0
 
然后是第二次握手B-》A,因为这是B第一次发送数据,所以发送的数据和上面第一次发送数据中所期望的一样,首位数据位为 0
所以此时SEQ=0
又因为A已经发过一次SEQ=0的数据了,所以B期望A发送接下来的信息是从位置1开始的
所以此时ACK=1
 
然后是第三次握手A-》B,如上面第二次B所期待的一样,这次发送的信息是从第1位开始的 所以
SEQ=1
又同时上次B发送过0位置开始的数据包了,所以期待下次的发送数据的位置是1
所以ACK=1
 
到这里 TCP的3次握手就完成了
 
但为什么TCP的连接需要的是3次握手呢?
因为本质上,双方都需要确定一个信息:对方能收到我的消息
所以三次握手就分别有任务了
 
第一次握手,A发送给B,A想要知道B能不能收到自己的消息,所以这时候需要B一个回复,这就是第二次握手的意义——让A知道了B能收到他的消息
第二次握手,B发送给A,是为了回应A告诉他自己(B)可以收到A的消息
但与此同时,B也要确认A能收到自己发送的消息,所以需要一个回复,这就是第三次握手的意义
第三次握手,A发送给B,这时候发过去B一但收到,双方都知道自己和对方的通信莫得问题了,于是就可以开始传数据了
 
所以一般下一个数据包就是含有数据的数据包了
 
 

这时候再说下TCP的4次挥手
因为一般来说 TCP连接在不断传输数据,一但有其中一方要发起断开连接,双方也都有要确认的事——
对方都没有数据需要传了
 
同时需要知道一点,TCP中是利用FIN 这个终止标志位(就如发起连接时的SYN一样)来标识一个断开连接的请求的
这时候就可以开始说4次挥手的过程了
 技术图片

 

技术图片
 
首先是其中一方,称为主动方,主动发起了断开连接的请求A-》B,
这是第一次挥手,其FIN=1,SEQ=X,ACK=Y(代表任意)
这时候有可能被动方还有数据要传送,所以下一次挥手不能直接发送FIN=1来断开连接,这也是和握手之间的区别
但是同时第二次挥手也要发出“我知道你要断开连接了,让我先传了这个数据包”
 
所以第二次挥手,B-》A,此时因为B还有数据要传,传的开始的位置是第一次挥手中ACK的值,所以此时SEQ=Y
同时,所以ACK要等于第一次挥手其数据包位置SEQ+1的值,也就是X+1
 
然后就开始了第三次挥手,这时候终于传完了数据,B-》A再发了一个数据,并且FIN标识=1,代表B也完事了,同时发一个档期数据位置SEQ=Z ,这时候这个Z是第二次挥手时候数据包位置Y加上第二次挥手传输数据的长度=Z,因为不知道数据长度,所以这里也只能用Z来表示。同时ACK=第一次挥手的时候,A的当前数据包位置X,因为B已经知道A要断连了,所以不期待更新的数据包了,所以ACK也就只到X为止了。
 
然后就是A-》B的第四次挥手,让B知道A也收到了你的FIN结束消息,A也不期待有下一个新的B数据包了,所以ACK也不动了,设置为了第三次挥手时B发送的数据包位置Z了,同时自己的SEQ也还是X,没有新的数据所以不变了
 
这就是对TCP3次握手和4次挥手的理解

个人对TCP3次握手和4次挥手的理解

标签:tcp连接   三次握手   位置   数据包   传输数据   ase   通信   表示   利用   

原文地址:https://www.cnblogs.com/EatMedicine/p/10604765.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!