TCP的三次握手和四次挥手
TCP概念和作用
TCP 协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于 IP 协议之上,基于 IP 协议提供可靠的、字节流(有先后顺序)形式的通信,是 HTTP 协议得以实现的基础。TCP 是一个有状态的协议,需要先与对方建立连接然后才能发送数据,而且保证数据不丢失不重复。
连接:连接是一种传输数据的行为。传输之前,建立一个连接。具体来说,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,比如双方 IP 和端口是多少?现在发送了多少数据了?状态健康吗?传输速度如何?等。所以,连接是网络行为状态的记录。
TCP协议的特点:
- 基于连接:数据传输之前需要建立连接
- 字节流:不限制数据大小,保证有序接受
- 可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
- 全双工:双向传输数据,双方主机可以平等发送信息。
TCP提供的是主机对主机的传输,这里的主机 (Host)可以是任何一个可收发数据的设备。

TCP之上的协议就是应用到应用的协议,比如两人用微信互相进行聊天,那他们之间应用和应用之间用的就是微信自己的聊天协议。但是想要应用到应用的协议可以工作,首先你得能找到对方的主机,那就得用IP协议,提供地址到地址的通信;你找到这个主机给了数据包还不算完,因为主机接收到数据包不知道哪个应用需要用,所以你需要把这个数据包给到对应应用(微信,原神等等)的端口号中,这就是TCP协议要做的事情;当你把数据(二进制包)给到对应应用中的时候,应用通过协议(HTTP)来解析,最后得到有意义的数据。
TCP协议的基本操作
- 一个Host主动对另一个Host发起连接,称为SYN(Synchronization),请求同步
- 其中一个Host主动断开连接,称为FIN(Finish),请求完成;
- 如果一个Host给另一个Host发送数据,称为Push(Push),数据推送
在以上的三种情况,当接收方接受到数据后,都要给发送方一个ACK(Acknowledgement)响应。请求/响应式可靠性的前提。如果一个请求没有响应,那发送方就会认为接收方没收到而重发这个请求。
建立连接(三次握手)
三次握手步骤

为了保证连接的可靠性,TCP协议中每一条发出的数据必须有响应,也就是ACK。
客户端给服务器发起连接,客户端给服务器发送了SYN包(SYN=i),进入SYN_SEND状态等待确认。
服务器接收到SYN包,确认客户端的SYN,此时ACK=i+1。服务器自己也给客户端发一个SYN包(syn=j),还有确认后的ACK(i+1)包,这时候服务端进入SYN_RECV状态。
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=j+1),这个包发送完毕后,服务器进入ESTABLISHED状态,完成三次握手。
解析
- 步骤1是第一次握手,第一次握手的时候,客户端给服务器发了一个包,等待服务器的确认。
- 步骤2是第二次握手,服务器收到了客户端发来的包,然后确定要发的ACK = 客户端发来的SYN+1(i+1)。然后服务器给客户端发了SYN+ACK包,SYN=j ,ACK=i+1。这个代表服务器向客户端方向大喊:“我收到你的信息了,你发能力没问题,你给我发的SYN包,我用ACK在SYN的值上+1给你回复了,我也给你发个SYN包为了确定你的收能力,你要能听到给我回复一个ACK也在我给你发的SYN基础上+1,咱就建立连接”。
- 步骤3是第三次握手。客户端收到了服务器的SYN包和ACK包,然后给服务器发送ACK=服务器发来的SYN的值+1,这步的意思代表客户端给服务器说:”OK,我知道你的收发能力都没问题了,给你ACK,是在你给我发的SYN基础上+1的,这代表我收能力也没问题,咱连接吧“
脑补的场景
A:”B,我喜欢你“
B:”我知道你喜欢我了,其实我也喜欢你“
A:”收到,我们在一起吧“
简单说,TCP三次握手连接就是为了确定互相确定客户端和服务器的收发能力没有问题。
断开连接过程(四次挥手)

- 客户端要求断开连接,就发送一个断开连接的请求,也就是FIN。
- 服务器接收到请求,给客户端发送一个ACK,作为对FIN的回复。
- 服务器经过一个等待,确定可以关闭连接后,再发一条FIN给客户端。
- 客户端收到服务器的FIN,客户端处理完自己的事情之后(比如给服务器的信息还没回复ACK),在这些处理完之后,再给服务器发送一个ACK。
如果按照上面的理解,是否可以2和3步骤合并,把ACK和自己的FIN同时传给客户端呢(参考三次握手的SYN+ACK包)?答案是不行,因为服务端可能还有自己的资源需要释放,或是发送给客户端的消息还没有得到回应,因此和三次握手的主要差别就是ACK+SYN包拆成了先ACK后SYN,然后只是SYN在断开连接的阶段啊是FIN而已。
脑补的场景
A:”分手吧,B“
B:“我知道你想分手了,能不能让我想想”
----这会估计B在回顾自己这段感情 对应服务器正在处理之前的消息
B:”好吧,分吧,A“
----这会A知道B要分了,也开始回顾了= = 对应客户端处理之前的消息
A:”B,既然你知道了也同意了,分吧“
TCP 为什么是 3 次握手,4 次挥手?
因为TCP是一个双工协议,建立连接的时候,连接双方都需要向对方发送SYN(同步请求)和ACK(响应),因为握手阶段双方之间还没啥任务,所以一方向另一方发起SYN的时候,另一方可以直接发ACK-SYN打包成一条消息回复,因此仅需要三次握手-也就是三次数据传输。
挥手阶段,双方可能都有未完成的任务,所以需要等到一方任务结束后才能接着回复。