概述
重要的标志位含义:
- ACK:表示确认。只有当ACK标志位为1时,TCP报文的确认字段才有效。
- SYN:表示同步,在连接建立时用来同步序列号。当SYN=1而ACK=0时,表明这是一个连接请求报文。若对方同意建立连接时,则在响应报文中,应使SYN=1,ACK=1.因此,同步比特SYN置为1,就表明这是一个连接请求报文或连接接受响应报文。
- FIN:用于释放一个连接。当FIN位为1时,表明此报文段的发送端数据已发送完毕,并要求释放连接。
一、TCP/IP的三次握手
- 第一次握手:首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求SYN(X),进入SYN_SENT状态,等待接收方主机确认。
- 第二次握手:接收方在收到这个请求后,如果同意建立连接,则发送确认ACK,确认序列号为收到的序列号加1,并且报文中的SYN也要置1,即向发送方主机回复一个同步/确认(SYN/ACK)应答报文,并进入SYN_RECVD状态。
- 第三次握手:发送方主机收到此应答报文后,再向接收方发送一个确认(ACK)报文,然后发送方和接收方均进入ESTABLISHED状态,完成三次握手,至此,TCP连接建立成功,发送方和接收方就可以开始传输数据了。
TCP建立连接的三次握手过程如图所示:
二、TCP/IP的四次断开
当应用进程结束数据传送后,就要释放已建立的连接,TCP连接是双向的,每个方向都必须单独进行关闭,首先进行关闭的一方执行主动关闭,而另一方则执行被动关闭。
- 1、当客户端的数据传输完后,可主动发送出FIN置1的报文给服务端(客户端主动关闭),以关闭客户端至服务端方向的数据传送,并等待服务端的ACK确认应答,同时进入FIN_WAIT1状态。
- 2、服务端收到FIN置1的报文后,进入被动关闭,回复一个ACK确认报文,并进入CLOSE_WAIT状态;客户端收到该ACK确认报文后,进入FIN_WAIT2状态。
- 3、至此完成了TCP连接的半关闭,即完成了客户端至服务端方向的数据发送。此时,客户端虽然不能发送数据,但仍然能接受服务端发给客户端的数据,即服务端至客户端方向的连接还未关闭。
- 4、服务端发送一个FIN置1的报文给客户端,关闭服务端至客户端方向的数据传送,并等待客户端的ACK确认应答,同时进入LAST_ACK状态,客户端收到FIN置1的报文后,回复ACK确认报文,并进入TIME_WAIT状态,经过2倍报文最大生存时间(MSL)后,TCP删除原来建立的链接记录,返回到初始的CLOSED状态。服务端收到ACK确认报文后,进入CLOSED状态,完成链接的双向关闭。
TCP/IP四次断开过程如图:
拉钩教育中关于tcpip的三次握手和四次挥手的讲解 - 来自:计算机网络通关 29 讲
TCP 协议
TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议。
这里面牵涉很多概念,比如主机到主机、连接、会话、双工/单工及可靠性等,接下来我会为你逐一解释。
TCP 是一个双工协议,数据任何时候都可以双向传输。这就意味着客户端和服务端可以平等地发送、接收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词——Host(主机)。
TCP 的握手和挥手
TCP 是一个连接导向的协议,设计有建立连接(握手)和断开连接(挥手)的过程。TCP 没有设计会话(Session),因为会话通常是一个应用的行为。
TCP 协议有这样几个基本操作:
如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchroniation),请求同步;
如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成;
如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。
以上 3 种情况,接收方收到数据后,都需要给发送方一个 ACK(Acknowledgement)响应。请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重发这个请求。
TCP 提供的是 Host-To-Host 传输,一台主机通过 TCP 发送数据给另一台主机
TCP 协议往上是应用到应用(Application-To-Application)的协议。
TCP 是一个双工协议,数据任何时候都可以双向传输
建立连接的过程(三次握手)
因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回,返回数据叫作 ACK(也就是响应)。
- 1、客户端发消息给服务端(SYN) (1 次握手)
- 2、服务端准备好进行连接
- 3、服务端针对客户端的 SYN 给一个 ACK (2 次握手,同时)
- 4、服务端发送一个 SYN 给客户端 (2 次握手,同时)
- 5、客户端准备就绪
- 6、客户端给服务端发送一个 ACK(3 次握手)
思考 SYN、ACK、PSH 这些常见的标识位(Flag)在传输中如何表示?
【解析】一种思路是为 TCP 协议增加协议头。在协议头中取多个位(bit),其中 SYN、ACK、PSH 都占有 1 个位。比如 SYN 位,1 表示 SYN 开启,0 表示关闭。因此,SYN-ACK 就是 SYN 位和 ACK 位都置 1。这种设计,我们也称为标识(Flag)
断开连接的过程(4 次挥手)
如果断开连接需要几次握手?给你一些提示,你可以在脑海中这样构思。
- 1、客户端要求断开连接,发送一个断开的请求,这个叫作(FIN)。
- 2、服务端收到请求,然后给客户端一个 ACK,作为 FIN 的响应。
- 3、这里你需要思考一个问题,可不可以像握手那样马上传 FIN 回去?
其实这个时候服务端不能马上传 FIN,因为断开连接要处理的问题比较多,比如说服务端可能还有发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放。因此断开连接不能像握手那样操作——将两条消息合并。所以,服务端经过一个等待,确定可以关闭连接了,再发一条 FIN 给客户端。 - 4、客户端收到服务端的 FIN,同时客户端也可能有自己的事情需要处理完,比如客户端有发送给服务端没有收到 ACK 的请求,客户端自己处理完成后,再给服务端发送一个 ACK。
经过以上分析,就可以回答上面这个问题了。是不是刚刚好 4 次挥手?过程如下图所示:
总结
在学习 3 次握手、4 次挥手时,你一定要理解为什么这么设计,而不是死记硬背。最后。我们一起总结一下今天的重点知识。
- 1、TCP 提供连接(Connection),让双发的传输更加稳定、安全。
- 2、TCP 没有直接提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双方的聊天记录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进一步封装,在应用层提供。
- 3、TCP 是一个面向连接的协议(Connection -oriented Protocol),说的就是 TCP 协议参与的双方(Host)在收发数据之前会先建立连接。后面我们还会学习 UDP 协议,UDP 是一个面向报文(Datagram-oriented)的协议——协议双方不需要建立连接,直接传送报文(数据)。
最后,连接需要消耗更多的资源。比如说,在传输数据前,必须先协商建立连接。因此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的。
本讲关联的面试题目:TCP 为什么是 3 次握手,4 次挥手?
【解析】TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC(同步请求)和 ACK(响应)。
握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输。
到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 Offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。
最后
以上就是曾经世界为你收集整理的[每周一更]-(第20期):TCP/IP的三次握手和四次断开原理的全部内容,希望文章能够帮你解决[每周一更]-(第20期):TCP/IP的三次握手和四次断开原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复