本文主要是介绍趣谈(思考)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传输可能是这样(图摘自网络):
这篇关于趣谈(思考)TCP建接时三次握手和断连时四次握手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!