皮皮网

【免费源码商城】【易语言进度条源码下载】【传智播客 在线支付 源码】loopback源码

2024-12-28 19:08:02 来源:可扩展源码

1.求CS1.6服务器架设
2.转发:轻松理解 Docker 网络虚拟化基础之 veth 设备!源码
3.linux下如何安装ar8171网卡的源码驱动?
4.InetAddress.getLocalHost() 执行很慢?

loopback源码

求CS1.6服务器架设

       1@ 准备活动,嘿咻嘿咻^

       一、首先 你必须要有个高配置的源码电脑,如果是源码做服务器的话,最好内存是源码在M以上的机器,至于 内存 CPU 等对架设CS服务器的源码免费源码商城影响!然后是源码要了解的是,你上网的源码网络结构,是源码通过 Modem+路由+交换机 上网,还是源码用 代理服务器+交换机 上网!

       二、源码CS的源码服务器端文件 由于现在CS1.6已经是比赛的版本了,所以偶就以1.6的源码为主,1.5的源码其实也一样的,但是源码会少了很多的特效,比如1.5就不支持中文等。 其实服务器端用的文件,并没多大的规定一定要用hlserver,也就是通常所说的服务器版,完全没那个必要,我下的那些所谓的服务器端,其实和1.6客户端的区别很小,也就是说,服务器端和客户端通用。所以大家完全没必要去一味追求服务器端。本文以版本来做服务器端为例(个人强烈推荐用ESAI版的cs1.6)。

       三、服务器端的安装和设置 运行下载回的服务器:按提示一步一步安装,建议最好用英文命名,不推荐用中文名,安装完成以后,先不要运行服务器程序,运行的话是进入游戏,而不是开始服务器!进入刚才安装的那个文件夹,找到Hlds.exe文件,创建一个快捷方式(ESAI版自动创建),然后把刚才那个快捷方式改一下名字,方便以后使用,偶改为Server,接下来是重点了。。。。请注意听了哦!打开SERVER快捷方式的属性,加入参数!那里就是服务器运行的时候必须要用到的启动参数,参数不同,服务器运行的效果也不同!以偶的为例,

       -game cstrike +servercfgfile server.cfg -nomaster -insecure -port +maxplayers +map de_dust2 +sv_lan 1 -console

       我一个一个解释好了:)

       -game cstrike 这个就是易语言进度条源码下载指定以反恐精英为游戏的Mod,如果不指定的话就是半条命的模式,听说也不错很好玩的哦,没玩过

       +servercfgfile server.cfg 这个就是指定服务器的配置文件,server.cfg这个文件放在cstrike下,后面偶会详细介绍一下该文件的

       -nomaster 加载这个参数就是让服务器不上WON认证,避免因为出国网络不通导致的服务器问题。

       -insecure 这个参数运行VAC反作弊插件的 1 为开启 0 为关闭!

       -port 指定服务器运行时候的端口,范围最好是在- 之间,据我的测试,局域网列表能刷出来的就是在这个范围内,当然,如果你想用来做比赛服务器不想让其他人进的话,你可以指定任意不被占用的端口。

       +maxplayers 这个参数是指定服务器最大进入玩家数,理论上最高能进人,有的地图最高只能进人,比如CS_italy 那些早期救人质的图都这样的。并不是说一定要以人为最大,这个要和你的网络状况及服务器配置相联系的,关于CPU 内存 网络带宽 之间的联系,请在论坛上搜索一下,或者到我的论坛去查找一下,只有人数合适了,你的服务器才能运行在快速稳定的状态!+map de_dust2 这个参数就是当服务器一开始运行的时候,运行的第一张地图,你可以该为任意的,但是要注意,最好以 cstrike\maps 目录下的地图,不然服务器会出错!此主题相关如下:图中,以bsp为结尾的文件都是地图文件,注意:参数不用带文件全名,例如 de_dust2 就可以了, 没必要这样 de_dust2.bsp

       -console 控制台,如果不带这个参数的话,你架设好的服务器就不能在那个黑底白字的窗口上输入一些服务器命令

       +sv_lan 1 这个参数是控制该服务器是局域网还是战网的一个重要参数,当为 0 的时候,外网玩家也可以进入,当为 1 的时候,就只有局域网的玩家才能进入。如果要做面向公网和内网(不知道什么叫公网和内网的,请自己找资料学习),这个参数建议为 0 综合以上讲解,很容易了解,

       -**me cstrike +servercfgfile server.cfg -nomaster -insecure -port +maxplayers +map de_dust2 +sv_lan 1 -console 用这些个参数架设的服务器是一个CS1.6反恐精英,不通过WON验证,游戏端口为,人数最多为人,开始游戏地图为沙漠2,传智播客 在线支付 源码面向局域网的服务器!如果要面向内外网的话,去掉 -nomaster +sv_lan 1这两个参数就行了!

       参数配置正确了,就可以开始运行服务器了?别急,还没配置完全呢,还有一个比较重要的文件server.cfg还没配置呢!

       ------------------------------我是不华丽的分割线--------------------------------------------------

       2@ 准备做眼保健操吧……

       具体操作方法:进入安装目录的cstrike下,你可以看到一个Server.cfg文件,这个文件是一个文本文件,但是没和任何文本编辑软件关联,也就是说,当你打开的时候,系统会提示你打开方式,你可以选择用记事本打开。打开以后你会看到如下的信息:

       rcon_password "****"

       hostname "****网 **** CS1.6 Server"

       sv_maxspeed

       mp_autokick 0

       mp_autocrosshair 0

       mp_autoteambalance 0

       mp_buytime 0.

       mp_consistency 1

       mp_c4timer

       mp_fadetoblack 1

       mp_falldamage 1

       mp_flashlight 1

       mp_forcecamera 3

       mp_friendlyfire 1

       mp_freezetime

       mp_fraglimit 0

       mp_hostagepenalty 0

       mp_limitteams 6

       mp_logfile 1

       mp_logmessages 1

       mp_logdetail 3

       mp_maxrounds 0

       mp_playerid 0

       mp_roundtime 2.5

       mp_startmoney

       mp_timelimit

       mp_tkpunish 0

       mp_winlimit 0

       sv_aim 0

       sv_airaccelerate

       sv_airmove 1

       sv_allowdownload 0

       sv_clienttrace 1.0

       sv_clipmode 0

       sv_allowupload 0

       sv_cheats 0

       sv_gravity

       sv_maxrate

       sv_maxspeed

       sv_maxupdaterate

       sys_ticrate

       decalfrequency

       pausable 0

       log on

       decalfrequency

       edgefriction 2

       host_framerate 0

       exec listip.cfg

       exec banned.cfg

       哇靠!文件也太简单了吧,我记得以前还带解释的,现在这么都这样了呢?!

       不管他,反正我也看得懂是啥意思,我来解释好了!只解释一些常用的,没解释到的推荐用默认值。一般 0 为关 1 为开

       rcon_password "XXX" 这个是进入服务器的密码,如果不改的话,就相当于是一个带密码的服务器,推荐去掉 "" 里面部分

       hostname "ESAI—CS1.6 Server" 服务器的名字,这个当然要改的了,改为你想改的名字就行了

       sv_maxspeed 重力速度什么的,不推荐修改用默认的好了。。

       mp_autokick 0 自动踢人,当某位玩家因为一些其他的因素,常时间不动或者死机等,系统就会踢除该玩家,0 为关 1为开

       mp_autocrosshair 0 准心的大小自动调节,建议不要改

       mp_autoteambalance 0 双方自动平衡,建议开启,否则会出现两边队伍人数不平衡

       mp_buytime 0. 购买武器时间 以秒为单位,*0.=秒

       mp_c4timer C4爆炸时间,国际比赛好像是秒,推荐用这个值就行了

       mp_fadetoblack 1 死后黑屏,推荐改为0

       mp_falldamage 1 跌落损伤,这个不用改

       mp_flashlight 1 手电筒开启

       mp_forcecamera 3 死亡后视角 有0 1 2 3 三种模式,其中0 为视角固定模式 1 为仅限队友视角 2 为仅限队友第一视角 3为自由观看模式

       mp_friendlyfire 1 自伤模式,自己人能打自己人,不是比赛服的话推荐关掉

       mp_freezetime 开始买枪时候的静止不能行走的冻结时间,秒也太夸张了。3秒就够了

       mp_roundtime 2.5 每回合的时间,以分为单位,PHP电子商务网站源码2.5为两分半钟,推荐改为3或者3.5 如果是死亡模式的话可以改为5

       mp_startmoney 开局资金,一般都是 最高可以改为 不推荐改!

       mp_timelimit 每个地图玩的时间 分钟合适了。如果改为0 的话就是不限制时间

       mp_tkpunish 0 Team Killer 就是上局杀了自己方人的,这局就会挨惩罚,好像是死一局,开启为1 要和之前那个mp_friendlyfire 1同时开启才用用

       mp_winlimit 0 当某方胜利多少局的时候换图,0 为关闭

       当然还有其他比较详细的介绍,我这个只是大概介绍一下,偶发偶服的出来给大家看看:

       sv_password ""

       rcon_password "feilang"

       hostname "龙华网城CS1.6服务器 [CD]"

       sv_maxrate

       sv_minrate

       sv_maxspeed

       // 暂停游戏 禁止0/允许1

       pausable 0

       // 作弊模式 关闭0/开启1

       sv_cheats 0

       // 自动瞄准 关闭0/开启1

       sv_aim 0

       // 战术手电 允许1/禁止0

       mp_flashlight 1

       // 脚步声 开启1/关闭0

       mp_footsteps 1

       // 高处落下伤害 开启1/关闭0

       mp_falldamage 1

       // 自动踢出不动的玩家 开启1/关闭0

       mp_autokick 1

       // 观察员模式 开启1/关闭0

       allow_spectators 1

       // 服务端设定游戏复位的时间,包括杀人数、武器、金钱和得分。设0不复位。

       sv_restartround 2

       // 每局时间分钟

       mp_timelimit

       // 购买武器冻结时间 (0-)建议5秒以内。

       mp_freezetime 3

       // 每回合4分钟

       mp_roundtime 3

       //购买武器装备时间(0.-1.5)即秒-秒

       mp_buytime 0.

       // 炸弹倒计时时间 (-)

       mp_c4timer

       //开始游戏时的金钱数量(-)

       mp_startmoney

       // 死亡后视角 1本队队友 2原地 0无限制

       mp_forcechasecam 1

       // 死亡后视角模式 0自由跟随/1固定跟随

       mp_chasecam 1

       // 人物死亡后屏幕 不变黑0/变黑1

       mp_fadetoblack 0

       // 友军误伤 关闭0/开启1

       mp_friendlyfire 0

       // 手雷友军伤害 关闭0/开启1

       mp_friendly_grenade_damage 0

       // 杀害友军惩罚 0不惩罚/惩罚:杀害队友超过(1-n)人,下一回合自动死亡

       mp_tkpunish 0

       // 自动调整双方队伍平衡 不调整0/调整(1-n)个人

       mp_autoteambalance 1

       // 双方人数差超过n人即自动调整人数差异 0关闭

       mp_limitteams 2

       // 杀害人质惩罚 0不惩罚/惩罚:规定时间内伤害人质超过(1-n)人自动踢出

       mp_hostagepenalty 0

       // 杀人数、得分上限 无0/有(1-n),超过上限就换地图。

       mp_fraglimit 0

       // 胜利次数上限无0/有(1-n),超过上限就换地图。

       mp_winlimit 0

       // 回合上限 无0/有(1-n),超过上限就换地图。

       mp_maxrounds 0

       // 允许下载 开启1/关闭0

       sv_allowdownload 1

       // 允许下载(sv_allowdownload 1)开启时控制是否允许玩家的LOGO传送 允许1/禁止0

       sv_send_logos 1

       // 允许下载(sv_allowdownload 1)开启时控制是否允许资源文件传送 允许1/禁止0

       sv_send_resources 1

       // 允许上传 关闭0/开启1

       sv_allowupload 1

       // 服务器重力设置 默认正常重力,范围-到

       sv_gravity

       // 投票比率(大家可以通过投票踢出作弊者和更换地图) (0.1-1)

       mp_mapvoteratio 0.6

       // 设定鬼魂模式刷新值(0.1-1)

       mp_ghostfrequency 0.1

       // 服务器高品质纹理 关闭0/开启1

       sv_sendvelocity 0

       // 服务器减少LAG延迟现象(对服务器要求高) 关闭0/开启1

       mp_lowlag 0

       // 服务器细节数据发送 默认 ,可减低到、,改善速度。

       mp_decals

       // 服务器是否允许麦克风语音通讯 允许1/禁止0

       sv_voiceenable 1

       // 服务器是否允许客户端之间使用语音通信 允许1/禁止0

       sv_alltalk 0

       sv_region 4

       //区域 4为亚洲

       cdrequired "1"

       cdrequiredversion auto

       //为1 是需要CD ,第二行为自动检测CD版本

       // 服务器是否记录文件 不记录0/记录1

       mp_logfile 0

       // 是否在记录文件里记录谈话内容 不记录0/记录1

       mp_logmessages 0

       // load ban files

       exec listip.cfg

       exec banned.cfg

       PS:如果你改的是中文名的话最好用WINDOWS记事本保存并另存为UTF-8格式

       -------------------------------------还是不华丽的分割线---------------------------------------------------

       3 泡杯茶继续看

       接下来就要解释一下其他几个个性化服务器必须要修改到的文件,这两个也是其中的一部分:

       mapcycle.txt 和 motd.txt 简要介绍一下就行了。。第一个是地图列表文件,也就是当服务器运行的时候,就只会在这个文件中有的地图之间从上到下运行,de_dust2

       de_inferno

       de_cbble

       de_train

       de_nuke

       de_cpl_mill

       de_aztec

       de_dust

       从第一个到最后一个,然后在循环

       motd.txt这个文件比较特殊,这个就是当玩家进入你的服务器的时候,看到的第一个欢迎 logo,它是以文本文件形式存在,但是确实一个html网页的源码,如果你有网页制作的功底的话,可以做得很好看。其实你也可以将现成在网页上的图地址替换原先里面的地址,EASY。

       ---------------------------------------------应要求变华丽一点的分割线-------------------------------

       4[size]@接下来的就是问最多的插件问题了[size]

       进入cstrike的addons目录下:

       第一个amxmodx 是amx插件的主文件夹,其下的configs 是一些插件的设置amxx.cfg 是一些amx的设置,plugins.ini是插件的调用配置管理,users.ini 是用户配置文件,用户的在线考试系统源码 asp.net一些权限都是在这里设置的。amxmodx\doc 里面有个帮助文件,那里可以学到更多关于amx的管理和使用,amxmodx\plugins 是一些插件的源码文件的存放位置,大致介绍各个文件夹放在什么位置,等下偶会详细解释最主要的amx.cfg 和plugins.ini还有 users.ini的配置!

       addons\Booster 这个是服务器加速插件,推荐一定要开启,那样服务器才能运行在一个高速的状态下;开启于关闭我会在后面介绍;

       addons\cdeath 这个是CD反作弊服务器版的文件,很多朋友都不知道怎么样使用,偶等下在介绍吧!

       addons\metamod 下的 plugins.ini 是所有的插件的根基,也就是说,如果这个文件夹下没有任何东西的话,你什么插件都用不了,很多的插件都要在那个plugins.ini里面设置,但是这个和 addons\amxmodx\configs 下的 plugins.ini 又不同,这个plugins.ini 是所有插件的基础,另外一个只是针对amx加载的插件!

       所以接下来可能要花很长的时间和篇幅对以下插件进行讲解:

       addons\metamod\plugins.ini

       addons\amxmodx\configs\amxx.cfg

       addons\amxmodx\configs\plugins.ini

       addons\amxmodx\configs\users.ini

       一个好的CS服务器基本就Depend on (靠)这几个文件了。

       现在我开始讲解一下所有插件的根基,addons\metamod\plugins.ini 的配置吧!

       win addons\booster\booster_mm.dll 这个是服务器的加速插件,如果不加载这个东西的话,服务器最高不超过Fps

       ;win dlls\chicken_mm.dll 这个是一个娱乐用的,也就是变成小鸡的插件。

       ;win addons\amx\dlls\amx_mm.dll 这个是加载amx的插件,如果不加载的话,很多基于amx的插件就用不了,比如死亡

       ;win addons\amx\dlls\fun_ms.dll 这个也是死亡和魔兽服务器中必须要用到的插件

       ;win addons\amx\dlls\csstats_ms.dll 这个也是死亡和魔兽服务器中必须要用到的插件

       ;win addons\amx\dlls\war3_ms.dll 这个是Amx的一个子插件,魔兽插件,可以在该plugins.ini 中配置,也可以在另外那个plugins.ini (addons\amxmodx\configs\plugins.ini )中加载但是就只能加载一个,重复的不算

       ;win dlls\monster_mm.dll 这个也是Amx的一个子插件,同样可以在这里配置也可以在另外那个 plugins.ini 中配置

       ;win addons/wwcl/dlls/pcawwclconfig_mm.dll WWCL 这个是一个规则插件,某种程度上也能防到某些玩家作弊

       win addons/cdeath/cdmod.dll 这个就是大名鼎鼎的 Cheating-Death CD反作弊的插件,不过现在CD已经不更新了...

       所有的插件以“;”(半角模式下的分号) 开启和关闭 也就是说,你要开启某个插件的话,就不能在该行之前用这个符号,如果不想开启某个插件的话,就在该行 即win的前面,加上一个这个,就能让那个插件不运行了!

       比如:

       我想屏蔽ChickenMod 1.0.5.1插件,只需要在win dlls\chicken_mm.dll这行行首加入;注释符号屏蔽掉这行即可,即将win dlls\chicken_mm.dll改为;win dlls\chicken_mm.dll

       这样我们在启动服务器时,服务器就不会启动ChickenMod 1.0.5.1插件插件。如果想再次开启ChickenMod 1.0.5.1插件,只需要把此行行首的;符号去掉并保存plugins.ini文件即可。其他插件的屏蔽/开启也是如此。

       如下

       ; 说明:

       ; 开启某个模块请去掉前面的分号

       ; 关闭某个模块请在前面加上分号

       ;////////////////////////////////////////////////////////////

       ;// --------------------- Booster ------------------------ //

       ;////////////////////////////////////////////////////////////

       ; 请按自己的CPU选择你需要的程序, 以下2个只能开启一个

       win addons/Booster/booster_mm.dll

       ;win addons/Booster/booster__mm.dll

       ;////////////////////////////////////////////////////////////

       ;// ------------------- AMX Mod X ------------------------ //

       ;////////////////////////////////////////////////////////////

       win addons/amxmodx/dlls/amxmodx_mm.dll

       ; linux 请按自己的CPU选择你需要的程序, 以下2个只能开启一个

       linux addons/amxmodx/dlls/amxmodx_mm_i.so

       ;linux addons/amxmodx/dlls/amxmodx_mm_amd.so

       ;////////////////////////////////////////////////////////////

       ;// --------------- Cheating Death ----------------------- //

       ;////////////////////////////////////////////////////////////

       ; win 请按自己的CPU选择你需要的程序, 以下5个只能开启一个

       win addons/CDeath/cdmod.dll

       ;win addons/CDeath/cdmod_i.dll

       ;win addons/CDeath/cdmod_i.dll

       ;win addons/CDeath/cdmod_k7.dll

       ;win addons/CDeath/cdmod_p4.dll

       ; linux 请按自己的CPU选择你需要的程序, 以下5个只能开启一个

       linux addons/CDeath/cdmod_i.so

       ;linux addons/CDeath/cdmod_i.so

       ;linux addons/CDeath/cdmod_i.so

       ;linux addons/CDeath/cdmod_k7.so

       ;linux addons/CDeath/cdmod_p4.so

       有点乱,大家就只要注意没分号的部分吧!linux不在本帖的讨论范围内,偶对linux的服务器不了解,虽然现在也在学习中

       接下来就是amxx.cfg和plugins.ini 还有users.ini 的配置讲解了,先从amxx.cfg开始好了:)

       其实amxx.cfg文件里面已经有很多的提示了,我就大概说一下吧!先来看偶安装的这个****中amxx.cfg各部分的参数:

       // AMX MOD X 配置文件.

       echo Executing AMX Mod X Configuration File

       // 用户的默认权限,可以用此定义为普通的玩家也加上各种权限,相关权限请参考uers.ini文件的权限说明

       amx_default_access "z" 这个就是玩家的默认权限,相关的权限在users.ini 中有设置

       // AMX的远程登陆总密码(所有op都一样),首次配置时必须修改。

       // setinfo信息会将密码保存在config.cfg文件里。(为了避免泄露密码,请在结束游戏后删除自己的config.cfg)

       // (管理员登陆时请控制台里输入 setinfo _pw "管理员密码",或者直接写入自己的config.cfg文件中)

       amx_password_field "_pw" 这个就是amx远程OP的密码,一定要改的,别和server.cfg中的密码混淆就行

       // 服务器的记录模式选项

       // 0 - 禁止权限登陆,所有的玩家都没有任何的权限

       // 1 - 正常模式

       // 2 - kick所有users.ini文件上无帐号的玩家

       amx_mode 1 服务器的记录模式,一般默认就行了。

       // 在op执行某个命令时是否显示op的行动

       // 0 - 关闭

       // 1 - 不显示OP的行动

       // 2 - 显示OP的行动

       amx_show_activity 2

       // 服务器定时在下方滚动显示服务器信息,以秒为单位

       amx_scrollmsg "欢迎来到 %hostname% -- 该服务器使用了 AMX Mod X 管理插件"

       这里就是一些在游戏中看到的滚动的字的设置位置,可以多设置几条,但是要注意最后那里时间,不能相同,否则就只显示头一条!

       // clanmod风格的服务器MOTD彩色信息,后面的颜色RGB代码可以自己修改

       amx_imessage "欢迎来到 %hostname%" ""

       amx_imessage "这个服务器使用了 AMX Mod X 管理插件\n下载地址

       mand (拥有KICK权限)

       ; d - amx_ban and amx_unban commands (拥有ban的权限)

       ; e - amx_slay and amx_slap commands (拥有强行杀死某人的权限)

       ; f - amx_map command (拥有更换地图的权限)

       ; g - amx_cvar command (可以设置amx的设置参数,但并不是所有的都可以)

       ; h - amx_cfg command (可以加载某个AMX的CFG设置文件权限)

       ; i - amx_chat and other chat commands (可以以管理员身份发布消息)

       ; j - amx_vote and other vote commands (可以发起一个投票事件)

       ; k - access to sv_password cvar (可以更改为服务器加密码)

       ; l - access to amx_rcon command and rcon_password cvar (by amx_cvar command)(可以用RCON命令来以OP身份登陆服务器)

       ; m - custom level A (自定义管理级别,为附加的其他插件预留的权限等级)

       ; n - custom level B

       ; o - custom level C

       ; p - custom level D

       ; q - custom level E

       ; r - custom level F

       ; s - custom level G

       ; t - custom level H

       ; u - menu access (拥有打开MENU管理菜单的权限)

       ; z - user (普通用户权限)

       ; 帐号类型:

       ; a - disconnect player on invalid password (此用户的id进入服务器时需要检测密码)

       ; b - clan tag (此用户的id带有战队标签)

       ; c - this is steamid/wonid (此用户靠steamid/wonid进入服务器)

       ; d - this is ip (此用户靠ip进入服务器)

       ; e - password is not checked (only name/ip/steamid needed)(此用户进入时不检查密码,只需要id或者ip或者steamid)

       ; 密码:

       ; 在自己的autoexec.cfg里加入: setinfo _pw ""

       ; 此处 _pw 代表的是参数 amx_password_field 设定的密码

       ; 管理员帐号格式:

       ;

       ; 例子:

       ; "STEAM_0:0:" "" "abcdefghijklmnopqrstu" "ce"

       ; "..." "" "abcdefghijklmnopqrstu" "de"

       ; "My Name" "my_password" "abcdefghijklmnopqrstu" "a" 如果把My Name 部分和 my_password 改一下,你就有最高的权限了

       "loopback" "" "abcdefghijklmnopqrstu" "de"

       记得之前 amxx.cfg 中 amx_default_access "z" 这个的设置嘛?! 其实就是参考这里的,如果把一些权限加进去,比如:J P Z 注意 你的服就能拥有 投票换图的那个功能了。。。

       最后剩下的就是 plugins.ini 的配置了,这个文件是管理amx下哪些插件的加载与关闭的,内容如下:

       ; AMX Mod X 插件

       ; 管理类 - 以下两个只能使用一种

       admin.amxx ; 管理员识别 (与管理员相关的插件都需要该插件)

       ;admin_sql.amxx ;

转发:轻松理解 Docker 网络虚拟化基础之 veth 设备!

       大家好,我是飞哥!

       最近,飞哥对网络虚拟化技术产生了浓厚的兴趣,特别是想深入理解在Docker等虚拟技术下,网络底层是如何运行的。在探索过程中,飞哥意识到网络虚拟化技术是一个挑战,尽管飞哥对原生Linux网络实现过程的理解还算不错,但在研究网络虚拟化相关技术时,仍感到有些难度。

       然而,飞哥有解决这类问题的技巧,那就是从基础开始。今天,飞哥将带大家深入理解Docker网络虚拟化中的基础技术之一——veth。

       在物理机组成的网络中,最基础、简单的网络连接方式是什么?没错,就是直接用一根交叉网线把两台电脑的网卡连起来,这样一台机器发送数据,另一台就能接收到。

       网络虚拟化实现的第一步就是用软件模拟这种简单的网络连接。实现的技术就是我们今天讨论的主角——veth。veth模拟了在物理世界里的两块网卡,以及一条网线,通过它可以将两个虚拟的设备连接起来,实现相互通信。平时我们在Docker镜像中看到的eth0设备,实际上就是veth。

       Veth是一种通过软件模拟硬件的方式来实现网络连接的技术。我们本机网络IO中的lo回环设备也是一种通过软件虚拟出来的设备,与veth的主要区别在于veth总是成对出现。

       现在,让我们深入了解veth是如何工作的。

       veth的使用

       在Linux中,我们可以使用ip命令创建一对veth。这个命令可以用于管理和查看网络接口,包括物理网络接口和虚拟接口。

       通过使用`ip link show`进行查看。

       和eth0、lo等网络设备一样,veth也需要配置IP才能正常工作。我们为这对veth配置IP。

       接下来,启动这两个设备。

       当设备启动后,我们可以通过熟悉的ifconfig查看它们。

       现在,我们已经建立了一对虚拟设备。但为了使它们互相通信,我们需要做些准备工作,包括关闭反向过滤rp_filter模块和打开accept_local模块。具体准备工作如下:

       现在,在veth0上pingveth1,它们之间可以通信了,真是太棒了!

       在另一个控制台启动了tcpdump抓包,结果如下。

       由于两个设备之间的首次通信,veth0首先发出一个arp请求,veth1收到后回复一个arp回复。然后就是正常的ping命令下的IP包。

       veth底层创建过程

       在上一小节中,我们亲手创建了一对veth设备,并通过简单的配置让它们互相通信。接下来,让我们看看在内核中,veth是如何被创建的。

       veth相关的源码位于`drivers/net/veth.c`,初始化入口是`veth_init`。

       `veth_init`中注册了`veth_link_ops`(veth设备的操作方法),包含了veth设备的创建、启动和删除等回调函数。

       我们先来看看veth设备的创建函数`veth_newlink`,这是理解veth的关键。

       `veth_newlink`中,通过`register_netdevice`创建了peer和dev两个网络虚拟设备。接下来的`netdev_priv`函数返回的是网络设备的私有数据,`priv->peer`只是一个指针。

       两个新创建的设备dev和peer通过`priv->peer`指针完成配对。dev设备中的`priv->peer`指针指向peer设备,而peer设备中的`priv->peer`指针指向dev。

       接着我们再看看veth设备的启动过程。

       其中`dev->netdev_ops = &veth_netdev_ops`这行代码也非常重要。`veth_netdev_ops`是veth设备的操作函数。例如在发送过程中调用的函数指针`ndo_start_xmit`,对于veth设备来说就会调用到`veth_xmit`。这部分内容将在下一个小节详细说明。

       veth网络通信过程

       回顾《张图,一万字,拆解Linux网络包发送过程》和《图解Linux网络包接收过程》中的内容,我们系统介绍了Linux网络包的收发过程。在《.0.0.1 之本机网络通信过程知多少 ?》中,我们详细讨论了基于回环设备lo的本机网络IO过程。

       基于veth的网络IO过程与上述过程图几乎完全相同,不同之处在于使用的驱动程序。我们将在下一节中具体说明。

       网络设备层最后会通过`ops->ndo_start_xmit`调用驱动进行真正的发送。

       在《.0.0.1 之本机网络通信过程知多少 ?》一文中,我们提到对于回环设备lo来说,`netdev_ops`是`loopback_ops`。那么`ops->ndo_start_xmit`对应的发送函数就是`loopback_xmit`。这就是在整个发送过程中唯一与lo设备不同的地方。我们简单看看这个发送函数的代码。

       `veth_xmit`中的主要操作是获取当前veth设备,然后将数据发送到对端。发送到对端设备的工作由`dev_forward_skb`函数完成。

       先调用`eth_type_trans`将`skb`所属设备更改为刚刚取到的veth对端设备rcv。

       接着调用`netif_rx`,这部分操作与lo设备的操作相似。在该方法中最终执行到`enqueue_to_backlog`,将要发送的`skb`插入`softnet_data->input_pkt_queue`队列中,并调用`_napi_schedule`触发软中断。

       当数据发送完毕唤起软中断后,veth对端设备开始接收。与发送过程不同的是,所有虚拟设备的收包`poll`函数都是一样的,都是在设备层初始化为`process_backlog`。

       因此,veth设备的接收过程与lo设备完全相同。想了解更多这部分内容的同学,请参考《.0.0.1 之本机网络通信过程知多少 ?》一文中的第三节。

       总结

       大部分同学在日常工作中通常不会接触到veth,因此在看到Docker相关技术文章中提到veth时,可能会觉得它是一个高深的技术。实际上,从实现角度来看,虚拟设备veth与我们日常接触的lo设备非常相似。基于veth的本机网络IO通信图直接从《.0.0.1的那篇文章》中复制而来。只要你看过飞哥的《.0.0.1的那篇文章》,理解veth将变得非常容易。

       只是与lo设备相比,veth是为了虚拟化技术而设计的,因此它具有配对的概念。在`veth_newlink`函数中,一次创建了两个网络设备,并将对方设置为各自的peer。在发送数据时,找到发送设备的peer,然后发起软中断让对方收取数据即可。

       怎么样,是不是很容易理解!

       轻松理解 Docker 网络虚拟化基础之veth设备!

linux下如何安装ar网卡的驱动?

       解决方法:从光盘里找到kernel-devel软件包,然后放进系统里安装。

       安装了 kernel-devel软件包 ,再安装网卡驱动包。

       以前安装过遇到这类的问题,附件是以前写的,您可以参考下。

InetAddress.getLocalHost() 执行很慢?

       某次在 SpringBoot 2.2.0 项目中,引入了代码导致项目启动明显变慢,并触发了相关警告信息。信息显示,获取主机信息耗时超过阈值毫秒。如果为Mac系统,则会提示在/etc/hosts文件中配置本地DNS。通过查看hosts文件,发现添加了主机名后,警告信息消失。这引发了对获取主机信息机制的探究。

       为了解决问题,首先尝试更改hosts文件内容,并使用sudo killall -HUP mDNSResponder 刷新DNS,避免重启电脑。再次启动程序后,警告信息消失,表明主机信息获取耗时未超过毫秒。

       接下来,通过Wireshark抓包观察网络行为。在本地回环网络中,选择了Loopback网络接口。在没有添加主机名时,发现主机信息获取耗时较长,经过三次请求后返回结果。添加主机名后,程序直接读取hosts文件获取主机名,无需网络交互。

       为了深入了解过程,查看了对应的源码。在没有添加主机名时,时间主要耗在InetAddress.getAddressesFromNameService方法中。进一步跟踪发现,调用链路耗时主要集中在nameService.lookupAllHostAddr方法。深入到native方法后,查阅了jdk源码。发现实际的实现涉及与操作系统的交互。

       通过在Java项目中直接输入主机名,对比hosts文件中添加或未添加主机名的情况,发现未添加时无法找到网络地址,而添加后能返回本地IP地址.0.0.1。这说明系统对标准Linux代码进行了修改,加入了本地缓存、重试和超时机制,以优化主机名获取过程。

       总结,本文通过使用多种技术手段研究了Java中获取主机名慢的问题,包括Wireshark抓包、Arthas工具定位性能瓶颈、查看jdk源码等,揭示了主机名获取的原理及优化机制。进一步研究时,可能需要验证本地缓存、重试和超时等机制的详细实现。参考文章提供了一些查找和分析相关技术细节的途径,有助于深入理解问题。