Skip to content

Latest commit

 

History

History
41 lines (34 loc) · 3.71 KB

File metadata and controls

41 lines (34 loc) · 3.71 KB

TCP相关知识点

TCP三次握手流程

  1. 客户端 -> SYN=1, Seq=X -> 服务器
  2. 服务器 -> SYN=1, ACK=1, Seq=Y; ACKnum=X+1 -> 客户端
  3. 客户端 -> ACK=1 ,ACKnum=y+1

目的:客户端和服务端双方确认了自己的接收、发送能力是正常的。可以保证后续数据可以正常传输

握手 客户端 服务端
第一次握手 【客户端】发送✅/接收❓【服务端】发送❓/接收❓ 【客户端】发送✅/接收❓ 【服务端】发送❓/接收✅
第二次握手 【客户端】发送✅/接收✅ 【服务端】发送✅/接收✅ 同上
第三次握手 同上 【客户端】发送✅/接收✅ 【服务端】发送✅/接收✅

TCP四次挥手流程

主动方假设客户端 被动方假设服务端

  1. 主动发送 -> Fin=1, Seq=X 报文, 主动方进入FIN_WAIT_1
  2. 被动方发送 -> ACK=1, ACKnum=X+1-> 报文,被动方进入CLOSE_WAIT, 主动方进入FIN_WAIT_2
  3. 被动方发送 -> Fin=1, Seq=Y -> 报文 被动方进入LAST_ACK
  4. 主动发送 -> ACK=1 ACKnum=Y+1 -> 报文 主动方进入TIME_WAIT状态, 被动方进入CLOSED 状态,主动方等待某个固定时间触发CLOSED 状态

状态注解

  • (主动方)FIN_WAIT_1: 表明这是最后一个数据传输,但可以接受数据
  • (被动方)CLOSE_WAIT: 等待TCP传输关闭状态
  • (主动方)FIN_WAIT_2: 等待被动方关闭连接确认
  • (被动方)LAST_ACK: 等待来自客户端的最后一个ACK
  • (主动方)TIME_WAIT: 等待可能出现的要求重传的关闭确认ACK包,等待了某个固定时间,没有收到服务器端的ACK ,认为服务器端已经正常关闭连接,关闭连接
挥手 客户端 服务端
第一次挥手 【发送】【客户端】最后一次数据,不会再有数据(未确认服务端是否接收)(FIN_WAIT_1) 【接收】【客户端】最后一次数据,不会再有数据(确认收到),准备关闭TCP(CLOSE_WAIT)
第二次挥手 【接收】确认收到上一条信息,等待服务端关闭确认信息(FIN_WAIT_2) 同上
第三次挥手 同上 【发送】服务端已经准备好关闭(未确认客户端是否接收)(LAST_ACK)
第四次挥手 【接收】确认收到上一条信息(确认已收到)【发送】客户端确认信息(无需服务端确认),倒数n秒后关闭TCP连接(TIME_WAIT) 【接收】客户端确认信息,立即关闭TCP连接

TCP报文

  • SYN: 在建立连接时使用,用来同步序号
  • Seq: 发送的这个包中第一个字节的序号
  • ACK: TCP的报文到达确认(ACK)是对接收到的数据的最高序列号的确认,并向发送端返回一个下次接收时期望的TCP数据包的序列号