TCP连接的最大数据包大小 ——Maximum Packet Size for a TCP Connection

1介绍

传输控制协议(TCP)是在连接的网络上发送文件或消息的有用协议。每个文件在发送网络上被分割成数据包。数据包在到达接收网络时合并。TCP数据包的最大大小是64K(65535字节)。通常,数据包大小受到网络资源的最大传输单元(MTU)的限制。MTU是网络硬件设置的数据传输限制的最大大小。数据包大小不应超过MTU。在本教程中,我们将尝试解释这些术语背后的概念,并探索它们的各个方面。

2 TCP连接

TCP连接使用TCP,这是互联网协议套件中的核心协议之一,提供了一种可靠的数字通信协议。TCP从网络资源(如服务器、路由器、交换机)接收消息,将它们分割成数据包,然后将它们转发到目标网络资源。几乎所有涉及互联网的连接都使用TCP连接。我们将在后面的部分解释更多关于数据包如何工作的内容。让我们以电子邮件通信为例来理解TCP通信:

 我们可以从上图看到,一封电子邮件经过了OSI模型的七层处理。源服务器的每一层都与目标服务器的相应层进行通信。

  • 应用层:当我们发送电子邮件时,电子邮件客户端使用SMTP协议与电子邮件服务器通信。
  • 表示层 将我们的邮件转换为ASCII和图像。
  • 会话层 建立并维护与目标服务器的连接。
  • 传输层 将消息分割成多个数据包,并添加源和目标服务器的端口信息。
  • 网络层 通过添加相应的IP地址来定义数据包的路由路径。有趣的是,即使每个数据包都是为同一个目标而传输,它们使用的路由路径也可能不同。
  • 数据链路层 准备数据包在以太网上传输
  • 物理层 最终在物理连接(如LAN电缆、WiFi或宽带)上传输帧。

下图解释了上述过程:

 

当数据包到达目标网络(上图中的Host2)的物理层时,目标电子邮件服务器的每一层都对数据包进行处理,以检索数据并在目标收件箱中显示我们的电子邮件。

3 帧和数据包

计算机网络内部的数字数据交换使用帧和数据包。帧和数据包之间的主要区别是,帧是位的串行集合,而数据包是封装在帧中的分段数据。数据包是OSI模型中网络层内的单个数据单元。每个数据包通常包括一个头部和一个有效载荷。头部有源和目标网络设备的端口和IP地址。数据或消息内容是有效载荷。例如,当我们传输一个图像文件时,该文件被分割成几个数据包。这些数据包包含图像的部分,分别传输。接收网络设备重新连接这些数据包以重建图像文件。最后,它们合并以检索相同的图像文件:

 数据包包含了指导它们到达目标地址的信息和检查传输错误和数据完整性的信息。有效地分割数据有助于网络管理不同的网络参数,如带宽、路由和设备连接。

4 为什么数据包大小很重要?

数据包丢失率取决于数据包大小。数据包越大,丢失的可能性越高

数据包大小对通信网络参数(如数据包丢失率和吞吐量)产生不同的影响。

我们必须保持数据包大小低于MTU,以获得更好的TCP连接性能。

最大数据包大小应在1500字节(宽带)和576字节(拨号)之间。路由器可以从接口配置信息中获取目标连接的MTU。

4.1. 优点

基于数据包的TCP通信的优点如下:

  • 有效地利用网络的带宽。
  • 根据通信标准使用可变的数据包大小。
  • 每个数据包根据最佳网络路由独立传输。
  • 不需要专用通道来路由数据包,而是使用任何可连接到目标网络的网络路径。
  • 使用操作系统的功能配置数据包大小。
  • 小的数据包大小可以提供更好的网络延迟

4.2. 缺点 基于数据包的TCP连接的缺点如下:

  • 将数据包大小配置高于MTU可能导致抖动。
  • 小的数据包大小可能导致传输速度慢。
  • 当最大数据包大小超过网络的物理MTU时,会影响性能。

当不分片(DF)标志处于活动状态时,无法对数据包进行分片。如果DF状态处于非活动状态,路由器可以将一个数据包分割成多个片段。目标设备稍后可以重新连接这些片段。它将返回未分片的数据包到源网络。 Pv6:路由器不能对数据包进行分片,并将其返回到源网络。

5 不同MTU下的数据包分片

假设一个使用TCP通信的源设备在网络上发送一个IP数据包。该数据包大小必须小于目标和中间网络的MTU。这个限制是由网络数据链路层和硬件MTU决定的。那么如果数据包大于中间网络或目标设备的MTU会发生什么呢?

答案是将该数据包进一步分成两半,这个过程称为分片。单独的片段是碎片,然后在目标网络重新连接以检索完整的数据包。然而,根据IP协议的类型,如IPv4和IPv6,可能会发生以下情况:

  • IPv4:当不分片(DF)标志处于活动状态时,无法对数据包进行分片。如果DF状态处于非活动状态,路由器可以将一个数据包分割成多个片段。目标设备稍后可以重新连接这些片段。它将返回未分片的数据包到源网络。
  • Pv6:路由器不能对数据包进行分片,并将其返回到源网络。

让我们看看分片是如何工作的。下图显示了一个源数据链或MTU为1500字节,目标MTU为1200字节。考虑到允许分片,1400字节的数据包被分成1200字节和200字节:

在分片过程中,原始数据包会发生什么?

它们被丢弃了,其中的数据被分片了。

5.1. 优点

  1. 减少开销
  2. 不需要路径MTU发现(PMTUD)的开销。

5.2. 缺点

  1. 一个片段的丢失可能需要重新发送数据包并重新开始分片。
  2. 只有第一个片段包含头部,这可能导致依赖于检查头部的设备出现问题。
  3. 分片可能需要重新排序,特别是如果只有少数数据包被分片。

6. MTU的重要性

MTU是一个表示网络资源能够有效接受的数据包最大大小的单位。它是其他网络建立TCP连接时必须知道的最重要的参数。较大的MTU支持更多的数据在较少的数据包中传输,从而提高传输速度和性能。然而,如果通信发生错误,数据包需要更长的时间来重新传输。较小的MTU可以改善网络延迟。

7结论

本文介绍了TCP连接的最大数据包大小。首先,我们讨论了数据包大小的概念。然后我们谈到了了解数据包大小的重要性。关于TCP连接的数据包大小的信息有助于理解TCP连接性能。总之,源网络必须确保数据包大小不超过目标网络的MTU。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Go 中,可以通过 `net.Conn` 接口来写入 TCP 数据包。如果要修改已经发送数据包,则需要使用底层的 socket API。 下面是一个示例,演示如何使用 Go 的 `syscall` 包来修改已经发送TCP 数据包: ```go package main import ( "fmt" "net" "syscall" ) func main() { // 连接到服务器 conn, err := net.Dial("tcp", "localhost:8080") if err != nil { panic(err) } defer conn.Close() // 发送一些数据 message := []byte("hello") _, err = conn.Write(message) if err != nil { panic(err) } // 修改已经发送的数据 fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, syscall.IPPROTO_TCP) if err != nil { panic(err) } defer syscall.Close(fd) // 构造 IP 数据包头部 ipHeader := []byte{ 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, } // 构造 TCP 数据包头部 tcpHeader := []byte{ 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, } // 构造 TCP 数据 data := []byte("modified") // 将 IPTCP 头部、数据拼接起来 packet := append(ipHeader, tcpHeader...) packet = append(packet, data...) // 发送数据包 err = syscall.Sendto(fd, packet, 0, &syscall.SockaddrInet4{ Port: 8080, Addr: [4]byte{127, 0, 0, 1}, }) if err != nil { panic(err) } fmt.Println("修改数据成功") } ``` 在上面的示例中,我们首先通过 `net.Dial()` 方法连接到服务器,然后发送了一些数据。接着,我们使用 `syscall.Socket()` 创建了一个原始的 TCP 套接字,利用这个套接字可以构造和发送 TCP 数据包。我们构造了 IPTCP 头部,将它们与修改过的数据拼接起来,最后通过 `syscall.Sendto()` 发送数据包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值