让我们假设我需要从一个服务发送到同一主机上的其他数据。 为此,我可以使用localhost:port或real.domain.name:port (让我们认为它caching或可以由本地dns解决)。 我相信最好使用localhost:端口,因为在lo界面上延迟较less。 这是对的吗 ?
一般来说,不。 在Linux中,只有特定软件检测到这种情况并切换到unix套接字(如mysql do,afaik)时,这才是正确的。
否则,这些数据包将经历完全相同的path。 lo地址(127.0.0.1)和其他本地地址被添加到“本地”路由表(你可以用'ip route view table local'查看)。 在这方面他们都是相似的。
为了说明我的话,我们来尝试简单的程序(在tcl中,这是编写tcp服务器的最简单的语言)。 (要自己尝试,将它们保存到文件中并使用'tclsh filename.tcl'运行)
服务器:
proc accept {chan addr port} { ;# Make a proc to accept connections #puts "$addr:$port says [gets $chan]" ;# Receive a string puts $chan goodbye ;# Send a string close $chan ;# Close the socket (automatically flushes) } ;# socket -server accept 12345 ;# Create a server socket vwait forever
客户:
set start [clock seconds] puts $start for {set i 0} {$i < 1000000} {incr i} { set chan [socket 192.168.7.121 12345] ;# Open the connection puts $chan hello ;# Send a string flush $chan ;# Flush the output buffer #puts "127.0.0.1:12345 says [gets $chan]" ;# Receive a string close $chan ;# Close the socket } set ends [clock seconds] puts $ends puts [expr $ends-$start]
基准:当我用127.0.0.1运行时,1000000个周期花了35秒。
当我运行192.168.7.121(我的笔记本电脑的WLAN接口的地址,我指定它在'套接字地址端口'条款):花了37秒。 这个差距实际上只不过是一个保证金。
所以,不,如果使用tcp到localhost与使用fqdn和其他IP地址相比,你不会得到任何东西。 为了真正从本地受益,您必须使用unix域套接字(AF_UNIX系列),它确实比tcp更快。
有一种情况,你必须使用真正的地址,而不是本地主机。 这种情况是当你configurationKerberos。 这不是真正的速度,我只是说这个例子,你不能使用本地主机。
如果你的问题是127.0.0.1与192.168.0.5(或者你的服务器托pipe的其他本地IP地址)的性能,那么性能将会大体相同,因为networking堆栈将检查它的ARP表以找出在哪里发送数据包,注意这是一个本地地址,并在本地传送。 它永远不会到达NIC卡驱动程序,并导致NIC卡驱动程序使用任何CPU周期。 唯一的性能影响是只适用于其他本地地址而不适用于127.0.0.1的iptables规则。
如果你真的想使用real.domain.name并将其指向127.0.0.1,那么修改你的localhost的/ etc / hosts文件:
127.0.0.1 localhost localhost.localdomain real.domain.name
然后没有涉及DNS查询(检查/ etc / hosts非常快)。 这也允许,如果real.domain.name移动到另一个主机,从/ etc / hosts中删除它,并使用该(现在是远程)主机,而不以任何方式更改应用程序的configuration。
如果要连接到同一台主机上的本地服务,请始终使用本地主机地址,而不要使用IP地址,主机名或FQDN。 这三个可以在您的环境中更改,并不总是保证您能够连接到该服务,并且还具有其他networking依赖性,如DNSparsing。
假设你有一个本地DNScaching,我会使用域名,而不是本地主机。
这样,如果你把你的服务移动到另一台主机上,它仍然可以工作,而本地主机将永远在你的本地机器上被删除。
有一个足够长的DNS ttl这个条目会让你远离DNS滞后(这可能不是那么重要,取决于你的环境)。
使用本地IP将是快速的,无论是否在lo界面上。