Linux TCP/IP 协议栈相关参数

标准的 GNU/Linux 发行版试图适应各种部署情况,这意味着标准的发行版可能并没有对您的环境进行特殊的优化。GNU/Linux 提供了很多可调节的内核参数,您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响socket 性能的一些更重要的选项。

Linux的发行版本中,都存在一个/proc/目录,有的也称它为Proc文件系统。在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。下面给出了几个可调节的参数(后接用引号标识的默认值),它们可以帮助您提高 Linux TCP/IP 栈的性能,相关的帮助可以通过man tcpinfo tcp获取。在这个目录中,包括了一些特殊的文件,不仅能用来反映内核的现行状态和查看硬件信息,而且,有些文件还允许用户来修改其中的内容,以调节内核的现行工作状态,例如/proc/sys/子目录下的文件。与/proc/目录中其它目录不相同的是,/proc/sys/目录下的文件不仅能提供系统的有关信息,而且还允许用户立即停止或开启内核的某些特性及功能。在/proc/sys/目录中的/proc/sys/net/子目录更是与网络息息相关,我们 可以通过设置此目录下的某些文件来开启与网络应用相关的特殊功能,同时,也可以通过设置这个目录下的某些文件来保护我们 的网络安全。因此,作为一名Linux下的网络开发人员,就很有必要详细了解/proc/sys/net/目录下文件的各种功能和设置方法,让它能更好地为我们 工作。

    一、/proc/sys/net/目录说明。

    /proc/sys/net/目录主要包括了许多网络相关的主题,例如:appletalk/,ethernet/,ipv4/,ipx/,ipv6/。通过改变这些目录中的文件,网络管理员能够在系统运行时调整相关网络参数。虽然在Linux中还有很多有关网络的配置方法,但熟悉此目录中的相关内容对网络应用是有很大的帮助的。

/proc/sys/net/目录下有两个目录,与现在的IPV4网络的运行息息相关,调整这两个目录下的某些文件的参数,能为我们 的网络应用带到意想不到的效果,这两个目录就是/proc/sys/net/core/目录和/proc/sys/net/ipv4/目录,下面笔者将会对这两个目录中的重要文件分别作一个详细的说明。

 

    1/proc/sys/net/core/目录。

    此目录中包括许多设置用来控制Linux内核与网络层的交互,即当网络有什么动作时,内核做出什么样的相应反应。

    在其中有以下的一些重要文件:

    1)、message_burst:设置每十秒写入多少次请求警告;此设置可以用来防止DOS攻击,缺省设置为50

    2)、message_cost:设置每一个警告的度量值,缺省为5,当用来防止DOS攻击时设置为0

    3)、netv_max_backlog:设置当个别接口接收包的速度快于内核处理速度时允许的最大的包序列,缺省为300

    4)、optmem_max:设置每个socket的最大补助缓存大小;

    5)、rmem_fault:设置接收socket的缺省缓存大小(字节);

    6)、rmem_max:设置接收socket的最大缓存大小(字节);

     7)、wmem_fault:设置发送的socket缺省缓存大小(字节);

8)、wmem_max:设置发送的socket最大缓存大小(字节)。

 

     2/proc/sys/net/ipv4/目录。

      此目录中的内容用来添加网络设置,在其中的许多设置,可以用来阻止对系统的攻击,或用来设置系统的路由功能。

    其中有以下的这些重要的文件:

    1)、icmp_stunreach_rateicmp_echoreply_rateicmp_paramprob_rateicmp_timeexeed_rate:设置发送和回应的最大icmp包的速率,最好不要为0

    2)、icmp_echo_ignore_allicmp_echo_ignore_broadcasts:设置内核不应答icmp echo包,或指定的广播,值为0是允许回应,值为1是禁止;

    3)、ip_fault_ttl:设置IP包的缺省生存时间(TTL),增加它的值能减少系统开销;

    4)、ip_forward:设置接口是否可以转发包,缺省为0,设置为1时允许网络进行包转发;

    5)、ip_local_port_range:当本地需要端口时指定TCPUDP端口范围。第一数为低端口,第二个数为高端口;

    6)、tcp_syn_retries:提供限制在建立连接时重新发送回应的SYN包的次数;

    7)、tcp_retries1:设置回应连入重送的次数,缺省为3

    8)、tcp_retries2:设置允许重送的TCP包的次数,缺省为15

    二、/proc/sys/net/目录下文件的设置方法。

    在了解了/proc/sys/net/core/目录和/proc/sys/net/ipv4/目录中一些重要文件的意义和作用后,下面说说如何设置这两个目录中的这些重要文件来为我们 工作的。

    读者应该了解,在Linux系统中,要改变某种服务或设备的工作状态和功能,主要是通过使用命令方式和直接修改它的配置文件方式来达到目的,对于这两个目录下的文件,我们 也可以通过这两种方式来修改这些文件内容中的值,使它们按照我们 的意图工作。在进行设置之前,应当注意的是,当你确定要修改某个文件的当前值时,一定要保证输入的命令格式和值的内容都是正确的,因为任何的错误设置都会引起内核的不稳定,如果你不小心造成了这种问题,你就不得不重新引导系统了。在下面的说明中,笔者会将注意的地方特别说明出来的。

    首先来看看如何使用命令方式来修改这两个目录下文件的。我们 可以通过echosysctl这两个命令来修改这两个目录中的文件,下面笔者将这两个命令的使用方法分别列出来。

    1sysctl命令是为设置这两个目录中的文件而定制的,它被默认安装在/sbin/目录中, 我们 可以通过使用此命令来显示和设置/proc/sys/net/目录下的文件内容。例如:/sbin/sysctl -a命令用来显示此目录下的所有文件配置内容;/sbin/sysctl -w命令用来修改此目录下指定文件中的变量值,如:/sbin/sysctl -w net.ipv4.ip_forward="1"用来设置允许IP包转发。其它的参数,读者可以通过输入/sbin/sysctl h命令来得到,在这里就不再具体全部列出了。要注意的是,这个命令的使用需要管理员权限的,如果用户不是以管理员身份登录的,在使用此命令前用SU命令得得管理权限后再操作。

    2/proc/sys/net/目录下的文件内容也可以通过用echo命令来修改。例如:echo 1 > /proc/sys/net/ipv4/ip_forward用来设置允许IP包转发;echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all用来设置不回应ICMP ECHO包。在使用echo命令时,还应特别注意此命令的输入格式,即在echo命令和值之间,以及值与在于符号(>)之间,在于符号与要修改的文件路径之间都必需有一个空格。而且,在这两个目录中的有些文件有不上一个的值,所以,如果你想一次性传递多个值,那么,每一个值之间也应保证用空格隔开。同时也要注意的是,用此方法修改/proc/sys/net/目录下文件中的内容在系统重新启动后,所设置的内容会全部变为默认值,因此,如果要想设置的值永久有效,可以直接把这个命令加入到/ect/rc.d/rc.local文件中,在这里,这个文件的路径是指Red Hat Linux发行版本中的,其它发行版本读者根据具体情况来定。如果命令项太多,也可以把这些命令项编写成一个脚本后,加上可执行权限,再放到这个文件中,这样当系统启动时,就会按/etc/rc.d/rc.local中的设置自动执行。如果你不想修改/etc/rc.d/rc.local文件,那么笔者推荐你使用/sbin/sysctl命令。

    使用命令方式设置/proc/sys/net/目录下的文件固然方便易行,但有一部分读者更喜欢直接修改它们的配置文件的方式,因为这种方式更加直观,但它比较适合对系统了解比较深的用户。

    与其它服务或设备不同的是,Linux系统只为/proc/sys/net/目录提供了一个配置文件,那就是/ect/sysctl.conf,用户可以通过直接编辑/ect/sysctl.conf配置文件,来修改增加相应/proc/sys/net/目录下文件内容中的变量的值,这样当系统启动时就会读取此文件中的配置内容来设置相应的项。用vi来编辑此文件是非常简单的,此文件中内容格式也非常清晰易读,如其中有如下条目:net.ipv4.ip_forward=0,把值修改为1后就打开IP包转发。其实,用/sbin/sysctl命令修改和直接编辑 /etc/sysctl.conf文件内容具有相同的效果,因此,为了安全,推荐用户优先使用/sbin/sysctl命令方式。

到这里,想必读者已经对/proc/sys/net/目录下的/proc/sys/net/core//proc/sys/net/ipv4/这两个目录,已经有了一定了解了。可是,这只是笔者为了突出/proc/目录与IPV4网络的作用而特别选出来说明,其实,在/proc/目录下,还有许多的文件,虽然不能被用户如上述的两个目录那样可以被设置,但是,可以通过这些文件来了解系统详细情况和现行的运行状态,读者可以从网络上找到这个目录的详细说明。

具体设置方法举例:

任何的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数, 后面是他们的含义:

1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲
2. /proc/sys/net/core/wmem_max —
最大的TCP数据发送缓冲
3. /proc/sys/net/ipv4/tcp_timestamps —
时间戳在(请参考RFC 1323)TCP的包头增加12个字节
4. /proc/sys/net/ipv4/tcp_sack —
有选择的应答
5. /proc/sys/net/ipv4/tcp_window_scaling —
支持更大的TCP窗口. 假如TCP窗口最大超过65535(64K), 必须配置该数值为1
6. rmem_default —
默认的接收窗口大小
7. rmem_max —
接收窗口的最大大小
8. wmem_default —
默认的发送窗口大小
9. wmem_max —
发送窗口的最大大小

/proc目录下的任何内容都是临时性的, 所以重启动系统后任何修改都会丢失.

建议在系统启动时自动修改TCP/IP参数:

把下面代码增加到/etc/rc.local文档, 然后保存文档, 系统重新引导的时候会自动修改下面的TCP/IP参数:

echo 256960 > /proc/sys/net/core/rmem_default
echo 256960 > /proc/sys/net/core/rmem_max
echo 256960 > /proc/sys/net/core/wmem_default
echo 256960 > /proc/sys/net/core/wmem_max

echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling

TCP/IP参数都是自解释的, TCP窗口大小配置为256960, 禁止TCP的时间戳(取消在每个数据包的头中增加12字节), 支持更大的TCP窗口和TCP有选择的应答.

上面数值的设定是根据互连网连接和最大带宽/延迟率来决定.

: 上面实例中的数值能够实际应用, 但他只包含了一部分参数.

另外一个方法: 使用 /etc/sysctl.conf 在系统启动时将参数配置成您所配置的值:

net.core.rmem_default = 256960
net.core.rmem_max = 256960
net.core.wmem_default = 256960
net.core.wmem_max = 256960

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack =1
net.ipv4.tcp_window_scaling = 1

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将电子设备插入带电系统是终端应用程序的必要要求。通常这称为“热插拔”或“热插拔”,但也可称为“带电插拔”。在将电子设备插入带电系统并完全通电并运行之前,需要对热插拔有基本了解。没有中断。根据应用程序的不同,这些要求可能更具挑战性。例如,在热交换过程中可能需要维护I/O的状态。由于系统具有高性能、高可靠性和高速性,因此必须始终保持系统的正常运行。一个这样的应用程序是一个独立磁盘冗余阵列(RAID)存储系统,它为数据可靠性提供了高性能,并且始终保持通电和通电是必不可少的。另一个常见的例子是USB,在那里你可以插入和拔掉电源。   Spartan:registered:7和更新版本的Xilinx FPGA在性能和功能之间有着关键的平衡。本机热交换功能不是一项功能,因为这会影响性能,这意味着您在设计实时系统时必须特别小心。此上下文中的活动系统描述了已通电的系统。作为Xilinx FPGA的一个例子,每个FPGA家族都有各自独有的电源排序建议,在热插拔过程中仍然必须遵循这些建议。除了电源序列建议外,应用程序可能需要在热交换事件期间达到有效的信号完整性级别。外部电路可能需要满足有效信号完整性的I/O要求;因此,您必须了解哪些规则和限制限制了Xilinx FPGA的热插拔功能。如果需要热插拔,那么设计一个稳定可靠的系统将面临更大的挑战。此应用程序说明最好用作在热交换类型的应用程序中使用Xilinx FPGA时需要考虑的事项的清单。   热插拔检查表用作热插拔Xilinx FPGA的一般经验法则。请注意,特定的Xilinx FPGA系列的要求略有不同。这些特定于设备的要求列在特定于设备的热交换信息中。Xilinxfpgas具有相同的CMOS I/O结构,但有一些独特的旧设备是不同的。Xilinx高速串行收发器的I/O结构与GPIO不同,但一般指南仍适用于热插拔。如果存在更具体的详细要求,请查看设备数据表。
Windows Usb热插拔是指在Windows操作系统中,当USB设备插入或拔出时,系统能够自动检测并做出相应的响应。在程序中实现USB热插拔的功能,可以通过注册USB设备信息和监测USB设备插拔事件来实现。 在程序初始化时,可以通过注册USB设备信息来响应USB热插拔事件。这可以通过调用RegisterDeviceNotification函数来实现。在注册USB设备信息时,需要指定设备类型为DBT_DEVTYP_DEVICEINTERFACE,并传入相应的设备接口信息。具体的注册过程可以参考引用\[1\]中的代码示例。 另外,还可以使用第三方库来实现USB转串口设备的热插拔检测。例如,可以使用CH343PT库中的接口CH343PT_SetDevNotify来实现USB转串口设备的热插拔检测。具体的使用方法可以参考引用\[3\]中的介绍。 总结起来,Windows Usb热插拔可以通过注册USB设备信息和监测USB设备插拔事件来实现。具体的实现方法可以根据需求选择使用系统提供的函数或第三方库来完成。 #### 引用[.reference_title] - *1* [windows下USB检测插拔状态](https://blog.csdn.net/qq_22642239/article/details/110451792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CH343PT库使用一>USB转串口设备的热插拔检测](https://blog.csdn.net/WCH_TechGroup/article/details/127514913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值