网络3️⃣TCP和UDP

1、TCP

传输控制协议Transmission Control Protocol)

面向连接的、可靠的、字节流协议。

  • 面向连接:一对一传输,确认通信对端存在时才会发送数据。
  • 可靠的:即使网络链路发生变化,也可以保证报文能够到达接收端。
  • 字节流:TCP 会将大的数据包分割成小的数据段(segment)进行管理。

存在的意义

  • 网络层(IP)是不可靠的,无法保证网络包的成功交付、按序交付、数据完整性,需要由网络层的上层(传输层)的 TCP 实现。

  • TCP 能确保接收端接收的网络包无损坏、无间隔、非冗余和按序

    OSI 参考模型与 TCP/IP 的关系

2、TCP 连接

2.1、连接

Connections(RFC 793)
The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream. The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.

解释含义

  • TCP 需要初始化并维护数据流的状态信息,才能实现可靠性和流控制机制。
  • 连接状态信息的组合称为连接,包括 Socket、序列号和窗口大小。
    • Socket:由 IP 地址和端口号组成
    • 序列号:解决乱序问题
    • 窗口大小:实现流量控制

2.2、唯一确定 TCP 连接

TCP 四元组唯一确定一个 TCP 连接

TCP 四元组

  • 源 IP 地址
  • 源端口
  • 目标 IP 地址
  • 目标端口

源 IP 地址和目标 IP 地址(32 位):

  • 位于 IP 首部中,
  • 作用是确定主机 IP 地址,告诉 IP 应该把报文发送给哪台主机。

源端口和目标端口(16 位):

  • 位于 TCP 首部中,
  • 作用是确定进程号,告诉 TCP 应该把报文发给主机的哪个进程。

2.3、最大连接数

假设有一个 IP 的服务端监听了一个端口,求 TCP 的最大连接数?

  • 服务端:通常固定在某个本地端口上监听,等待客户端的连接请求。
  • 客户端:IP 和端口可变

因此,TCP 并发连接数取决于客户端的 IP 数和端口数。

理论TCP并发连接数 = 客户端IP数 * 客户端端口数

① 理论值

理论最大值(以 IPv4 为例)

  • Max (IP 数) = 232
  • Max (端口数) = 216
  • 因此,Max (TCP 并发连接数) = 248

② 实际值(影响因素)

服务端最大并发连接数,远远无法达到理论最大值。

影响因素

  1. 文件描述符:TCP 连接的本质是文件。

    • 如果文件描述符被占满了,会发生 Too many open files,导致无法新建连接。

    • Linux 将系统可打开的文件描述符的数量分为三方面。

      # 系统级:当前系统可打开的最大数量
      cat /proc/sys/fs/file-max
      
      # 用户级:指定用户可打开的最大数量
      cat /etc/security/limits.conf
      
      # 进程级:单个进程可打开的最大数量
      cat /proc/sys/fs/nr_open
      
  2. 内存:TCP 连接需要占用内存。

    • 操作系统的内存有限。
    • 如果内存资源不足,会发生 OOM,导致无法新建连接。

3、TCP 和 UDP

3.1、区别 🔥

- TCP UDP
全称 传输控制协议
Transmission Control Protocol
用户数据报协议
User Datagram Protocol
含义 面向连接的、可靠的、字节流协议 面向无连接、不可靠的数据报协议
连接 传输之前先建立连接 即刻传输
可靠性 可靠交付
(无差错、不丢失、不重复、保序)
不保证可靠性
最大努力交付
传输方式 流式传输
(无边界,保序、可靠
逐个包发送
有边界,不保序、不可靠)
服务对象 一对一 一对一、一对多、多对多
拥塞控制、流量控制
首部开销
(固定字段一共 20 字节,选项字段可变长)

(8 字节,固定不变)
分片/组装 如果数据大小超过 MSS,在传输层分片/组装 如果数据大小超过 MTU,在网络层分片/组装

3.2、应用场景

TCP

  • FTP 文件传输
  • HTTP/HTTPS

UDP

  • 包总量较少的通信:e.g. DNSSNMP
  • 即时通信:音视频等多媒体
  • 广播通信:广播、多播
  • 限定于 LAN 等特定网络的应用通信。

3.3、首部

① TCP 首部

固定字段一共 20 字节,选项字段可变长

  • 序列号:解决网络包乱序问题。

    • 建立 TCP 连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机
    • 之后每发送一次数据,就累加该数据字节数的大小
  • 确认应答号:解决丢包问题。

    • 接收方收到数据后返回,值为下一次期望收到的数据的序列号
    • 发送端收到确认应答后,可认为该序号之前的数据都已经被正常接收
  • 控制位

    • ACK:值为 1 代表确认应答字段有效。TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1
    • RST:值为 1 代表 TCP 连接中出现异常,必须强制断开连接
    • SYN:值为 1 代表希望建立连接,并设置序列号初始值。
    • FIN:值为 1 代表希望断开连接(今后不会再有数据发送)。

    TCP 头格式

② UDP 首部

8 字节,固定不变

  • 源端口号、目标端口号

  • 包长度:UDP 首部长度跟数据长度之和

  • 校验和:为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。

    UDP 头部格式

③ 首部长度 & 包长度

TCP 有首部长度字段,没有包长度字段。

  • 首部长度:TCP 有可变长选项字段,需要记录。

  • 包长度

    • TCP 可以根据以下公式,直接计算出负载数据长度。

    • IP 首部中包含 IP 总长度和 IP 首部长度,TCP 首部中包含 TCP 首部长度

      TCP数据长度 = IP总长度 - IP首部长度 - TCP首部长度
      

UDP 没有首部长度字段,有包长度字段。

  • 首部字段:UDP 所有字段长度均固定,无需冗余记录。
  • 包长度:无法根据上述公式计算,对于该字段的常见说法如下。
    • 补齐长度:为了网络设备硬件设计和处理方便,首部长度需要是 4 字节的整数倍。
    • 记录长度:在过去,UDP 可能基于某个不提供长度信息的网络层协议。

3.4、同时使用相同端口

结论TCP 和 UDP 可以同时使用相同端口

分析

  • 端口号用于区分同一个主机不同应用程序
  • TCP 和 UDP 在内核中是两个互相独立的软件模块

假设 TCP 和 UDP 都使用 80 端,

主机的工作流程

  1. 收到数据包

  2. 根据 IP 首部的协议号字段,判断上层(网络层)协议是 TCP/UDP。

  3. 将数据包送给特定模块(TCP/UDP)处理,根据端口号确定应用程序。

    img

posted @ 2023-03-27 15:00  Jaywee  阅读(56)  评论(0编辑  收藏  举报

👇