超详细解释什么是三次握手,四次挥手!看完不会你来打我

最近可能是和网络干上了,就想写一点儿和网络有关的东西。
今天给大家讲一讲什么是三次握手和四次挥手。

在tcp/ip四层协议中,将网络通信模型划分为四层,分别是应用层,传输层,网络层,网络访问层。今天我们要说的这个,位于传输层中。
tcp协议在传输层中可谓是家喻户晓的协议,它是一种面向连接的稳定的传输协议,既然他面向连接,那么,在我们使用和结束时,肯定要进行连接的创建和关闭。
而我们的三次握手,就是发生在tcp协议的连接时。我们首先来说几个英文单词,哦,不对,应该是英文单词的缩写。
SYN : Synchronization : 同步
Seq : Sequence : 序列
Ack : Acknowledgment : 答复
Fin :Finish:结束

看到这里肯定有暴躁的看官老爷要问了,妈的,不好好讲主题,说这几个英文单词有什么用
而我也知道,如果今天不给一个令人满意的答复是不可能活着走出去的, 听我细细到来

下面挂上一张我从网上偷来的图
在这里插入图片描述
如图所示是一个tcp的报文结构,下面一边听我说,一边看看图,会很快理解的。
图中的32位序号我们使用小写seq来表示,32位确认序号使用ack来表示
而SYN,ACK标志位就用它们本身的大写字母来表示,大家可千万不要搞混了。

接下来就是大家最喜欢的名词解释环节

名词解释

seq(小写) : 大家都知道,TCP是一种面向连接的、可靠的基于字节流服务,而保证数据传输时的顺序性,就是它可靠性的一个重要体现。而我们tcp就是通过给每一个报文加上seq序列号来进行顺序的判断。另外,要注意一下,序号是建立在传送的字符流之上的,而不是建立在传送的报文段的序列之上,也就是说,假如说报文段A是位于报文段B的相邻前方的一个报文端, 报文段A有1000个字节,并且A的序列号为1,那么报文段B的序列号就为1001,各位看官老爷细细品味其中的玄机。
** ack ** : 代表了服务器端期望接收的下一个序号是多少,所以你看下面会发现服务器端返回的ack的值永远比客户端发送的seq大
ACK(大写) : 大家可以看到上图中那几个竖着的大写英文字母,一共有六组,TCP报文端的首部有六个比特位,分别对应六个标志,上面6组英文字母就对应着六个标志,ACK就是其中之一,当它的值为1的时候,就代表某一方已经接受到了请求。
** SYN **(大写) : 六个标志位之一,代表是一个建立连接的请求。

三次握手

我们的客户端(请求资源)和服务器端(发送资源)的建立连接是通过三次数据包的发送,所以我们形象的将其称为三次握手。

First

第一次发送时,由客户端向服务器端发送包,其中SYN标志位的值为1(表示是一个同步的请求,也就是说,代表了这是一个客户端希望和服务器端建立连接的请求)。ACK的值肯定为0啦,然后将发送序号设置为一个随机生成的随机数X,这里假设为1000。客户端随及进入了SYN发送状态。

Second

第二次发送的时候,是服务器像客户端发送包,SYN和ACK两个标志位都为1,发送序列号Y(同样是随机生成的),确认序号为1001(确认序号是在第一次发送包的发送序号基础上加上一个数字,为了方便解释,这里就记为1)。从此刻开始,服务器进入了同步(SYN)接收状态。

Final

第三次发送,客户端将服务端发送的SYN和ACK包接收到后,返回ACK包代表确认, 接受序列号为Y + 1, 从此以后,客户端和服务端就都进入了连接建立状态,三次握手完毕。可喜可贺,可喜可贺。

小小的彩蛋

为什么是三次握手,两次握手不可以吗?

既然人家都叫做是三次握手了,肯定这么做是更好的了。。。。别冲动,,各位看官老爷将手中的刀放下,听我慢慢道来。当我们通过两次握手就可以建立连接时,客户端向服务端发送了连接请求A,但因为网络延迟,在服务端还没有收到这次请求的时候,客户端着急的发了第二次连接请求,这次连接成功了,大家心满意足的完成了不为人知的交易后,连接A这时却发给了服务端,服务端进行确认,但是客户端已经将延迟的请求做无效的处理了,所以,服务端会向牛郎等织女一样,这无疑会耗费我们服务端很多的资源,并且除了以上情况还有可能造成"死锁",因为篇幅问题,这里不加叙述了,感兴趣的客观老爷可以自行百度。

当我们的连接建立后,客户端出现故障怎么办?

当我们的客户端和服务端正在进行愉快的交易时,客户端突然出现故障,无法继续发送数据,这时,服务端不会立即停止交易,而是会在小段时间内,规定次数之内进行报文探测,依然得不到回应的话,才会关闭连接。

四次挥手

First

客户端发送FIN+ACK请求表示请求结束连接

Second

服务器端接收到客户端的请求,返回ACK表示收到请求,并让客户端继续等待自己将自己所有的数据发送完毕。

Third

服务端的数据发送完毕后,会向客户端发送FIN + ACK,表示这边数据已经发送完毕了。

final

客户端向服务器发送ACK,表示接收到了,然后服务器就放心的关闭了,然后客户端会等待一会儿,如果没有任何回复的话,就认为服务器已经关闭了,自己也就关闭了。

到此为止,四次挥手也完毕。。。。可喜可贺,可喜可贺

又到了和看官老爷告别的时候了
最后,小鲨祝大家万事如意,身体健康,天天有水果吃!!!

发布了3 篇原创文章 · 获赞 2 · 访问量 1141

猜你喜欢

转载自blog.csdn.net/weixin_44880685/article/details/104719615