跳至主要內容

TCP协议

酷风大约 4 分钟

TCP协议

介绍

  • TCP(Transmission Control Protocol),传输控制协议

  • 是一种面向连接的、可靠的、基于字节流的传输层通信协议

  • TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。

  • 通过序列号与确认应答提高可靠性;

三次握手

  • 是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。

  • 标志位

  1. SYN(synchronous): 发送/同步标志,用来建立连接,和下面的第二个标志位ACK搭配使用。连接开始时,SYN=1,ACK=0,代表连接开始但是未获得响应。当连接被响应的时候,标志位会发生变化,其中ACK会置为1,代表确认收到连接请求,此时的标志位变成了 SYN=1,ACK=1。
  2. ACK(acknowledgement):确认标志,表示确认收到请求。
  3. PSH(push) :表示推送操作,就是指数据包到达接收端以后,不对其进行队列处理,而是尽可能的将数据交给应用程序处理;
  4. FIN(finish):结束标志,用于结束一个TCP会话;
  5. RST(reset):重置复位标志,用于复位对应的TCP连接。
  6. URG(urgent):紧急标志,用于保证TCP连接不被中断,并且督促中间层设备尽快处理。
  • 序号
  1. seq 顺序号 Sequence number
  2. ack 确认号 Acknowledge number, 响应前面的seq,值为seq+1,
  • 握手过程
  1. 第一次握手:客户端将标志位 SYN 置为1,随机产生一个值 seq=s ,并将该数据包发送给服务端,客户端进入 SYN_SENT 状态,等待服务端确认。
  2. 第二次握手:服务端收到数据包后由标志位 SYN=1 知道客户端请求建立连接,服务端将标志位 SYN 和 ACK 都置为1,ack=s+1,随机产生一个值 seq=k ,并将该数据包发送给客户端以确认连接请求,服务端进入 SYN_RCVD 状态。
  3. 第三次握手:客户端收到确认后,检查ack值是否为s+1,ACK标志位是否为1,如果正确则将标志位 ACK 置为1,ack=k+1,并将该数据包发送给服务端,服务端检查ack值是否为k+1,ACK标志位是否为1,如果正确则连接建立成功,客户端和服务端进入 ESTABLISHED 状态,完成三次握手。

四次挥手

  • 是指 断开一个TCP连接

  • 需要客户端和服务端总共发送4个包以确认连接的断开。

  • 断开过程

  1. 第一次挥手:客户端发送一个 FIN ,用来关闭客户端到服务端的数据传送,客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手:服务端收到 FIN 后,发送一个 ACK 给客户端,确认序号为收到序号+1,服务端进入 CLOSE_WAIT 状态。
  3. 第三次挥手:服务端发送一个 FIN ,用来关闭服务端到客户端的数据传送,服务端进入 LAST_ACK 状态。
  4. 第四次挥手:客户端收到 FIN 后,客户端进入 TIME_WAIT 状态,接着发送一个 ACK 给服务端,确认序号为收到序号+1,服务端进入 CLOSED 状态,完成四次挥手。

Why 3 vs 4

  1. 客户端发起关闭连接的请求时,发出的FIN,仅代表客户端没有需要发送给服务器端的数据了。
  2. 如果服务器端如果仍有数据需要发送给客户端的话,响应报文ACK和结束报文FIN则就不能同时发送给客户端了。
    1. 服务器端会先返回一个响应报文,代表接收到了客户端发出的FIN请求
    2. 数据传输完了之后,再发出FIN请求,表示服务器端已经准备好断开连接了。

参考

三次握手和四次挥手以及TCP标志位的详细介绍open in new window
TCP协议open in new window