传输层协议


TCP和UDP是两种最为著名的传输层协议,二者都使用IP作为网络层协议。

传输控制协议(TCP,TransmissionControl Protocol)

尽管TCP和UDP都使用相同的网络层(IP),TCP 却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。

TCP: 传输控制协议,面向连接的协议

面向连接意味着两个使用 TCP 的应用(通常是一个客户和一个服务器)彼此交换数据之前必须先建立一个TCP连接,一对一传输。

三次握手(建立连接)

就像两个人打电话前确认对方是否在线:

tcp三次握手

1.客户端 → 服务器:发送 SYN(同步请求)包,告诉服务器「我想和你建立连接」,附带一个随机初始序列号(比如 seq=x)。

2.服务器 → 客户端:返回 SYN+ACK 包,表示「我同意连接」,同时发送自己的序列号(seq=y),并确认客户端的序列号(ack=x+1)。

3.客户端 → 服务器:发送 ACK 包,确认服务器的序列号(ack=y+1),表示「我收到你的确认了」。

结果:双方确认彼此的接收能力,连接建立完成(状态为 ESTABLISHED)。

tcp三次握手

四次挥手(断开连接)

就像通话结束后双方确认挂断: TCP四次断开

1.客户端 → 服务器:发送 FIN(结束请求)包,告诉服务器「我数据发完了,准备断开」,状态变为 FIN_WAIT_1

2.服务器 → 客户端:返回 ACK 包,确认收到 FIN,状态变为 CLOSE_WAIT,继续处理未发送完的数据。

3.服务器 → 客户端:数据处理完毕后,发送 FIN 包,告诉客户端「我也准备断开了」,状态变为 LAST_ACK

4.客户端 → 服务器:返回 ACK 包,确认服务器的 FIN,状态变为 TIME_WAIT,等待一段时间(确保服务器收到 ACK)后彻底关闭连接。

TCP四次断开

关键区别

  • 三次握手:服务器可以在第二步同时发送 SYNACK,因为此时服务器已确认客户端的请求。
  • 四次挥手:服务器需要分两次发送 ACKFIN,因为可能需要先处理完数据再断开。

为什么需要这些步骤?

  • 可靠性:通过确认机制确保双方都能正确接收和发送数据。
  • 避免资源浪费:防止旧连接的重复请求占用资源(如网络延迟导致的过时 SYN 包)。

TCP包头

TCP包头

以下是对 TCP 包头的详细解释:

TCP 包头结构(固定部分)

TCP 包头通常包含 20 字节的固定部分(不含可选字段),各字段功能如下:

字段名 位数 说明
源端口 16 发送方端口号(标识应用程序)
目的端口 16 接收方端口号(标识目标应用程序)
序列号 32 数据段的第一个字节序号(用于保证数据按顺序传输)
确认号 32 期望接收的下一个字节序号(用于确认对方数据已接收)
数据偏移 4 包头长度(以 4 字节为单位,最小值 5 → 20 字节,最大值 15 → 60 字节)
保留 6 保留位,通常为 0
控制位 6 6 个标志位,用于控制连接状态和数据传输:
- URG:紧急指针有效
- ACK:确认号有效
- PSH:立即推送数据
- RST:重置连接
- SYN:同步序列号(建立连接)
- FIN:结束连接(断开连接)
窗口大小 16 接收方的接收窗口大小(流量控制,单位:字节)
校验码 16 对包头和数据进行校验,确保数据完整性
紧急指针 16 紧急数据的末尾位置(URG 标志有效时使用)

关键字段详解

1.序列号(Sequence Number)

  • 用于标记 TCP 数据段的顺序,确保接收方按序重组数据。
  • 示例:若序列号为 x,数据段长度为 100 字节,则下一个数据段的序列号应为 x+100

2.确认号(Acknowledgment Number)

  • 表示接收方期望收到的下一个字节序号。
  • 示例:若确认号为 y,表示接收方已成功接收序号 y-1 之前的所有数据。

3.控制位(Flags)

  • SYN:同步序列号(三次握手第一步和第二步使用)。
  • ACK:确认号有效(除了第一个 SYN 包,其他包必须设置 ACK=1)。
  • FIN:断开连接请求(四次挥手第一步和第三步使用)。
  • RST:强制重置连接(用于异常情况,如端口不可达)。

4.窗口大小(Window Size)

  • 接收方告知发送方自己当前的可用缓冲区大小,用于流量控制。
  • 示例:若窗口大小为 5000,表示发送方最多可发送 5000 字节未确认的数据。

可选字段(Options)

  • 最大段大小(MSS):协商双方能接收的最大数据段长度。
  • 时间戳(Timestamp):用于计算往返时间(RTT),优化性能。
  • 窗口扩大因子:扩展窗口大小(当 16 位窗口字段不够用时)。

TCP 包头的作用

1.建立连接:通过 SYN、ACK 标志位完成三次握手。

2.数据传输:序列号和确认号确保数据按序、可靠传输。

3.流量控制:窗口大小限制发送速率,避免接收方缓冲区溢出。

4.断开连接:通过 FIN 标志位完成四次挥手。

常见问题

  • 为什么控制位需要分两次挥手?
    因为服务器可能需要先处理完剩余数据,再发送 FIN。
  • 校验码的作用是什么?
    检测数据在传输过程中是否损坏,若损坏则丢弃并请求重传。

UDP协议

UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP提供了无连接通信,适合于一次传输少量数据,UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。

可以一对一、一对多传输、多对一和多对多的交互通信

UDP(用户数据报协议)是一种轻量级、无连接的传输层协议,其包头结构比TCP简单得多。 UDP包头.jpeg

以下是对UDP包头的详细解释:

UDP 包头结构(固定8字节)

UDP 包头仅包含 8字节的固定部分,各字段功能如下:

字段名 位数 说明
源端口 16 发送方端口号(可选,全零表示无明确端口)
目的端口 16 接收方端口号(标识目标应用程序)
长度 16 UDP 数据报总长度(包括包头和数据,最小值 8 字节,最大值 65535 字节)
校验码 16 可选字段,用于校验数据完整性(可设置为全零表示不校验)

关键字段详解

1.源端口(Source Port)

  • 发送方应用程序的端口号,用于接收方回传数据。
  • 示例:若发送方未指定端口,可能使用动态端口(如 50000+)。

2.目的端口(Destination Port)

  • 接收方应用程序的端口号,用于识别目标服务。
  • 示例:DNS 默认使用 53 端口,DHCP 使用 67/68 端口。

3.长度(Length)

  • UDP 数据报的总字节数(包头 + 数据)。
  • 最小值:8 字节(仅包头,无数据)。
  • 最大值:65535 字节(受 IP 层 MTU 限制,通常实际数据小于 1500 字节)。

4.校验码(Checksum)

  • 对包头、数据码伪首部(包含 IP 地址等信息)进行校验。
  • 可选性:某些场景下可跳过校验以提高速度(如局域网视频流)。

UDP 包头的特点

1.轻量级

  • 仅 8 字节固定开销,适合需要快速传输的场景(如实时音视频)。

2.无连接

  • 无需三次握手,直接发送数据,延迟低。

3.不可靠

  • 不保证数据到达、顺序或完整性(无重传、确认机制)。

4.无流量控制

  • 发送方不会根据接收方状态调整速率,可能导致数据丢失。

UDP 与 TCP 的对比

特性 UDP TCP
连接 无连接(尽力而为) 面向连接(可靠传输)
包头大小 8 字节 20-60 字节(含选项)
可靠性 不可靠(无重传/确认) 可靠(序列号、ACK、超时重传)
流量控制 有(窗口大小)
适用场景 DNS、视频流、实时游戏 HTTP、邮件、文件传输

为什么 UDP 包头如此简单?

  • 效率优先:减少协议开销,适合对延迟敏感的应用(如直播、在线游戏)。
  • 按需设计:某些场景不需要可靠性(如 DNS 查询只需单次请求)。

常见问题

  • UDP 校验码必须启用吗?
    否。校验码可选,但建议启用以检测传输错误。

  • UDP 如何处理丢包?
    不处理,由应用层自行实现重传逻辑(如游戏中的心跳包)。

TCP与UDP区别:

1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2.TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付,Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3.UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5.TCP对系统资源要求较多,UDP对系统资源要求较少。