TCP为什么需要三次握手和四次挥手

首先,我们要知道网络传输是有延迟的,可能丢失的,不是说A发一个包给B,B保证能立刻收到,甚至B可能一直收不到。


三次握手

  1. 第一次。A跟B说,我要建立连接了。
  2. 第二次。B跟A说,OK,那我也建立连接。
  3. 第三次。A跟B说,嗯,我知道了。

第二次和第三次都是为了保证连接是可靠的。
假设只有一次握手,而A的包无法发到B那里去,那A就是自顾自的建立了连接,傻傻的发信息,却不知道对方其实根本收不到。所以第二次握手是为了告诉A,B收到了你的信息。
假设只有两次握手,那么对B来说,B是不知道A是否收到了自己的信息的,第三次握手是为了告诉B,A收到了B的信息了,并且可以互发信息了。 B真的需要知道 A是否收到了自己发出的第二次握手的信息吗?是的,如果A的第一次握手因为某些原因延迟很久才到B,而其实现在A和B已经聊完天,关闭连接了,这时B发出第二次握手,而A已经没什么想跟B说的,就不会发出第三次握手,这样B就不会建立连接消耗资源。若是只有二次握手的这种情况,B会直接建立连接消耗资源。


四次挥手

  1. 第一次。A跟B说,我要断开连接了。
  2. 第二次。B跟A说,好的,我知道了,我不再接收你的信息了。
  3. 第三次。B跟A说,我传给你的信息传完了,你可以关闭连接了。
  4. 第四次。A跟B说,好的,我关闭连接了。

第二次挥手是为了告诉A,B知道你不再发送信息了,且B不再接收信息。但B仍可以向A发送信息。因为A是主动关闭的一方,但B可能仍然有信息未发送完。
第三次挥手是为了告诉A,B的信息发完了,A你可以关闭连接了。
第四次挥手是为了告诉B,A我知道可以关闭连接了,你也可以关闭了。对B来说,第四次挥手B才知道A成功关闭连接了,不关闭很耗费资源,所以要保证关闭了。若B接收不到第四次挥手信息,将会继续第三次挥手,直到收到确认信息为止。
注意:对A来说,第四次挥手后2MSL内未接收到B的第三次挥手信息才会关闭连接,否则会继续第四次挥手。防止B接收不到第四次挥手信息。(若B接收不到第四次挥手信息,将重复发送第三次挥手信息,这个2MSL就是如果真的有重复发送的第三次挥手信息,在这个时间内肯定到达A了(路由不出问题的话),就是为了保证B收到第四次挥手信息)


另,TCP报文有 序号(seq) 和 确认号(ack)

  • 序号是对要发送的数据进行编号。
  • 确认号是上一个接受的数据的序号+1,同时也是下一次期望接受的数据的编号。

这个序号和确认号还有防止DDOS攻击的作用,比如我伪装很多虚假IP向服务器第一次握手,而服务器向那些IP发出第二次握手请求,但因为我是接收不到第二次握手的序号的信息的,那我伪造的第三次握手就不能成功,就不能骗服务器不断创建连接,消耗资源了。(这不能避免服务器就一直进行第二次握手)

还有符号位,FIN,SYN,ACK等
SYN=1是连接请求或连接接受的意思
ACK=1是这是一个确认报文的意思
FIN=1是释放连接的意思。(比如A对B发FIN=1的报文,表示A不再发报文,所以第一、三次挥手的FIN位是1)

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值