TCP 与 UDP

TCP

TCP (Transmission Control Protocol、传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议

W_TCP

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

HF_TCP
  • Source Port : 源端口,标识发送连接端口号
  • Destination Port : 目标端口,标识接收连接端口号
  • Sequence Number : 序列号
    • 若 SYN 标志位为 1 ,那么这就是初始序列号,第一个数据的序列号为本序列号 +1
    • 若 SYN 标志位为 0 ,则此为第一个数据的序列号
  • Acknowledgment Number : 确认号,包含发送确认的一端所期望收到的下一个序列号。确认号只有在 ACK 标志为 1 时才有效
  • Data Offset : 数据偏移量(头部长度),以 4 字节为单位计算出的数据段开始地址的偏移值,标识该 TCP 头部有多少个 32 bit ,最长为 60 字节
  • Reserved : 保留位 (0 0 0)
  • Flags : 标志位,包含 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 : 窗口,表示从确认号开始,本报文的发送方可以接收的字节数,即接收窗口大小。用于流量控制
  • Checksum : 校验和,对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得
  • Urgent Pointer : 紧急指针,与序号字段中的值相加表示紧急数据最后一个字节的序号。如果 URG 为 1,则紧急指针标志着紧急数据的结束。其值是紧急数据最后 1 字节的序号,表示报文段序号的偏移量
  • Options : 选项字段,最多 40 字节。每个选项的开始是 1 字节的 kind 字段,说明选项的类型

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

TCP 建立连接过程 (三次握手)

TCP连接
  1. 客户端主动打开端口 (Init) 向服务端发送请求连接报文 (SYN 置位,seq = 客户端初始序列号 x),端口进入 SYN-SENT 状态
  2. 服务端接收到请求连接报文后,如果同意连接则向客户端回复确认报文 (SYN、ACK 置位,seq = 服务端初始序列号 y,确认号 = x+1),端口进入 SYN-RCVD 状态
  3. 客户端接收到确认报文后,需要向服务端回复一个确认报文 (ACK 置位,seq = x+1,ack = y+1)。表示确认接收报文,并且进入 ESTABLISHED 状态
  4. 服务端接收到来自客户端的确认报文后,进入 ESTABLISHED 状态
TCP连接_gif

TCP 释放连接过程 (四次挥手)

TCP断开
  1. 客户端数据发送完毕后,向服务端发送释放连接报文 (FIN 置位,seq = 接收数据的最后一个字节序列号+1 a),同时端口进入 FIN-WAIT-1 状态
  2. 服务端收到释放连接报文后,回复确认报文 (ACK 置位,seq = 服务端序列号 b,ack = a+1),端口进入 CLOSE-WAIT 状态
  3. 客户端收到确认报文后,端口进入 FIN-WAIT-2 状态,等待服务端的释放连接报文
  4. 服务端数据发送完毕后,向客户端发送释放连接报文 (FIN、ACK 置位,seq = 服务端当前序列号 c,ack = a+1)。端口进入 LAST-ACK 状态,等待客户端的确认
  5. 客户端收到释放连接报文后,回复确认报文 (ACK 置位,seq = a+1,ack = c+1),端口进入 TIME-WAIT 状态
  6. 服务端收到确认报文后立即进入 CLOSED 状态
  7. 客户端等待 2×MSL (报文最大生存时间) 的时间结束后,进入 CLOSED 状态
TCP连接_gif

UDP

UDP (User Datagram Protocol、用户数据报协议) 是一个简单的面向数据报的通信协议,位于 OSI 模型的传输层

W_UDP

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

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

HF_UDP
  • Source Port : 源端口,标识发送连接端口号
  • Destination Port : 目标端口,标识接收连接端口号
  • Length : 报文长度,指定 UDP 报头和数据总共占用的长度
  • Checksum : 校验和,用于发现头部信息和数据中的传输错误

相关文档

两张动图-彻底明白TCP的三次握手与四次挥手

rfc793

rfc768

上一篇
下一篇