什么是MTU?为什么把MTU改成1480游戏就不卡了?带你详细了解MTU

什么是MTU以及MTU的作用

  • MTU(Maximum Transmission Unit)中文名:最大传输单元。
  • MTU的作用

举一个最简单的场景,你在家用自己的笔记本上网,用的是路由器,路由器连接电信网络,然后访问了www.qq.com,从你的笔记本出发的一个以太网数据帧总共经过了以下路径

笔记本
路由器
电信机房
服务器

其中,每个节点都有一个MTU值,如下:

1500
笔记本
1500
路由器

电信机房
1500
服务器

假设现在我把笔记本的MTU最大值设置成了1700,然后发送了一个超大的ip数据包(2000),这时候在以外网传输的时候会被拆成2个包,一个1700,一个300,然后加上头信息进行传输。

1700
笔记本
1500
路由器

电信机房
1500
服务器

路由器接收到了一个1700的帧,发现大于自己设置的最大值:1500,如果IP包DF标志位为1,也就是不允许分包,那么路由器直接就把这个包丢弃了,根本就不会到达电信机房,也就到不了服务器了,所以,到这里我们就会发现,MTU其实就是在每一个节点的管控值,只要是大于这个值的数据帧,要么选择分片,要么直接丢弃。

为什么是1500?

  • 其实一个标准的以太网数据帧大小是:1518,头信息有14字节,尾部校验和FCS占了4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500

MTU是哪一层网络的概念?

  • 从表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。
OSI中的层功能TCP/IP协议族
应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层数据格式化,代码转换,数据加密没有协议
会话层解除或建立与别的接点的联系没有协议
传输层提供端对端的接口TCP,UDP
网络层为数据包选择路由IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2

假设取一个更大的值

  • 假设MTU值和IP数据包大小一致,一个IP数据包的大小是:65535,那么加上以太网帧头和为,一个以太网帧的大小就是:65535 + 14 + 4 = 65553,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组。

  • 那么假设我们现在的带宽是:100Mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:

  • ( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s)
    在100M网络下传输一帧就需要5ms,也就是说这5ms其他进程发送不了任何数据。如果是早先的电话拨号,网速只有2M的情况下:

  • ( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s)
    100ms,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。

既然大了不行,那设置小一点可以么?

  • 假设MTU值设置为100,那么单个帧传输的时间,在2Mbps带宽下需要:( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms) 时间上已经能接受了,问题在于,不管MTU设置为多少,以太网头帧尾大小是固定的,都是14 + 4,所以在MTU为100的时候,一个以太网帧的传输效率为: ( 100 - 14 - 4 ) / 100 = 82%写成公式就是:( T - 14 - 4 ) / T,当T趋于无穷大的时候,效率接近100%,也就是MTU的值越大,传输效率最高,但是基于上一点传输时间的问题,来个折中的选择吧,既然头加尾是18,那就凑个整来个1500,总大小就是1518,传输效率:1500 / 1518 = 98.8%。100Mbps传输时间:( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms)。2Mbps传输时间:( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms)
    总体上时间都还能接受

在我玩游戏的时候,为什么把MTU改成1480就不卡了?

  • 路由器默认值大多都是1500,理论上是没有问题的,那为什么我玩游戏的时候改成1480才能流畅呢?原因在于当时我使用的是ADSL上网的方式,ADSL使用的PPPoE协议。

PPPoE

  • PPPoE协议介于以太网和IP之间,协议分为两部分,PPP( Point to Point Protocol )和oE( over Ethernet ),也就是以太网上的PPP协议,而PPPoE协议头信息为
    在这里插入图片描述
  • 这里总共是48位,也就是6个字节,另外2个字节是PPP协议的ID号,占用两个字节,所以在PPPoE环境下,最佳MTU值应该是:1500 - 4 - 2 = 1492。

最根本原因

  • 问题就出在路由器拨号,如果是PC拨号,那么PC会进行PPPoE的封装,会按照MTU:1492来进行以太网帧的封装,即使通过路由器,路由器这时候也只是转发而已,不会进行拆包。
    而当用路由器拨号时,PC并不知道路由器的通信方式,会以网卡的设置,默认1500的MTU来进行以太网帧的封装,到达路由器时,由于路由器需要进行PPPoE协议的封装,加上8字节的头信息,这样一来,就必须进行拆包,路由器把这一帧的内容拆成两帧发送,一帧是1492,一帧是8,然后分别加上PPPoE的头进行发送。
    平时玩游戏不卡,是因为数据量路由器还处理得过来,而当短时间数据量过大时候,由于短时间数据量过大,路由器处理不过来,就会发生丢包卡顿的情况,也就掉线了。
    这里面提到的1480,是因为尽量设小一点,避免二次拨号带来的又一次PPPoE的封装
要使用Node.js搭建ChatGPT,你可以使用OpenAI的GPT模型以及OpenAI API来实现。下面是一个简单的示例代码: 首先,你需要安装`openai`包。在终端中运行以下命令: ``` npm install openai ``` 然后,你可以使用以下代码来与ChatGPT进行对话: ```javascript const openai = require('openai'); // 设置OpenAI API的认证密钥 const OPENAI_API_KEY = 'YOUR_OPENAI_API_KEY'; const openaiClient = new openai.LanguageCompletionClient(OPENAI_API_KEY); async function generateResponse(prompt) { // 发送请求给ChatGPT const response = await openaiClient.complete({ engine: 'text-davinci-003', // 或者选择其他的GPT版本 prompt: prompt, maxTokens: 100, // 控制回复的长度 temperature: 0.7, // 控制回复的创造性程度,0最保守,1最激进 n: 1, // 控制返回多少个回复 stop: '\n' // 在回复中指定一个停止标记 }); // 解析并返回回复 const reply = response.choices[0].text.trim(); return reply; } // 示例对话 async function chat() { let userMessage = '你好,ChatGPT!'; let chatHistory = userMessage; while (true) { const reply = await generateResponse(chatHistory); console.log('ChatGPT:', reply); // 获取下一个用户输入 userMessage = ''; // 从用户获取输入的代码 chatHistory += '\n' + userMessage + '\n' + reply; } } chat(); ``` 在上面的代码中,你需要将`YOUR_OPENAI_API_KEY`替换为你的OpenAI API密钥。然后,你可以使用`chat()`函数开始与ChatGPT进行对话。 请注意,该示例代码只是一个简单的起点,你可以根据你的需求进行扩展和定制。你可以根据你的应用场景调整请求参数,例如:回复长度、创造性程度等。 希望这可以帮助你开始使用Node.js搭建ChatGPT!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TaKe___Easy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值