搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小蓝xlanll
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
2024秋招阿里产品面试,学习编程的5大支柱,京东健康java面试
2
等保二级和等保三级怎么做_等保二级 nextjs
3
ECAI 2024投稿指南_ecai2024
4
Android Studio导入项目非常慢——卡在Building '项目名' Gradle project info_importing"项目名"gradle project
5
vue中list、String一些常用方法(自己总结,不断更新)_vue3 事件解析list
6
使用Arduino和Proteus仿真实例-DS3232高精度实时时钟驱动仿真物联网_proteus ds3232不走
7
【算法-LeetCode】129. 求根节点到叶节点数字之和(递归;回溯)_leetc129
8
UTS iOS插件
9
【LLM系列之LLaMA】LLaMA: Open and Efficient Foundation Language Models_llama西班牙语语料库
10
【0005】 详聊PostgreSQL中 GROUP BY(分组)的使用_pgsql group by
当前位置:
article
> 正文
TCP 协议中MSS的理解_nftable tcpmss
作者:小蓝xlanll | 2024-04-25 03:41:21
赞
踩
nftable tcpmss
在介绍MSS之前我们必须要理解下面的几个重要的概念。
MTU: Maxitum Transmission Unit 最大传输单元
MSS: Maxitum Segment Size 最大分段大小
PPPoE: PPP Over Ethernet(在以太网上承载PPP协议),就是因为这个协议的出现我们才有必要修改我们的MSS或者是MTU值。
MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC
由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址 48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分 4Bytes(这个部分有时候也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。
当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同。我们可以看下面的简单的组网图。
PC1(192.168.0.1)―――Router――――Internet―――-www server(238.136.1.1)
建立tcp连接的两端在三次握手时会协商tcp mss大小,具体如下:
pc1 发出syn报文,其中option选项填充的mss字段一般为1460,同样www server收到syn报文后,会发送syn+ack报文应答,option选项填充的mss字段也为1460;协商双方会比较syn和syn+ack报文中mss字段大小,选择较小的mss作为发送tcp分片的大小。通过比较,协商双方的tcp mss都是1460。
对于网络层的上层协议而言(我们以TCP/IP协议族为例)网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!所以会在IP数据包包头里面加上一个标签:DF(Donot Fragment)。这样当这个IP数据包通过多个路由其进行网络传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。
对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。
对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。PPPoE所谓PPPoE就是在以太网上面跑PPP协议,就是在我们传输的链路层协议上添加一层PPPOE的报头。这样相当于整个数据包的变大了。
为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,最大的坏处就是PPPoE导致MTU变小了,以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。
如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。
这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。当我们的PC链接服务器的时,只能PING通,却不能通过网页访问时,这时我们就需要考虑MSS值的大小是否正确了,一般情况下都是由MSS值不对造成的。
当然对于TCP应用而言还有另外的解决方案。就是在TCP 中有一个OPTIONS这里有一个MSS的选项。MSS 就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。这是在IPV4的协议中,而在IPV6协议中一般情况下MSS的值为1440,这是因为,IPv6中的IP头的大小是40bytes,比IPV4的大20个bytes.
我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss 1452来解决。很多的路由器配置上会有这个配置选项。如果对于IPV6的话可以调整为1432.当我们不改变中间路由器的情况下,也可以通过改变我们主机的MTC来解决。当主机的MTU值从1500改变为1492时,就相当于去掉了EthernetII和PPPOE头部的长度。
主要参考:http://www.net130.com/CMS/Pub/network/network_protocal/2005_09_22_97176.ht
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小蓝xlanll/article/detail/483071
推荐阅读
article
【
MATLAB
报错】错误使用
sym
>
to
mupad
Unable
to
convert
‘uss‘...
解决方法及解释:将符号变量s的定义从“
sym
s s”改成“s = tf(‘s’)”,tf = transfer func...
赞
踩
article
c
hatGLM3
本地
部署
【避坑指南】_
c
hatglm3
本地
部署
启动报错
c
盘用户
文件
...
本教程主要是给大家在手动搭建
c
hatGLM3
时提供避坑指引。我遇到的情况是,可以正常使用`streamlit run m...
赞
踩
article
通过修改
host
文件
来访问
GitHub
_
github
host
文件
...
通过修改
host
文件
来访问
GitHub
_
github
host
文件
github
host
文件
前...
赞
踩
article
数据结构
(
data
structure
)(
1
)
链表
和
线性表
...
if(p==first){//如果删除头指针元素,让头指针往后挪一位就可以了。if(first==null){//如果头...
赞
踩
article
Oracle VM VirtualBox
虚拟机
打开报错:
内存
不能
为
read
_
virtual
bo...
我遇到的情况是:拷贝了经理一个的 vdi 文件,添加到新创建的
虚拟机
之后,
虚拟机
报出 “
内存
不能
为
read
” 的错误。问...
赞
踩
article
对
计算机网络
用户而言,
计算机网络
(
自顶向下
方法)(原书
第
4版)
课后复习
题解答(
第
三章
)
...
...
第
三章
运输层3.1.1 假定网络层提供了下列服务。源主机中的网络层接受最大长度为1200字节和来自运输层的目的主机地址...
赞
踩
article
小
程序
轮播
图
实现_
小
程序
轮播
图
怎么实现...
1.将
轮播
图
区域里的代码填入2.在js里面放入需要的
图
片(名称)3.定义
轮播
图
的
图
片位置从哪里传入(wx:for=“?”...
赞
踩
article
istio
实现
灰度
发布
的
流量
策略_
istio
实现
灰度
发布
项目实战...
类似地,通过使用 Envoy 将
流量
路由到外部 Web 服务(例如,访问 Maps API 或视频服务 API)
的
方式,...
赞
踩
article
如何
通过
大
带宽
优化
美国站群
服务器
的
全球
访问速度
?...
通过
以上综合策略,美国站群
服务器
可以充分利用大
带宽
的优势,
优化
全球
访问速度
,提升用户体验,以及加强
全球
业务竞争力。首先,...
赞
踩
article
Flutter
应用-使用
sqflite
升级
数据库
_
flutter
的
sqflite
怎么
升级
...
数据库
迁移和备份是一项复杂
的
任务,需要仔细考虑
数据库
结构
的
变化以及如何保留和转移数据。_
flutter
的
sqflite
怎...
赞
踩
article
【
TCP
/
UDP
】
MSS
和
MTU
、
UDP
报文
、
TCP
报文
、如何实现
TCP
的
长连接、
TCP
的
粘包问题如...
这时,接收方
的
程序如果不知道发送方发送
的
消息
的
长度,也就是不知道消息
的
边界时,是无法读出一个有效
的
用户消息
的
,因为用户消...
赞
踩
article
C++
C#
自动获得
特定
串口
获得
串口
列表_
c++
获取
串口
列表...
目的:自动获得
特定
串口
。1、注册表方式//***********************// 枚举所有的
串口
,以及名称,...
赞
踩
article
Android
蓝牙
开发
系列
文章
-扫不到
蓝牙
设备,你的姿势对了吗?_bluetoothlescanne...
在写《
Android
蓝牙
开发
系列
文章
-
蓝牙
音箱连接》时,计划细化出两篇
文章
,分别是:关于
蓝牙
设备类型分类的,这个已经完成...
赞
踩
article
Java
是一种广泛使用
的
编程语言
,具有
跨平台
性和可移植性,非常适合
开发
人工智能
应用程序
_
java
是一...
人工智能
开发
可以使用
Java
语言,
Java
是一种广泛使用
的
编程语言
,具有
跨平台
性和可移植性,非常适合
开发
人工智能
应用程序
...
赞
踩
article
bluetoothAdapter
?.
startDiscovery
() 返回
false
_androi...
bluetoothAdapter
?.
startDiscovery
() 无法查询设备_
android
bluetootha...
赞
踩
article
python
包
的
安装
_
python
函数库
textblob
怎么
安装
...
1、
textblob
TextBlob是一个用Python编写
的
开源
的
文本处理库。它可以用来执行很多自然语言处理
的
任务,比...
赞
踩
article
NVM
(
nvm
-
windows
)
的
安装
和
使用
方法...
nvm
安装
和
使用
方法,如何在同一个系统中
安装
多个版本
的
node呢,在项目开发过程中,不同项目
使用
的
node版本不同,有时...
赞
踩
article
Android
Glide
使用详解...
Glide
是一个快速高效的
Android
开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一...
赞
踩
article
Linux
知识点
(十四)---监控
网络
状态
_
linux
网络
ip分配完成
网络
状态
监听...
看系统
网络
情况netstat基本语法netstat [选项]选项说明-an 按一定顺序排列输出-p 显示哪个进程在调用[...
赞
踩
article
国产商用
密码
与国际
密码
对照
_
sha
-
1
对应
的
国标
标识...
1
、SM
1
是一种分组加密算法对称加密算法中
的
分组加密算法,其分组长度、秘钥长度都是
1
28bit,算法安全保密强度跟 AE...
赞
踩
相关标签
matlab
开发语言
python
chatGLM3
本地部署
大模型
github
数据结构
java
oracle 虚拟机 打不开
内存不能为read
对计算机网络用户而言
小程序
微信小程序
istio
kubernetes
服务器
运维
flutter
sqflite
数据库备份
数据库迁移
数据库升级
tcp/ip
udp