TCP的三次握手和四次挥手

TCP的三次握手和四次挥手

三次握手

当客户端使用connect()函数,尝试与服务器进行连接时,默认是堵塞的状态。通过三次握手就可以解堵塞。说是"三次握手",其实细分应该有4个过程。那么我们就先按照"四次握手"来解释一下。
第一次握手:客户端给服务器发送一个数据,记为syn1;
第二次握手:如果服务器接收到了客户端的数据,就会回复一个ack1。这样客户端与服务器的连接就成功建立了。非常美丽。但是tcp是一个全双工通信,所以除了需要客户端与服务器建立连接。服务器也需要与客户端建立连接。这样就产生了后两次握手;
第三次握手:服务器给客户端发送一个数据,记为syn2;
第四次握手:如果客户端接收到了服务器的数据,就会回复一个ack2。
通过四个数据的传送,服务器与客户端之间的连接就真的成功建立了,这次真的是非常美丽了。但是四次握手是怎么变成三次握手的呢。因为每次传送的数据都有一个变量名进行标识,所以我们可以将第二次握手和第三次握手合并,这样就构成了著名的“三次握手”了。
图片来源:https://image.baidu.com/search/detail?ct=503316480&z=undefined&tn=baiduimagedetail&ipn=d&word=%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B&step_word=&ie=utf-8&in=&cl=2&lm=-1&st=undefined&hd=undefined&latest=undefined&copyright=undefined&cs=494606616,1423612774&os=2468997778,2932459994&simid=3378419686,392903005&pn=0&rn=1&di=106040&ln=827&fr=&fmq=1568536835378_R&fm=&ic=undefined&s=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&is=0,0&istype=0&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=0&objurl=http%3A%2F%2Fimages2015.cnblogs.com%2Fblog%2F824317%2F201612%2F824317-20161211213831272-742191218.png&rpstart=0&rpnum=0&adpicid=0&force=undefined&ctd=1568536838106^3_836X630%1

四次挥手

说完了三次握手,那四次挥手是什么情况呢。当客户端调用close()函数时,就会停止发送数据了,此时他会给服务器挥手一次,告诉他我不会再给你发消息了,服务器收到后,会告知收到,就产生了第二次挥手,但由于tcp的全双工,虽然客户端的发送关闭了,但是客户端的接收还是打开的状态,这时服务器就告诉客户端说我也不会给你发消息了,这是第三次挥手,对应的就是服务器调用了close()函数,客户端如果成功接收到讯息,那就会执行第四次挥手,告知服务器收到。

这其中有一个问题,那就是,我的最后一次挥手,客户端怎么知道服务器有没有收到我的告知呢?万一他没收到,继续给我发送怎么办?为了解决这个问题,在第三次挥手后,会等待一段时间,等着客户端给予响应,如果没有响应,如果没有,那就再次执行第三次挥手,这样重复几次,如果一直没有响应,就会进行判断客户端是哪里出现问题了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值