TCP 三次握手与四次挥手

TCP是计算机网络中最核心的协议,特点是面向连接,可靠传输。

建立连接:三次握手

断开连接:四次挥手

  • SYN:同步标记,发起建立连接
  • ACK:确认 标记,确认收到 对方请求的数据包
  • FIN:结束标记,发起关闭连接
  • SEQ:序列号,标记数据包的顺序,不丢失,不重复
  • ACK_NUM:确认标记号 ,ACK_num=SEQ+1,用于告诉对方我收到了你发送给我的SEQ数据

 

三次握手(发起连接):

核心是为了确保双方都具备“发送能力”和“接收能力”,避免出现收不到的无效连接,并同步初始序列号。

好处:可以确认双方的接收和发起功能,同时可以根据ack_num防止重复连接

  • 第一次握手:客户端->服务端,告诉服务端,我想和你通信,我可以发起请求,你能收到?服务端收到后确认客户端可以发起请求,客户端发起功能正常
  • 第二次握手:服务端->客户端,告诉客户端,我收到了你的请求,也能给你发请求,你能收到吗?客户端收到后确认服务端可以收到并且可以发请求
  • 第三次握手:客户端->服务端,告诉服务端,我也可以收到你的请求,服务端接收功能和发起功能正常,那么我们通信吧!服务端收到后也确定客户端可以收到请求,接收功能正常

至此三次握手完成,TCP建立连接,双方开始传输数据

总结:客户端能发,服务端能收和能发,客户端能收

image

为什么只能发起三次握手不可以是一次或者两次?
有图上可知,

一次请求:只能确认客户端可以发起请求,无法确认服务端接收功能和发起功能是否正常,同时也无法确认客户端接收能力是否正常

两次请求:客户端可以确认服务端的发起和接收正常,服务端也可以确认客户端的发起功能正常,但是服务端无法确认客户端接收功能是否正常,会导致无效连接,浪费服务端资源

 

四次挥手(断开连接):

  • 第一次:客户端->服务端 FIN关闭请求。客户端:我这边数据发完了要关闭连接了
  • 第二次:服务端->客户端 ACK确认请求。服务端:我收到你要关闭的消息,但是我这边数据还没发完,要等等,别着急关。此时客户端只能收到服务端数据,无法发送数据,服务端向客户端发送剩余数据
  • 第三次:服务端->客户端 FIN关闭请求。服务端:我的消息也发完了,我也关闭连接了
  • 第四次:客户端->服务端 ACK确认请求。客户端:我收到你关闭的消息了。服务端收到客户端发的ACK后立刻关闭,客户端等一会(~1min)确认服务端关闭后再次关闭,防止服务端未收到ACK重新发起FIN(TIME_WAIT 第四次挥手后客户端等待关闭时间,~1min,防止服务端未收到ACK请求并重复发起)

总结:客户端说要关,服务端收到,服务端发完,客户端关

image

 为什么是4次断开,不是3次:
TCP是双向的,关闭需要双向独立关闭,可能服务端的数据没有发完,需要等待服务端所有数据发完,两个操作无法合并所以需要四次

 

posted @ 2026-03-09 15:07  阿陌i  阅读(16)  评论(0)    收藏  举报