趣谈(思考)TCP建接时三次握手和断连时四次握手

       了解TCP的你们应该知道,TCP 协议是基于连接的(UDP不是面向连接的),先建立好连接,然后再进行传输。建立连接时是3次握手,断开连接是四次握手,一起学习:

三次握手建连-客户端发起:
       Server 端先监听端口,此时Server的连接状态是 LISTEN 状态。

       这时 Client 端准备建立连接,向Server端发送一个 SYN 同步包,Client 端的连接状态为 SYN_SENT 状态。

       Server 端收到 SYN 后,同意建立连接,会向 Client 端回复一个 ACK和SYN,然后Server 端的连接状态变成了 SYN_RCVD。

       Client 收到 Server 的 ACK 后,连接状态变成了 ESTABLISHED 状态,同时Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

       Server 端收到 Client 端的 ACK 后,Server 端的连接状态也变成了的 ESTABLISHED 状态,建连完毕。

 四次挥手断连-双方都可以发起:  

       假设是Client端发起,Client 向 Server 发送了一个 FIN 包,然后 Client 进入了 FIN_WAIT_1 状态。

       Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。

       Server 端会向 Client 端发送 FIN,此时 Server 进入 LAST_ACK 状态。

       Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态,之后才会进入 CLOSED 关闭状态。

       而 Server 端收到 ACK 后直接进入 CLOSED 状态。

       其实这个过程我想大多数人应该都听说过,只是好像容易忘记,因为要理解,而不是死记硬背,只有理解了才会记得牢,我感觉三次握手建连就像你要给别人发什么东西的准备,应该是这么个过程:

你:在不在,我给你发个东西(SYN),收到回下。这相当于Client 向Server端发送一个 SYN 同步包。

他:噢,知道了(ACK)。一直在阿,可以发(SYN),发来嘛,收到回下。这相当于Server端同意建立连接,向 Client 端回复一个 ACK和SYN。

你:噢,在是吧,知道了(ACK),那我准备发了。这相当于Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

       然后双方就开始处理了。每一次确认都不可少,你想如果是2次握手,那可能一方没有确认对方消息,4次握手也显多余,因为是建立连接,Server 端的 SYN 和 ACK就合并为一次发送了,告知对方准备就绪,没必要分两次发送。

       四次握手断连就像说,东西发完了我要撤了,应该是这么个过程:

你:东西基本发完了(FIN)我要撤了,收到回下。这相当于Client 向 Server 发送了一个 FIN 包。

他:噢,好。收到(ACK)。这相当于Server收到 FIN 后,返回 ACK。

可能他要等一会。。。

他:嗯,是都发完了(FIN),那我也要撤了,收到回下。这相当于Server 向 Client 端发送 FIN。

可能你要等一会。。。

你:噢,好,收到(ACK)。我再等一会就撤,你先撤吧。这相当于Client端向Server端回复 ACK。

       四次确认,为什么不是三次,因为断连时两个方向上数据发送停止数据包(FIN)的时间可能不同,所以不能合并发送 FIN 和 ACK,必须都确认,我感觉这在生活中也有例子,打电话时接通了就行,挂电话要问下:说完没?他说说完了。你说:那我也说完了。拜拜。

       UDP传输可能是这样(图摘自网络):

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值