Skip to the content.

TCP/IP

网络七层协议 OSI Open System InterConnection

OSI 是一个开放性的通讯系统互连参考模型

TCP

TCP(Transmissions Control Protocol) 一种面向链接的,可靠的,基于字节流的传输协议层通信协议

数据传送

在每个 TCP 报文段中都有一对 消息序号消息确认号

建立连接 三次握手

  1. 客户端向服务端发送 SYN 包,请求主动打开
    • 该包携带随机数 A 作为消息序号
    • 状态变化
      • 服务端对新客户端都处于 Listen(等待响应)状态
      • 发送完成后,客户端的状态更改为 SYN-SENT(同步已发送)
  2. 服务端接收到一个 SYN 包后

    • 把该包放入 SYN 队列中
    • 发送一个 SYN/ACK 包,并携带

      • 消息序号 随机数 B
      • 消息确认号 A+1
    • 状态变化
      • 服务端状态 LISTEN -> SYNC_RCVD(同步已收到)
      • 客户端状态 ESTABLISHED(建立连接)
  3. 客户端收到 SYN/ACK 包后
    • 发送一个 ACK 包
      • 序号 A+1
      • 确认码 B+1
    • 状态变化
      • 服务端、客户端 都为 ESTABLISHED
  4. 当服务端接收到这个 ACK 包后
    • 把请求帧从 SYN 队列中移出,放入到 Accept 队列中
    • 这时已是长连接状态,可以进行数据传输了
SYN - synchronization (同步)
seq - sequcence (序号)
SYN-SENT - synchronization_sent (同步已发送)
SYNC_RCVD - synchronization_recieved (同步已收到)
ACK - acknowledgement (确认)
ESTABLISHED
FIN - finis (终结)

数据中断后重发

四次挥手

  1. 客户端发送连接释放包 FIN=1 seq=u 并停止发送数据

    • 状态
      • 客户端 FIN-WAIT-1(终止待待 1)
  2. 服务端收到连接释放包,发出确认释放包 ACK=1 ack=u+1 seq=v

    • 状态
      • 服务端 发送后 CLOSE_WAIT
      • 客户端 接收后 FIN-WAIT-2
  3. 服务端最后向客户端发送包 FIN=1,ACK=1,ack=u+1,seq=w

    • 状态
      • 服务端 发送后 LAST_ACK(最终动作)
      • 客户端 收到后 TIME_WAIT
  4. 客户端收到服务端连接释放包 发送 ACK=1,ack=w+1,seq=u+1

    • 状态
      • 服务端 CLOSED
      • 客户端 等待 2MSL 后 CLOSED

规则-有助于记住

数据包结构

参见