Skip to content

tcp协议详解

Quote

TCP(Transmission Control Protocol:传输控制协议)
TCP协议是计算机网络中非常复杂的一个协议

TCP所处的位置

TCP所处的位置

从结构上讲,TCP协议跟UDP协议都是一样的,都是由首部、数据报组成的。

TCP的特点

  1. TCP是面向连接的协议
    • 面向连接:TCP要是通信的话,首先要建立连接
  2. TCP的一个连接有两端(点对点通信
  3. TCP提供可靠的传输服务
  4. TCP协议提供全双工的通信
    • 全双工:双方都可以同时发送和接收信息。例如:网线、网络都是使用全双工通信信道的
  5. TCP是面向字节流的协议

    Warning

    UDP面向的数据报与TCP面向的字节流有什么区别呢?
    字节流的流表示流入进程或流出进程的字节序列,我们知道传输层的数据都是由应用层传输下来的,它是一块一块的,但是在TCP协议中不把它看做一块一块的数据,而是把它看成一系列的一整串的字节流(如下图),在这里面TCP不是面向一整块数据来处理的,而是面向字节 一个字节一个字节来处理的。

    数据报与字节流的区别
    所以在TCP协议里面就可能取出数据里的某一段来进行传输(如下图),把剩下的放在第二个TCP报文进行传输。这就是TCP面向字节流协议的原因。也因此,在TCP中可能会对用户的数据进行合并也可能会进行分拆,以把他更好的传输出去,这也是TCP的一个特点。
    TCP传输

TCP的首部

TCP的首部

以上,除了可选项,TCP的首部有20 ~ 60个字节,20个字节由前面的5行组成的。60个字节由于数据偏移导致的,原因查看下方数据偏移
  • 序号
    • 大小:占32个比特位,可表示的范围是 0 ~ 2^32-1 的范围
    • 释义:TCP是面向字节流的,因此每一个字节都会有一个序号,而这个序号就是来标记传输的每一个字节的。一个字节就会有一个序号。这里面的序号代表的是这一个TCP报文它所传输数据的第一个字节序号是什么(如下图,含义是为了合并)。与之对应的就是确认号。
      图示
  • 确认号

    • 大小:占32个比特位,可表示的范围是 0 ~ 2^32-1 的范围
    • 释义:同序号,一个字节一个序号,这里面的确认号它主要是用于表达期望收到数据的首字节序号(如下图)。当前报文的序号是501,已知数据报总长是100,故确认号应为601(下次报文应该传输的序号)
      图示

    Quote

    序号与确认号小结:序号与确认号属于相辅相成。确认号为N,则表示N - 1序号的数据都已经收到。

  • 数据偏移

    • 大小:占4位 0 ~ 15,单位为:32位字(每一个偏移都能表示4个字节的偏移)
    • 释义:真实的TCP数据偏离首部的距离,这个是由于 TCP选项(可选)、填充 块导致的。已知TCP首部的长度在排除TCP选项后为20个字节,但是如果存在TCP选项之后会导致数据偏离首部距离,具体能偏离的范围取决于数据偏移的范围(0~15, 4个字节),所以TCP首部等于15 * 4 = 60字节。故TCP首部长度为20~60字节
  • TCP标记
    • 大小:占6位,每位各有不同意义
      图示
      1. URG:Urgent 紧急位,URG = 1,表示紧急数据
      2. ACK:Acknowledgement 确认位,ACK = 1,确认号才生效
      3. PSH:Push 推送位,PSH = 1,尽快的把数据交付给应用层
      4. RST:Reset 重置位,RST = 1,重新建立连接
      5. SYN:Synchronization 同步位,SYN = 1 表示连接请求报文
      6. FIN:Finish 终止位,FIN = 1 表示释放连接
  • 窗口
    • 大小:占16位,0 ~ 2^16 - 1
    • 释义:窗口指明允许对方发送的数据量有多少。如果指明1000,则表示对方可以发送1000个字节给我。也可以把窗口结合确认号来计算,举例说明:比如目前的确认号是501,这个时候窗口的值是1000,那么也就是501~1500这么多个字节的数量都是可以接收的,这就是窗口的意思
  • 紧急指针
    • 释义:紧急数据(当URG = 1的时候才会启用),表示的是紧急数据位于报文的位置。对于TCP报文来说有部分的紧急数据是可以保存在数据报里面的,到达对方的时候对方则可以知晓紧急数据所处的位置
  • TCP选项(可选)
    • 大小:最多40个字节
    • 释义:目的是为了支持未来的拓展

TCP的定时器

  • 超时定时器:超时重传机制定时器
  • 坚持定时器:解决死锁局面的,比如接收方发送给发送方一个窗口数据,但是数据未送达至发送方,导致接受方和发送当都处于等待状态(死锁)
    • 当接收方收到窗口为0的消息,则启动坚持定时器
    • 坚持定时器每隔一段时间发送一个窗口探测报文
  • 等待定时器