TCP协议的定义

TCP属于传输层协议,提供了一种端到端的连接。

  • 是面向连接的、可靠的的进程到进程通信的协议
  • TCP提供全双工服务,即数据可在同一时间双向传播
  • TCP将若干个字节构成一个分组,此分组称为报文段(Segment)

TCP的功能

  • 将数据进行分段打包传输
  • 对每个数据包编号控制顺序
  • 运输中丢失、重发和丢弃处理
  • 流量控制避免拥塞

TCP数据包封装 

image.png

  • 源端口号和目标端口号,计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端口号决定了接收方哪个程序来接收
  • 32位序列号 TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为 s,发送数据长度为 l,则下次发送数据时的序列号为 s + l。在建立连接时通常由计算机生成一个
  • 确认应答号 它等于下一次应该接收到的数据的序列号。假设发送端的序列号为 s,发送数据的长度为 l,那么接收端返回的确认应答号也是 s + l。发送端接收到这个确认应答后,可以认为这个位置以前所有的数据都已被正常接收。
  • 首部长度:TCP 首部的长度,单位为 4 字节。如果没有可选字段,那么这里的值就是 5。表示 TCP 首部的长度为 20 字节。
  • 控制位 TCP的连接、传输和断开都受这六个控制位的指挥

    • URG 紧急指针:控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)。
    • ACK(acknowledgement 确认)为1表示确认号
    • PSH(push急迫位) 缓存区将满,立刻传输速度
    • RST(reset重置位) 连接断了重新连接
    • SYN(synchronous建立联机) 同步序号位 TCP建立连接时要将这个值设为1

      • FIN发送端完成位,提出断开连接的一方把FIN置为1表示要断开连接
  • 窗口大小:用于表示从应答号开始能够接受多少个 8 位字节。如果窗口大小为 0,可以发送窗口探测。 窗口值 说明本地可接收数据段的数目,这个值的大小是可变的。当网络通畅时将这个窗口值变大加快传输速度,当网络不稳定时减少这个值可以保证网络数据的可靠传输。它是来在TCP传输中进行流量控制的
  • 校验和: 用来做差错控制,TCP校验和的计算包括TCP首部、数据和其它填充字节。在发送TCP数据段时,由发送端计算校验和,当到达目的地时又进行一次检验和计算。如果两次校验 和一致说明数据是正确的,否则 将认为数据被破坏,接收端将丢弃该数据
  • 紧急指针:尽在 URG(urgent紧急) 控制位为 1 时有效。表示紧急数据的末尾在 TCP 数据部分中的位置。通常在暂时中断通信时使用(比如输入 Ctrl + C)

TCP的握手与断开

image.png

 建立连接时的三次握手

  • 第一次握手主机A通过一个标识为SYN标识位的数据段发送给主机B请求连接,通过该数据段告诉主机B希望建立连接,需要B应答,并告诉主机B传输的起始序列号
  • 第二次握手是主机B用一个确认应答ACK和同步序列号SYNC标志位的数据段来响应主机A,一是发送ACK告诉主机A收到了数据段,二是通知主机A从哪个序列号做标记。
  • 第三次握手是主机A确认收到了主机B的数据段并可以开始传输实际数据。

断开连接时的四次请求

    • 主机A发送FIN控制位发出断开连接的请求
    • 主机B进行响应,确认收到断开连接请求
    • 主机B提出反方向的关闭要求
    • 主机A确认收到的主机B的关闭连接请求

    为什么要四次分手?

    TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工 模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文 段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN 报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此 就会愉快的中断这次TCP连接。

    结尾

    TCP是一个非常复杂的协议,这里稍微总结了一下,随着学习时间增加,继续补充。


    黄乾
    20 声望0 粉丝