首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux tcp mss设置

Linux TCP MSS设置基础概念

MSS(Maximum Segment Size) 是TCP协议中的一个重要参数,表示TCP段的最大数据部分的大小。MSS通常不包括TCP头部和IP头部的大小。默认情况下,MSS的值通常是1460字节(以太网的标准MTU为1500字节,减去IP头部20字节和TCP头部20字节)。

相关优势

  1. 提高传输效率:通过设置合适的MSS值,可以减少TCP段的数量,从而降低网络开销和提高传输效率。
  2. 避免分片:合理设置MSS可以避免数据包在网络中被分片,减少因分片导致的延迟和丢包问题。

类型与应用场景

静态设置

  • 应用场景:适用于网络环境稳定,不需要频繁调整的场景。
  • 设置方法:可以通过修改内核参数来静态设置MSS。

动态调整

  • 应用场景:适用于网络环境多变,需要根据实际情况动态调整MSS的场景。
  • 设置方法:可以通过应用程序在连接建立时动态协商MSS值。

设置方法

静态设置MSS

可以通过修改 /proc 文件系统中的参数来静态设置MSS:

代码语言:txt
复制
echo 1400 > /proc/sys/net/ipv4/tcp_mtu_probing

动态调整MSS

在应用程序中,可以通过设置 SO_SNDBUFSO_RCVBUF 选项来影响MSS的协商:

代码语言:txt
复制
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int sockfd;
    struct sockaddr_in servaddr;

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8080);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    int mss = 1400;
    setsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, sizeof(mss));

    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("connection with the server failed");
        exit(EXIT_FAILURE);
    }

    // 进行数据传输

    close(sockfd);
    return 0;
}

常见问题及解决方法

问题1:MSS设置过大导致分片

原因:设置的MSS值超过了网络路径上的最小MTU,导致数据包被分片。

解决方法

  • 检查并调整MSS值,使其小于等于网络路径上的最小MTU。
  • 使用路径MTU发现(PMTUD)技术动态调整MSS。

问题2:MSS设置过小影响传输效率

原因:设置的MSS值过小,导致TCP段的数量过多,增加了网络开销。

解决方法

  • 根据实际网络环境和应用需求,适当增大MSS值。
  • 使用拥塞控制算法优化传输效率。

参考链接

通过合理设置MSS,可以有效提升TCP传输的性能和稳定性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux 内核 TCP MSS 机制详细分析

所以本文将通过Linux内核源码对TCP的MSS机制进行详细分析。 测试环境 1....攻击机器 自己日常使用的Linux设备就好了 地址:192.168.11.111 日常习惯使用Python的,需要装个scapy构造自定义TCP包 自定义SYN的MSS选项 有三种方法可以设置TCP SYN...在__tcp_mtu_to_mss函数中的mss_now为我们SYN包中设置的MSS,从这里我们能看出MSS最小值是48,通过对TCP协议的理解和对代码的理解,可以知道SYN包中MSS的最小值48字节表示的是...因此我们得到的计算mss_now的公式为:SYN包设置的MSS值 - (本机发出的TCP包头部长度 - TCP头部固定的20字节长度) 所以,如果tcp_header_len的值能达到最大值60,那么mss_now...这就导致了MSS无法被设置为最小值8,最终导致该漏洞无法利用。

1.8K50

learning:tcp mss clamp

这样看来tcp syn报文中mss长度默认设置为1300,mtu = 1300+20+20 = 1340,IP报文和tcp报文待扩展字段都会导致实际发包报文长度减少。...代码中在偏移tcp头时,未考虑此场景。 2、MSS配置支持单方向设置,但是只能生效一个方向,需要注意。...可设置为:   'do':禁止分片,即使包被丢弃;   'want':当包过大时分片;   'dont':不设置分片标志(DF flag); 链接http://aiezu.com/article/linux_ping_command.html...上述场景发现是linux内核接口ens256 mtu设置为1500,所以直接返回了local error。...选项之MSS (通过内核源码分析mss设置大小及设置来源) https://blog.csdn.net/xiaoyu_750516366/article/details/85316123 6、TCP的分段和

2K42
  • Linux 内核 TCP MSS 机制详细分析

    所以本文将通过Linux内核源码对TCP的MSS机制进行详细分析。...设备就好了 2.3 攻击机器 地址:192.168.11.111 日常习惯使用Python的,需要装个scapy构造自定义TCP包 自定义SYN的MSS选项 有三种方法可以设置TCP SYN包的MSS值...在__tcp_mtu_to_mss函数中的mss_now为我们SYN包中设置的MSS,从这里我们能看出MSS最小值是48,通过对TCP协议的理解和对代码的理解,可以知道SYN包中MSS的最小值48字节表示的是...因此我们得到的计算mss_now的公式为:SYN包设置的MSS值 - (本机发出的TCP包头部长度 - TCP头部固定的20字节长度) 所以,如果tcp_header_len的值能达到最大值60,那么mss_now...这就导致了MSS无法被设置为最小值8,最终导致该漏洞无法利用。

    1.8K20

    细说TCP的MSS选项(1)

    同一个TCP连接,两个方向上的MSS大小可以不同,并且发送方的TCP报文的最大数据长度不能超过对端声明的MSS大小。 明确了MSS的含义之后,就要问MSS的大小由什么决定?...再次感谢开源的Linux内核,可以帮助我们解开这个秘密。 在函数tcp_syn_options中, ? 对TCP选项mss进行了赋值。接下来进入tcp_advertise_mss。...综上所述,可以总结出影响TCP的MSS的因素: 路由设置的advmss选项; 出口路由的MTU减去40(TCP和IP报文的固定首部大小); IPv4的最高IPV4_MAX_PMTU-40(同上); 通常我们都不会设置路由的...TCP握手阶段的MSS,在内核代码中被称为advmss,即通告MSS。而在TCP的传输过程中,就像开头提到的那样,中间路由设备发生了变化,从而导致协商时的MSS大小不再适用于当前传输路径。...专注Linux网络领域开发,坚持每周一更。

    8.2K42

    细说TCP的MSS选项(2)

    在上一篇细说TCP的MSS选项(1)中给出的了影响MSS的因素:一般都是由出口路由的MTU决定。但这只是TCP的syn报文的情况,今天就要分析syn+ack报文中的MSS的情况。...使用ifconfig设置本地网卡的MTU为1000时,再次访问www.baidu.com。抓包结果如下: ? 我本地出口网卡的MTU为1000,减去40,即syn报文中MSS值,960。...函数tcp_make_synack是用于生成syn+ack报文,其中 ? tcp_mss_clamp用于获得syn+ack报文的mss值。 ?...而tcp_mss_clamp仅是使用user_mss(该TCP套接字配置的MSS选项)与抽口dst的MSS进行对比。...只有设置了user_mss,且其值又小于dst的MSS时,才会使用user_mss,否则syn+ack报文就是dst的MSS值——也就是前文中所述,出口路由的MTU-40。

    2.7K21

    TCP的MTU Probe和MSS(2)

    在上一篇《TCP的MTU Probe和MSS(1)》介绍了TCP使用MTU Probe来避免PMTU变小而导致发送失败的方法。...其主要思想是在TCP发送失败时,发送方会不断尝试降低MSS的大小,直至满足PMTU的限制,成功发送数据。...还有一种情况:TCP报文丢失而重传时,MTU probe功能会自动减小MSS。 如果探测成功会怎么样?...探测报文的发送时间间隔超过配置值,则更新探测上限为可能MTU的最大值(MSS上限+TCP首部+IP报文首部),下限为根据当前MSS计算的MTU值。...至此,TCP MTU Probe的原理已经分析完毕,做一个简单的总结:当PMTU变小时,MTU Probe通过丢包发现这种情况,从而不断的降低当前MSS值,达到成功发送的目的。

    2.9K20

    通过案例来学习TCP的MSS、MTU

    时间都是花在在丢包重传等待的过程 奇怪的问题是图中橙色框中看到的,网络这时候是联通的,客户端跟服务端在这个会话中依然有些包能顺利到达(Keep-Alive包) 同时注意到重传的包长是1442,包比较大了,看了一下tcp...建立连接的时候MSS是1500,应该没有问题 查看了scp的两个容器的网卡mtu都是1500,正常 基本上看到这里,能想到是因为丢包导致的scp卡死,因为两个容器mtu都正常,包也小于mss,那只能是网络路由上某个环节...over-mtu packet: 1428 > 1400 结论 到这里问题已经很明确了 openvswitch 收到了 一个1428大小的包因为比mtu1400要大,所以扔掉了,接着查看宿主机1的网卡mtu设置果然是...因为这是客户给的同一批宿主机默认想当然的认为他们的配置到一样,尤其是mtu这种值,只要不是故意捣乱就不应该乱修改才对,我只检查了两个容器的mtu,没看宿主机的mtu,导致诊断中走了一些弯路 通过这个案例对mtu/mss

    1.6K70

    Linux网络编程TCP

    OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...struct sockaddr_in servaddr; /*(2) 设置服务器协议族sockaddr_in结构*/ bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family...AF_INET, SOCK_STREAM,0); if(listen_fd == -1) { perror("Socket Error:"); return 0; } /*(2) 设置服务器

    5.4K30

    【Linux网络】TCP协议

    引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转移、TCP数据流、TCP数据流的控制等等方面来讨论! 在TCP协议中,通信双方的地位是平等的。...当接收缓冲区收到一个或者多个TCP报文后,TCP模块将它们携带的应用程序的数据按照TCP报文的序号【见下文】依次放入TCP接收缓冲区中,并通知应用程序读取数据。...Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍....那么在该传输方向上(从A到B),后续的TCP报文段中序列号值将会被系统设置成ISN+该报文段所携带的数据的第一个字节在整个字节流中的偏移量。...TCP标记位 控制位由6个标志位组成,每个标志位占1位,总共6位。这些标志位可以单独设置,也可以组合设置,以表达不同的控制信息。 URG(紧急指针有效) 当URG=1时,表示紧急指针字段有效。

    13710

    Linux TCP RST情况

    另一个可能导致的“Connection reset”的原因是服务器设置了Socket.setLinger (true, 0)。...但我检查过线上的tomcat配置,是没有使用该设置的,而且线上的服务器都使用了nginx进行反向代理,所以并不是该原因导致的。关于该原因上面的oracle文档也谈到了并给出了解释。...然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests...少了网络交互而且没有TIME_WAIT 问题 超过超时重传次数、网络暂时不可达 TIME_WAIT 状态 tw_recycle = 1 时,sync timestamps 比上次小时,会被rst[/yiji] 设置...connect_timeout 应用设置了连接超时,sync 未完成时超时了,会发送rst终止连接。

    6K10

    【Linux】Socket编程—TCP

    TCP socket API 详解   下面介绍程序中用到的 socket API,这些函数都在 sys/socket.h 中。...设置地址类型为 AF_INET;   3....网络地址为 INADDR_ANY, 这个宏表示本地的任意 IP 地址,因为服务器可能有 多个网卡,每个网卡也可能绑定多个 IP 地址, 这样设置可以在所有的 IP 地址上监听, 直到与某个客户端建立了连接时才确定下来到底用哪个...我们定义为 8080; listen() 介绍:listen()声明 sockfd 处于监听状态, 并且最多允许有 backlog 个客户端处于连接 等待状态, 如果接收到更多的连接请求就忽略, 这里设置不会太大...Echo Server   有了上面的接口,我们就可以实现以TCP为基础的简单消息回显服务器了,运行结果应该如下图所示: 代码如下: TCP服务器 #pragma once #include <iostream

    8810

    【Linux】: 传输层协议 TCP

    TCP 协议段格式 理解TCP的报头: Linux 内核是C语言写的,在 UDP 说过报头是协议的表现,而协议本质就是结构体数据。所有 tcp报头 就是一个结构化或位段。...Linux 中 ( BSD Unix 和 Windows 也是如此), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍....默认情况下,SYN 标记位为 0,只有在建立连接时该标记位才会设置为 1。...参数控制,这与客户端重发 FIN 报文的重传次数控制方式是一样的 ④ 第四次挥手失败,发生如下:  在 Linux 系统中,TIME_WAIT状态会持续 2MSL 后才会进入关闭状态 3....拥塞避免的ssthresh值通常设置为65535字节。 ⭕ 拥塞避免的增长规则 每收到一个ACK,cwnd增加1/cwnd。 以线性增长代替慢启动的指数增长,增长速度放缓。

    13410

    Linux下TCP延迟确认(Delayed Ack)机制导致的时延问题分析

    本文后续部分将通过分析TCP/IP在Linux下的实现,来解释一下TCP的延迟确认机制。 1.为什么TCP延迟确认会导致延迟?...,则允许发送; 2)如果该包含有FIN,则允许发送; 3)设置了TCP_NODELAY选项,则允许发送; 4)未设置TCP_CORK选项时,若所有发出去的包均被确认,或所有发出去的小数据包(包长度小于...而quick这个属性其代码中的注释为:scheduled number of quick acks,即快速确认的包数量,每次进入quickack模式,quick被初始化为接收窗口除以2倍MSS值(linux...设置TCP_CORK选项,就是用塞子塞住管道,而取消TCP_CORK选项,就是将塞子拔掉。..., TCP_CORK, &on, sizeof(on)); //unset TCP_CORK 当TCP_CORK选项被设置时,TCP链接不会发送任何的小包,即只有当数据量达到MSS时,才会被发送。

    39.1K101

    浅谈TCP优化

    Linux中通过配置内核参数里接收缓冲的大小,进而可以控制接收窗口的大小: shell> sysctl -a | grep mem net.ipv4.tcp_rmem = ...通过如下方式可以确认缓冲大小自动调优机制的状态(0:关闭、1:开启): shell> sysctl -a | grep tcp_moderate_rcvbuf 如果缓冲大小自动调优机制是关闭状态,那么就把缓冲的缺省值设置为...BDP;如果缓冲大小自动调优机制是开启状态,那么就把缓冲的最大值设置为BDP。.../ 2^tcp_adv_win_scale 依照Linux内核版本的不同,net.ipv4.tcp_adv_win_scale 的值可能是 1 或者 2,如果为 1 的话,则表示二分之一的缓冲被用来做额外开销...既然加大「cwnd」初始值这么好,那么到底应该设置多大为好呢?Google在这方面做了大量的研究,权衡了效率和稳定性之后,最终给出的建议是10MSS。

    2K30

    浅谈TCP优化

    Linux中通过配置内核参数里接收缓冲的大小,进而可以控制接收窗口的大小: shell> sysctl -a | grep mem net.ipv4.tcp_rmem = ...通过如下方式可以确认缓冲大小自动调优机制的状态(0:关闭、1:开启): shell> sysctl -a | grep tcp_moderate_rcvbuf 如果缓冲大小自动调优机制是关闭状态,那么就把缓冲的缺省值设置为...BDP;如果缓冲大小自动调优机制是开启状态,那么就把缓冲的最大值设置为BDP。.../ 2^tcp_adv_win_scale 依照Linux内核版本的不同,net.ipv4.tcp_adv_win_scale 的值可能是 1 或者 2,如果为 1 的话,则表示二分之一的缓冲被用来做额外开销...既然加大「cwnd」初始值这么好,那么到底应该设置多大为好呢?Google在这方面做了大量的研究,权衡了效率和稳定性之后,最终给出的建议是10MSS。

    2.5K50
    领券