背景描述:
pc 端与读写器通过网口连接,使用socket 协议传输数据
pc端设置端口,启动server ,读写器是client端
在本机测试
发现server端,socket.bind 绑定的IP,当传入的参数值为127.0.0.1与192.168.x.x时,
对方client 端必须严格按照对应的IP与port 来连接。
另外是获取socket连接到IP与port
从endPoint 转为 IPEndPoint
var ep = _client.Client.RemoveEndPoint as IPEndPoint;
if (ep != null)
{
Console.WriteLine("Address: {0}", ep.Address);
Console.WriteLine("Port: {0}", ep.Port);
}
来看一下
127.0.0.1和localhost和本机IP三者的区别
localhost 数据传输
127.0.0.1 (有IP,只到网络层IP走网卡,不到链路层MAC)
一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。
1)问题1:127.0.0.1 本机网络 IO 需要经过网卡吗?
不需要经过网卡。即使了把网卡拔了本机网络还是可以正常使用。
2)问题2:数据包在内核中是个什么走向,和外网发送相比流程上有啥差别?
总的来说,本机网络 IO 和跨机 IO 比较起来,确实是节约了一些开销。发送数据不需要进 RingBuffer 的驱动队列,直接把 skb 传给接收协议栈(经过软中断)。
但是在内核其它组件上可是一点都没少:系统调用、协议栈(传输层、网络层等)、网络设备子系统、邻居子系统整个走了一个遍。连“驱动”程序都走了(虽然对于回环设备来说只是一个纯软件的虚拟出来的东东)。所以即使是本机网络 IO,也别误以为没啥开销。
3)问题3:使用 127.0.0.1 能比 192.168.x 更快吗?
先说结论:我认为这两种使用方法在性能上没有啥差别。
我觉得有相当大一部分人都会认为访问本机 Server 的话,用 127.0.0.1 更快。原因是直觉上认为访问 IP 就会经过网卡。
其实内核知道本机上所有的 IP,只要发现目的地址是本机 IP 就可以全走 loopback 回环设备了。本机其它 IP 和 127.0.0.1 一样,也是不用过物理网卡的,所以访问它们性能开销基本一样!