TCP 的部首

  • 每个 TCP 都包含源端口和目的端口,这两个值加上 IP 部首当中的源 IP 和目的 IP 地址唯一确定到一个 TCP 链接。

  • 一个 IP 地址和一个端口号也称为一个插口( socket )。

  • 序号标识从 TCP 发端到 TCP 收端的数据字节流,序号是 32 位的无符号数,到达了 2^32 - 1 后从 0 开始。

  • 确认序号应当是上次已成功收到数据字节序号加 1。只有 ACK 为 1 时候确认号才有效。

  • 首部长度给出TCP首部的字节数目。需要这个值是因为任选字段的长度是可变的。保留:6bit, 均为0。

  • TCP首部中有6个标志位。

    • URG:紧急指针有效标志位,当它被置为1时,紧急指针才有效。
    • ACK:确认序号有效,当它被置为1时,确认序号才有效。
    • PSH:接受方应该尽快将这个报文交给应用层。
    • RST:重建连接。
    • SYN:同步序号用来发起一个新连接。
    • FIN:发端完成发送任务。
  • 窗口大小来进行TCP的流量控制。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接受端期望接受的字节。

  • 检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定由发端进行计算和存储,并由收端进行检验。

  • 紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

TCP 创建握手

  • 第一次握手:客户端向服务器发送连接请求包,标志位SYN(同步序号)置为1,序号为X

  • 第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号 Y,将确认序号(ack)设置为客户的序列号加1,即 X+1。

  • 第三次握手:客户端收到服务器发来的包后检查确认序号(ack)是否正确,即第一次发送的序号加1(X+1)。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(ack) Y+1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。

TCP 端开链接

  • 第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号为X,确认序号(ack)为Z。

  • 第二次挥手:服务器收到FIN后,发回一个ACK(标志位ACK=1),确认序号为收到的序号加1,即(ack)X+1。序号为收到的确认序号Z。

  • 第三次挥手:服务器关闭与客户端的连接,发送一个FIN。标志位FIN和ACK置为1,序号为Y ,确认序号为X+1。

  • 第四次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1。序号为收到的确认序号X+1。

【参考资料】

  1. http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B%E8%AF%A6%E8%A7%A3/

  2. TCP/IP详解 卷1:协议

—EOF—