TCP协议基础知识

TCP连接简介

  • TCP报文包括TCP首部和TCP数据部分,被包装成为IP传输数据,是一种基于连接的字节流传输协议
  • 大小通常为20字节
  • TCP/IP协议族:


    TCP-IP协议族.jpg

TCP技术详述

TCP报文格式

  1. 序号:32位的Seq序号,标识从TCP源端向目的端发送的字节流,发送方发送数据时进行标记
  2. 确认号:32位的Ack序号,Ack=Seq+1,只有当Ack标志位为1时,该Ack确认号才有效;确认号表示发出方希望获得的对方下一次报文的Seq序号
  3. 标志位:6个标志位,分别是URG、ACK、PSH、RST、SYN、FIN,含义如下
  • URG:紧急指针(urgent pointer)有效
  • ACK:确认序号(Ack)有效
  • PSH:接收方应该尽快将报文交给应用层
  • RST:重置连接
  • SYN:发起一个新连接
  • FIN:释放一个连接
  • TCP报文结构图:


    TCP数据包.png

TCP三次握手

三次握手(Three-way Handshake),指的是建立一个TCP连接时,需要客户端和服务器发送三个包

其目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息

在socket编程中,客户端执行connect()时,将触发三次握手:

  1. 第一次握手:
  • client发送syn报文(此时SYN标志位为1),将自己的序号Seq设置为X
  • client当前状态:SYN-SENT(同步发送)
  • server当前状态:LISTEN(监听)
  • 该报文不携带数据,消耗一个序号
  1. 第二次握手:
  • server发回确认包进行应答,SYN标志位和ACK标志位均为1,将确认序号Ack设置为X+1,自己的序号Seq设置为Y
  • server当前状态:SYN-RCVD(同步收到)
  • client当前状态:ESTABLISHED(连接状态)
  • 该报文不携带数据,消耗一个序号
  1. 第三次握手:
  • client再次发送确认包,SYN标志位回置为0,ACK标志位为1,将确认序号Ack设置为Y+1
  • server当前状态:ESTABLISHED(连接状态)
  • client当前状态:ESTABLISHED(连接状态)
  • 该报文可携带数据,携带数据时需消耗一个序号

TCP四次挥手

四次挥手(four-way handshake),客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。

  1. 第一次挥手:
  • 主动方发送FIN+ACK报文,FIN标志位为1,ACK标志位为1,Ack设置为Z,序号Seq为U
  • 主动方状态:FIN-WAIT-1(终止等待1)
  • 被动方状态:ESTABLISHED(连接状态)
  • 该报文即使不携带数据也要消耗一个序号
  1. 第二次挥手:
  • 被动方发出Ack报文,ACK=1,Ack设置为U+1,序号Seq=V
  • 被动方状态:CLOSE-WAIT(关闭等待)
  • 主动方状态:FIN-WAIT-2(终止等待2),此时主动方还需接收被动方发送的最后数据
  1. 第三次挥手:
  • 被动方最后的数据发送完成后,向主动方发送连接释放报文,FIN=1,Ack设置为U+1,序号Seq=W
  • 被动方状态:LAST-ACK(最后确认)
  • 主动方状态:FIN-WAIT-2(终止等待2)
  1. 第四次挥手:
  • 主动方发出ACK报文,ACK=1,Ack设置为W+1,序号为U+1
  • 主动方状态:TIME-WAIT(时间等待)
  • 被动方状态:CLOSED(关闭状态)

注:若客户端为主动方发送完最后一个ACK报文后,TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后才进入CLOSED状态,而服务器在接到客户端的Ack报文后马上进入CLOSED状态

三次握手和四次挥手完整示意图:


三次握手四次挥手.jpg

MSL(Maximum Segment Lifetime)最长报文段寿命,TCP允许不同的实现可以设置不同的MSL值

1)确保客户端发出的最后一个ACK报文能够传达到服务器,防止丢失
2)防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中

为什么建立连接是三次握手,关闭连接确是四次挥手呢?

服务器收到客户端的断开连接的FIN+ACK时,仅表示客户端不再发送数据,但还能接受数据,所以服务器在进行回发确认ACK报文后,还可以传输一些剩余数据,传输完成后再发送FIN报文,表示数据传输完了,连接可以关闭了,因此是四次挥手

建立连接后客户端故障怎么办

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

你可能感兴趣的:(TCP协议基础知识)