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

传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP_w

应用层向 TCP 层发送用于网间传输的、用 8 位字节表示的数据流,然后 TCP 把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后 TCP 把结果包传给 IP 层,由它来透过网络将包传送给接收端实体的 TCP 层。TCP 为了保证不发生丢包,就给每个包一个序号(seq),同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失并进行重传。TCP 用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和

TCP

  • Source port 源端口(16 bit): 标识发送连接端口号

  • Destination port 目标端口 (16 bit): 标识接收连接端口号

  • Sequence number 序列号 (32 bit):

    • 若 SYN 标志位为 1 ,那么这就是初始序列号,第一个数据的序列号为本序列号 +1
    • 若 SYN 标志位为 0 ,则此为第一个数据的序列号
  • Acknowledgment number 确认号 (32 bit): 确认号包含发送确认的一端所期望收到的下一个序列号。确认号只有在 ACK 标志为 1 时才有效

  • Data offset 数据偏移量/头部长度(4 bit): 以 4 字节为单位计算出的数据段开始地址的偏移值,标识该TCP 头部有多少个 32 bit ,最长为 60 字节

  • Reserved 保留位(3 bit): 0 0 0

  • Flags 标志位(9 bit): 包含 9 个 1 位的标志,前 3 位组成 ECN 字段

    • NS: ECN-nonce - 隐蔽性保护 (?)
    • Congestion Window Reduced (CWR): 拥塞窗口减少标志被发送主机设置,用来表明它接收到了设置 ECE 标志的 TCP 包。拥塞窗口是被 TCP 维护的一个内部变量,用来管理发送窗口大小
    • ECN-Echo (ECE): 作用取决于 SYN 标志的值(?)
    • Urgent (URG): 为 1 表示高优先级数据包,紧急指针字段有效
    • Acknowledgment (ACK): 为 1 表示确认号字段有效
    • Push (PSH): 为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满
    • Reset (RST): 为 1 表示出现严重差错。可能需要重新创建TCP连接。还可以用于拒绝非法的报文段和拒绝连接请求
    • Synchronize (SYN): 为 1 表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
    • FIN: 为 1 表示发送方没有数据要传输了,要求释放连接
  • Window size 窗口大小(16 bit): 表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制

  • Checksum 校验和(16 bit): 对整个的TCP报文段,包括TCP头部和TCP数据,以16位字进行计算所得

  • Urgent pointer 紧急指针(16 bit): 与序号字段中的值相加表示紧急数据最后一个字节的序号。如果 URG 为 1,则紧急指针标志着紧急数据的结束。其值是紧急数据最后 1 字节的序号,表示报文段序号的偏移量

  • Options 选项字段: 最多 40 字节。每个选项的开始是 1 字节的 kind 字段,说明选项的类型

Explicit Congestion Notification (显式拥塞通知、ECN)
ECN 是对 TCP 的扩展,定义于 RFC 3540 (2003)。ECN 允许拥塞控制的端对端通知而避免丢包。ECN 为一项可选功能,如果底层网络设施支持,则可能被启用 ECN 的两个端点使用。在 ECN 成功协商的情况下,ECN 感知路由器可以在 IP 头中设置一个标记来代替丢弃数据包,以标明阻塞即将发生。数据包的接收端回应发送端的表示,降低其传输速率,就如同在往常中检测到包丢失那样

TCP 建立连接过程

TCP连接

动态演示

TCP_1
动图出处

TCP 断开连接过程

TCP断开

动态演示

TCP_2
动图出处

User Datagram Protocol (UDP、用户数据报协议)

用户数据报协议是一个简单的面向数据报的通信协议,位于OSI模型的传输层

UDP_w

在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据报协议)。UDP 在 IP 数据报的头部仅仅加入了复用和数据校验字段

UDP 适用于不需要或在程序中执行错误检查和纠正的应用,它避免了协议栈中此类处理的开销。对时间有较高要求的应用程序通常使用 UDP,因为丢弃数据包比等待或重传导致延迟更可取

UDP

  • Source port 源端口(16 bit): 标识发送连接端口号

  • Destination port 目标端口 (16 bit): 标识接收连接端口号

  • Length 报文长度(16 bit): 指定 UDP 报头和数据总共占用的长度

  • Checksum 校验和(16 bit): 用于发现头部信息和数据中的传输错误