求求你不要再问我三次握手和四次挥手了!

今天不在累赘TCP是什么,不知道TCP是什么的小伙伴可以看我的上一篇 没人比我更懂TCP了

今天我们来研究一下为什么要三次握手
我们首先看一下TCP的报文
在这里插入图片描述
解读一下几个使用到的属性
seq number序列号: 当SYN标记不为1时,这是当前数据分段第一个字母的序列号;如果SYN的值是1时,这个字段的值就是初始序列值(ISN),这个序列值是随机生成的,怕被被攻击者猜出后续序列号,从而遭到攻击

ack number确认号: 它表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,值 是接收计算机即将接收到的下一个序列号

SYN标志位: 在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。

ACK标志位: 表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。

FIN标志位: 标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接

三次握手过程:

img
第一次握手:A发送一个随机初始序列值seq=x,SYN=1,ACK = 0 (代表请求建立连接)

第二次握手:B接收后向A发送ack number= x+1,SYN =1 ,ACK=1(同意建立连接),并发送随机序列值seq = y

第三次握手:A收到后检查ack number是否正确,若正确,并向B发送ack number = y+1, ACK=1,B收到后确认ack number是否正确,若正确,确认连接。三次握手结束

紧接着问题就来了,两次握手行不行?,四次握手行不行?
解: 不行
三次握手在于我们双方都对对方的seq序列号进行一个确认,二次握手无法保证双方的seq序列号都进行一个确认
所以问题可以转换成,不对序列号做确认会出现什么问题?

想到了前段时间朋友叫我去吃饭

在这里插入图片描述
结果呢,我等了他一晚上都没等到他!
所以,我们需要双方都做一个确认,才能保证通信的可靠,减少资源的浪费

client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。

那四次握手呢?
经过上次的教训,我们开始都要确认对方消息,然后就出现了以下沙雕的对话
在这里插入图片描述
所以三次已经明确是可靠的了,多次显得没有必要

三次是保证双方互相明确对方能收,能发的最低值。理论上讲不论握手多少次都不能确认一条消息是“可靠”的,但通过三次握手后,至少可以确认tcp/ip协议是“可用”的。在此基础上,继续提高握手次数,不过是提高“它是可用的”这个结论的可信程度。

四次挥手:
在这里插入图片描述
第一次挥手:发送FIN标志位= 1,表示我客户端数据已经发送完成,可以释放连接,随机生成一个序列号seq = x
第二次挥手:ACK = x +1 表示对释放连接的请求做了一个确认,随机生成一个序列号seq = y
第三次挥手:发送FIN标志位= 1,表示服务器数据发送完成,可以释放资源,因为回复的还是客户端断开请求,所以ACK = x+1,随机生成一个序列号seq=z
第四次挥手:收到确认回复ACK= z +1 seq = x+1

那么问题又来啦,为什么挥手需要四次呢?
首先在关闭连接的时候,服务器收到客户端发送的FIN报文通知时,只是表示客户端没有数据发送了,但不代表服务器没有数据发送给客户端,所有不能马上关闭连接,等到服务器发送FIN报文给客户端的时候,表示服务端也没有数据需要发送了,这个时候可以进行连接的关闭,这里的ACK报文和FIN报文是大多数是分开来发送的。

今天的文章到这里就要结束了,觉得没毛病的小伙伴点个赞吧!

读者大大:就这?走了走了(第一次挥手)
果咩: 别走别走啊!(第二次挥手)

我这有一份关于java的面试题,大家可以关注我的公众号 果咩z(在最下方!),回复 java面试题 来领取

果咩:好了,这下可以走了(第三次挥手)
读者大大: 快滚!(第四次挥手)

溜了溜了~~
java面试题
java面试题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值