TCP三次握手与四次挥手(TCP报文)

TCP三次握手

  • 握手流程

    第一次握手:客户端(client)发送数据包(syn=1,随机序列号seq)到服务器,并进入SYN_SEND状态,等待服务器(server)确认(目的:确保服务端接收功能正常)
    第二次握手:服务器收到报文并根据标志(ACK=1,SYN=1)确认客户端是否准备好,确认后发送报文(SYN=1,ACK=1,ack=client.seq+1,随机序列号sql),此时服务器进入SYN_RECV状态(目的:客户端确认服务器能正常接收发送)
    第三次握手:客户端收到服务器的报文,确认接收到的ack是否为第一次发的seq+1及ACK是否标志为1,确认后向服务器发送报文(ack=server.seq+1,ACK=1),服务端收到报文确认seq与ack正确后和客户端进入ESTABLISHED(TCP连接成功)状态,完成三次握手建立起TCP连接
  • 标志

    • ack:等待接收的数据包的序列号
    • SYN(Synchronize Sequence Numbers):同步序列号,连接建立时使用同步序列号
    • seq:当前报文段数据的第一个字节的序号
      %E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B.png

四次挥手

四次挥手(Four-Way Wavehand)即终止TCP连接,断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
  • 第一次挥手:Client发送FIN报文(FIN=1,seq=x),标识Client已无数据需要发送,关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
  • 第二次挥手:Server收到Client报文后,发送一个ACK报文(ACK=1,FIN=1,ack=x+1,seq=y)给Client,Server进入CLOSE_WAIT状态,不再接收Client的数据
  • 第三次挥手:Server发送一个FIN报文(FIN=1,ack=x+1,seq=z),表示已无需要发送给Client的数据,关闭Server到Client的数据传送,Server进入LAST_ACK状态
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK报文(FIN=1,ack=z+1,seq=h)给Server,Server进入CLOSED状态
    tcp%E6%8A%A5%E6%96%87.png

为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

  • 当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,但收到一个FIN只意味着这一方向上没有数据流动,另一个方向仍能发送数据,一个TCP连接在收到一个FIN后仍能发送数据
  • 第二次挥手服务端只表示收到了客户端的FIN报文,但服务端可能还有数据需要发送给客户端,只有在数据发送完后服务端才会发送FIN报文给客户端,客户端收到FIN报文后才发送ACK给服务端使客户端关闭

TCP报文详解

TCP报文是TCP层传输的数据单元,也叫报文段,其数据格式如下:
tcp%E6%8A%A5%E6%96%87.png

  • 源端口号:数据发送方的端口
  • 目的端口:数据接收方的端口
  • 序列号seq:标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
  • 确认号ack:ACK标志位为1时,确认序号字段才有效,ack=seq+1
  • 首部长度/数据偏移:TCP报文段的数据起始处距离TCP报文段的起始处有多远。
    TCP首部可能含可选项内容,固TCP报头的长度是不确定的,当不包含任选字段时首部长度为20字节。“首部长度”的单位是32位字(4字节),4位首部长度最大值1111的十进制为15,故报头的最大长度为15*4=60字节
  • 保留:为将来用途保留,一般为0
  • 标志位
    • URG: 紧急指针标志是否有效
    • ACK:确认标志,在连接建立后所有传送的报文段。当ACK=1时,确认号才有效
    • PSH:PUSH操作标志位,表是否直接将接收到的数据包立即发送给应用程序,而不是在缓冲区中排队
    • RST(reset):重置连接标志
    • SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段(client向server发起请求)。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1(server接收client请求并响应)。
    • FIN:结束标志,表示发送方数据是否已发送完毕
  • 窗口:告知发送方(server)接收端(client)的缓存大小以控制发送端发送数据的速率,范围值为[0,2^16=65536]
    • 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证
  • 紧急指针:只有当 URG 标志置 1 时紧急指针才有效。指本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。窗口为0时也可发送紧急数据。
  • 选项:可变的可选信息,最多包涵40字节。
  • 数据:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章