5.2 TCP协议

TCP协议 #

TCP面向字节流,将应用层传下来的数据看成一串字节流,但是在发送时是从缓存中去一部分(字节单位)加上首部构成TCP报文发送出去的

image-20230628141309859

报文格式 #

首部格式:

image-20230628141427990

源端口号和目的端口号标识各自的应用进程

  • 序号:增加到最后一个时下一个又从0开始,它指出的是本报文段中数据的第一个字节的序号(而不是报文的序号)

    image-20230628141905027
  • 确认号:表示序号n之前的数据都已正确接收,期望接收序号为n的数据(ACK字段取为1表示确认号字段有效)

  • 数据偏移:表示首部的长度(首部是可扩展的),也告诉了数据部分的起始处

  • 窗口:用于流量控制

连接管理 #

三个要求:

  • 双方要知道对方的存在
  • 双方需要协商某些参数
  • 对运输实体资源分配

建立 #

需要三次握手:

  • 客户机向服务器发送请求报文段

    SYN=1表示是一个连接请求,不携带数据但仍然消耗一个数据号

  • 服务器收到,同意,发回确认(同时分配缓存和变量)

    SYN=1表示这是一个同意,ACK=1表示确认字段有效,ack=x+1表示正常

  • 客户机收到后,再向服务器发出确认(并分配缓存) ,服务器收到后就进入已连接状态,不再确认了

    ACK=1表示有效,ack=y+1表示正常,seq=x+1,但此时如果不携带数据就不消耗image-20230628132254130

注意,确认号和确认位不一样,确认位只有0和1,表示确认号是否有效的;这里面SYN位表示是前两次握手需要对方确认,ACK表示在确认

第三次握手的必要性:防止已经失效的连接请求报文段突然到达服务器,如果仅第二次握手服务器就进入ESTABLISHED状态的话就会一直空等数据

释放 #

四次挥手,双方都能主动释放,但我们还是以客户主动释放来学

  • 客户发送关闭请求后,关闭这方的数据发送
  • 服务器收到后关闭数据接收,并发送确认(此时服务器仍然能向客户发送数据)
  • 等到服务器觉得没有数据要发送了,再次发送确认,表示今后不会再发数据过来了
  • 客户端收到后再确认,服务器收到后完全关闭 ,而客户端是定时后才完全关闭
image-20230628135901056

更高级的,如果客户端发生故障,服务器也有保活计时器确保不会一直等下去