简介

  • 传输控制协议,是一个有连接、可靠的、面向字节流的传输层协议

    TCP三次握手

    示意图

    TCP三次握手.png
    TCP握手.gifTCP握手1.gif

过程说明

  • 第一次握手:SYN=1.seq=x
    • 客户端发送一个TCP的SYN标准位为1的包,告知客户端的目标服务器端口(请求同步),并选择序号seq=x表明传送数据时的第一个数据字节的序号是x(随机值)
    • 客户端进入SYN_SEND状态
  • 第二次握手:SYN = 1, ACK = 1, seq = y, ack = x + 1
    • 服务器的TCP接收到链接请求后,如果同意,发送确认(ACK)包来进行应答
    • 服务器端进入SYN_RCVD状态
  • 第三次握手:ACK = 1, ack = y + 1, seq = x + 1

    • 客户端收到此报文段后再次发送确认包(ACK), SYN标志位为0,ACK标志位为1,并且把发送来的ACK序列号字段+1放在ack发送给对方,并且向对端发送请求的数据seq = x + 1
    • 客户端进入ESTABLISHED状态,当服务器端接收到这个确认包时,也进入ESTABLISHED状态

      TCP四次挥手

      示意图

      TCP四次挥手.png
      20180731141630431.gif20180731141633574.gif

      过程说明

  • 第一次挥手(客户端):FIN = 1, seq = u

    • 客户端发起关闭连接的请求,发送FIN标志位为1的包,表示自己已经没有数据可以发送了,但是仍然可以接收数据,因为有可能服务器还有数据要发送,所以发送自己的序列号seq = u,等待服务器确认
    • 客户端进入FIN_WAIT_1状态
  • 第二次挥手(服务器):ACK = 1, seq = v, ack = u + 1
    • 服务器确认客户端的FIN包,并发送确认包,以及自己的序列号seq = v, 并对之前的客户端的u进行确认。表明自己已经接收到了客户端的断开连接请求,但是自己还没有准备好断开连接,因为可能还有数据要发送。
    • 服务器端进入CLOSE_WAIT状态,客户端接收到服务器的确认包时,进人FIN_WAIT_2状态,等待服务器关闭连接
  • 第三次挥手(服务器):FIN = 1, ACK = 1, seq = w, ack = u + 1
    • 服务器已经没有要想客户端发送的数据,应用进程释放TCP链接,表明服务器段准备断开连接,向客户端发送断开链接请求FIN置为1的包
    • 服务器进人LAST_ACK,等待来自客户端最后一个ACK.
  • 第四次挥手(客户端):ACK = 1, seq = u + 1, ack = w + 1
    • 客户端收到服务器的关闭请求,发送一个确认包(ACK = 1,ack = w + 1, seq = u + 1),并进入TIME_WAIT状态,等待可能出现的要求重传的ACK包。服务器端接受到这个确认包后,关闭连接进人CLOSED状态
    • 客户端等待某个固定定时间(两个最大生命周期,2MSL)之后,没有收到服务器端的ACK认为服务器端已经正常关闭了连接,于是自己也关闭连接,进入CLOSED.