对自身IP数据报在网卡处理的一些认识
2011-04-08 11:39
183 查看
在做业务测试的时候,客户提出了一个新的需求。通过实际测试发现,这个需求不可以实现,但是要给出理论分析,于是又学了一些TCP/IP的东西。
问题的关键是对于发送到自身的IP数据包,是否会先经过网卡发出去,然后再经过网卡接收回来。通过用Wireshark抓取网卡收发的数据包发现,对于自身的IP数据包,网卡并没有收发的情况出现。那么,网卡对这种数据包是怎么处理的呢?
关于localhost、127.0.0.1和网络IP
a) localhost : 本地服务器,不经过网卡传输
b) 127.0.0.1 : 本机地址,可以测试TCP/IP服务是否正常,依赖网卡,并受到网络防火墙和网卡相关的限制,只能通过本机访问,可以测试网卡是否工作正常,排除了网络的影响
c) 网络IP : 网络中主机地址,可以测试联网情况
在网上查资料发现,localhost的实现类似于我们在创建socket的时候使用AF_UNIX域,这种方式也就是使用命名管道的方式。
ip输出函数先检查地址是不是环回地址:
1.如果是环回地址,直接交给环回驱动程序处理,返回ip输入函数
2.如果不是环回地址,检查是不是广播地址或者多播地址
3.如果不是广播或者多播地址,才检查是不是本机地址,如果是本机地址,则交给环回驱动程序处理,环回驱动程序返回给ip输入函数
那么,对于ping自身的数据报是怎么走的?
这很简单:
1)主机发送ping自身IP地址的包
2)系统在FIB路由表中尝试查找路由
3)发现找到的路由项类型为RTN_LOCAL
4)把数据包的dev_out设置为loopback_dev
5)利用回环接口发送数据包
需要注意,网上对这种机制的讨论是在linux环境下,这是TCP/IP协议的规定,与OS无关。
问题的关键是对于发送到自身的IP数据包,是否会先经过网卡发出去,然后再经过网卡接收回来。通过用Wireshark抓取网卡收发的数据包发现,对于自身的IP数据包,网卡并没有收发的情况出现。那么,网卡对这种数据包是怎么处理的呢?
关于localhost、127.0.0.1和网络IP
a) localhost : 本地服务器,不经过网卡传输
b) 127.0.0.1 : 本机地址,可以测试TCP/IP服务是否正常,依赖网卡,并受到网络防火墙和网卡相关的限制,只能通过本机访问,可以测试网卡是否工作正常,排除了网络的影响
c) 网络IP : 网络中主机地址,可以测试联网情况
在网上查资料发现,localhost的实现类似于我们在创建socket的时候使用AF_UNIX域,这种方式也就是使用命名管道的方式。
ip输出函数先检查地址是不是环回地址:
1.如果是环回地址,直接交给环回驱动程序处理,返回ip输入函数
2.如果不是环回地址,检查是不是广播地址或者多播地址
3.如果不是广播或者多播地址,才检查是不是本机地址,如果是本机地址,则交给环回驱动程序处理,环回驱动程序返回给ip输入函数
那么,对于ping自身的数据报是怎么走的?
这很简单:
1)主机发送ping自身IP地址的包
2)系统在FIB路由表中尝试查找路由
3)发现找到的路由项类型为RTN_LOCAL
4)把数据包的dev_out设置为loopback_dev
5)利用回环接口发送数据包
需要注意,网上对这种机制的讨论是在linux环境下,这是TCP/IP协议的规定,与OS无关。
相关文章推荐
- 关于HAMCP 相关网卡及ip地址的一些认识
- 添加网卡驱动和USB支持 以及一些问题的集中处理
- Activity的一些自身认识
- iOS/调试器和程序崩溃时的一些处理方法
- java在处理大数据的时候一些小技巧
- 在java中对字符串的一些实现处理
- Android 守护进程的一些认识
- 图像处理中的一些基本概念
- 对快排的一些小小的认识
- 在Squid中处理一些比较长的ACL列表
- android中EditText输入框处理一些特殊符号
- 对overflow与zoom”清除浮动”的一些认识
- linux下oracle 11g一些简单的操作和一些错误处理
- 图像处理方面的一些期刊
- ios 中弹窗的编程 和 一些处理方法
- 一些有关图像处理的代码片段(抓图、倒影、圆角)
- 在处理争论上的一些意见
- 【C++】我对C++ const修饰符的一些认识
- Android的一些方案处理
- 关于遍历对象的属性的一点新认识,如何只遍历对象自身的属性