1

TCP(Transmission Control Protocol)传输控制协议

IP是无连接的,忽略网络上存在的一些问题,TCP提供可靠的面向连接的通信,负责控制连接的建立、断开、保持等管理工作

  1. 首部格式
  2. 连接

1 首部格式

image.png
没有表示包长度和数据长度的字段,可由IP层获知TCP的包长度,由TCP包长度可计算数据的长度
序列号发送数据的位置,每发送一次,就累加一次该数据字节数的大小

  • 建立连接时由计算机生成的随机数作为其初始值,通过SYN包传递给接收端主机
  • 将每转发过去的字节数累加到初始值上表示数据的位置
  • 在建立连接和断开连接时发送的SYN包和FIN包不携带数据,但也会作为一个字节数增加对应的序列号

确认应答号下一次应该收到的序列号

  • 指已收到确认应答号前一位为止的数据
  • 发送端收到这个确认应答以后可以确认在这个序号以前的数据都已经被正常接收

数据偏移:类似于IPv4数据报中的首部长度,单位为4字节,无可选项式值为5,表示20字节

保留:为以后扩展时使用,一般设置为0

控制位:8位,从左至右:CWR、ECE、URG、ACK、PSH、RST、SYNFIN

  • CWR:通知对方已将拥塞窗口缩小
  • ECE:通知对方这边网络有拥塞

    CWR与ECE都用于IP首部的ECN字段
  • URG:表示包中有需要紧急处理的数据
  • ACK:确认应答的字段变为有效

    除了最初建立连接时的SYN包之外,该位必须设置为1
  • PSH:将收到的数据立即传给上层应用协议
  • RST:TCP连接中出现异常,必须强制断开连接
  • SYN:用于建立连接

    SYN为1时表示希望建立连接,并在其序列号的字段进行序列号初始值设定
  • FIN:为1时表示今后不再有数据发送,希望断开连接

    通信双方可以互相交换FIN位置为1的TCP段请求断开连接
    双方又对对方的FIN包进行确认应答以后就可以断开连接
    主机在接收到FIN为1的TCP段后不会马上回复一个FIN包,等缓冲区所有数据都因成功发送而自动删除后再发

窗口大小:通知从相同TCP首部的确认应答号所指位置开始能够接收的数据大小
TCP不允许发送超过窗口大小的数据,窗口为0时,可以发送窗口探测,了解最新窗口大小

校验和:使用TCP伪首部进行校验和计算,确认收到的数据是正确的

  • TCP伪首部:32位源IP地址 32位目标IP地址 填充 协议号 TCP包长度
  • 首先置0,以16位进行1的补码和计算,再将它们总和的1的补码和放入校验和字段
  • 校验和字段保存着除本字段以外其他部分的和的补码值
  • 因此在计算校验和字段在内的所有字段的16位和之后得到16位全为1,说明收到的数据是正确的

紧急指针:本报文段中紧急数据的指针
数据部分的首位紧急指针所指示的位置为止,这个区间为紧急数据

选项:用于提高TCP的传输性能,最大40字节

  • 在建立连接时决定最大段长度
  • 窗口扩大
  • 高速通信中对序列号的管理
  • 选择确认应答

2 连接

  1. 连接可靠性
  2. 建立与断开

2.1 连接可靠性

通过序列号确认应答提高可靠性

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知,该消息成为确认应答(ACK)

一定时间内没有等到确认应答:发送端可以认为数据已经丢失,进行重发

即使产生丢包,任然能够保证数据能够到达对端,实现可靠传输

返回数据丢失:这样也会导致发送端没有收到确认应答,进行重新发送

确认应答延迟到达:会导致发送端多次请求然后收到重复的数据包

需要一种机制,能识别已经接收数据,又能够判断是否需要接收 - 通过序列号实现

序列号+确认应答:接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接收的序列号作为确认应答返送回去

TCP通过序列号和确认应答号实现可靠传输

重发的时间间隔以往返时间与偏差值的和为基准,是不断变换的,多次重发无确认应答会断开连接

2.2 建立连接与断开

TCP建立连接需要3次往返消息,断开连接需要4次往返消息

也称为TCP的3次握手与4次握手

建立连接

  • 客户端->服务端:发送SYN包请求建立连接
  • 客户端<-服务端:针对SYN确认应答ACK,并发送SYN包请求连接
  • 客户端->服务端:针对SYN确认应答ACK

    在建立连接的过程中可以确认发送数据包的单位 - 正好是IP中不会被分片处理的最大数据长度

建立连接后TCP以段为单位,每发一个段进行一次确认应答的处理,这样会导致网络性能下降
使用缓冲区实现窗口:确认应答不再以每个分段,而是更大的单位进行确认,不用等待确认可继续发送

  • 窗口大小:无需等待确认应答而可以继续发送数据的最大值
  • 缓冲区:临时保存收发数据的场所

    之前是发一个等一个,现在是发一串等一串

重发控制

  • 数据段丢失:接收端发送其他报文段时,会接收该报文连续相同的确认应答

    当超过3次重复应答时,确认报文段丢失,重新发送该报文段

断开连接

  • 客户端->服务端:发送FIN包请求断开连接
  • 客户端<-服务端:针对FIN的确认应答ACK

    等待缓存区数据发送完毕
  • 客户端<-服务端:发送FIN包请求断开连接
  • 客户端->服务端:针对FIN的确认应答ACK
一个连接的建立与断开,正常过程至少需要来发送7个包才能完成

怼怼
73 声望6 粉丝