0

    刚插上网线,电脑怎么知道自己的 IP 是什么?

    2023.07.27 | admin | 144次围观

    今天这篇文章,很有意思本地连接 没有ip配置,它来源于我曾经的一次真实面试里的其中一个小问题。当时是终面,面我的是那家公司的技术顾问,在面试前hr还让我看了他的履历,是一位1996年就进了麻省理工计算机系的大佬。

    属实有被震惊到,什么概念?1996年,没记错的话那是个用BP机和大哥大的年代?有几个人能用上电脑?又有几个人有这种机会能出国深造。

    这是哪部爽文小说的主人公剧情?

    就算放到现在,这也是非常强的事情。

    我这辈子是没希望了,也不知道我的儿子或者孙子辈有没有机会能做到。

    也就是说,这位大佬,至少领先了我两代人。

    那一天,我感受到了,那种跨越时代的碾压感。

    好了,不讲骚话了,直接开始主题吧。

    我们知道,如果你知道某台电脑的IP,就可以向这个IP发起连接请求,建立连接后就可以操作收发数据。

    五层网络协议对应的消息体变化分析

    要发送的数据,会在网络层里加入IP头。

    ip报头

    这里面最重要的是发送端和接收端的IP地址。这个IP地址就像是一个门牌号一样,有了它,数据包就能在这个纷繁复杂的网络世界里找到该由谁来接收这个数据包。

    所以说上面的网络通信离不开IP。

    假设我有一台新买的电脑本地连接 没有ip配置,还没联网呢,这时候拿着新买的网线,插入网线口,网线插口亮起来了。

    然后就可以开始用它上网了。

    那么问题来了。

    刚插上网线,电脑怎么知道自己的IP是什么?怎么就突然能上网了呢?

    这个话题,我们从DHCP聊起吧。

    DHCP是什么

    插上网线之后,获得IP的方式主要有两种。

    第一种是,自己手动在电脑里配。像下图那样,是macOS的一个截图,在选择手动配置之后,除了IP地址还需要配上子网掩码和路由器的地址。

    手动配IP

    这就很不科学了,电脑又不只是卖给程序员,这几个词对于大部分普通人来说,比赋能抓手闭环这种黑话还要难理解。

    大部分人没事都不应该去配这玩意。

    有没有办法可以让这些IP信息自动获得?

    有,这就是第二种获取IP的方式,DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)。

    DHCP自动生成IP

    通过DHCP,在联网之后可以自动获取到本机需要的IP地址,子网掩码还有路由器地址。

    DHCP的工作原理

    DHCP的工作原理也非常简单。

    说白了,就是向某个管IP分配的服务器,也就是DHCP服务器,申请IP地址。其实一般家里用的路由器就自带这个功能。

    整个操作流程分为4个阶段。

    DHCP协议

    到这里,问题来了

    刚插上网线,电脑怎么知道自己的 IP 是什么?

    为什么要有第三和第四阶段

    大家有没有发现,在Offer阶段,其实你的机子就已经拿到了IP了,为什么还要有后面的Request和ACK呢?是不是有些多此一举?

    这是因为本地网段内,可能有不止一台DHCP服务器,在你广播之后,每个DHCP服务器都有可能给你发Offer。

    本着先到先得的原则,你的机子一般会对第一个到的Offer响应DHCP Request,目的是为了确认offer,在你确认Offer这段时间内,DHCP服务器确认这个IP还没被分出去,你才可以安心使用这个IP。

    像不像你找工作的过程?

    你海投简历(DHCP Discover),然后拿到了多个offer(DHCP Offer)。

    这时候事情还没完,你一般会跟HR说:"你给我两天时间,我要跟家里人商量下"。

    HR也会对你说:"那你尽快确认,我这边还有不少候选人等着"。

    之后你考虑下来觉得不错,跟HR说要接这个Offer(DHCP Request),HR看了下这个岗位还在,才能确认让你第二天来上班(DHCP ACK)。如果这个公司的岗位已经招到其他候选人了,第四阶段的消息就会改为发DHCP NAK,意思是拒绝了你的接Offer请求。

    DHCP抓包

    光看原理是有些枯燥,我们可以尝试下抓包看下数据。

    在命令行里执行下面的命令,可以强行让电脑的en0网卡重新走一遍DHCP流程。

    sudo ipconfig set en0 DHCP

    en0可以替换成其他网卡,比如eth0啥的。

    这时候就可以抓到相关的数据包。

    我们可以看到蓝色的四个数据包,分别对应上面提到的四个DHCP阶段。

    其中第二阶段中的DHCP Offer里会返回给我们需要的IP、子网掩码、路由器地址以及DNS服务器地址。

    offer阶段

    另外,通过抓包,我们可以发现DHCP是应用层的协议,基于传输层UDP协议进行数据传输。

    那么问题又来了。

    为什么DHCP用UDP,能不能改用TCP?

    按道理说,UDP能做到的,TCP一般也能做到。但这次真不行。

    主要原因还是因为TCP是面向连接的,而UDP是无连接的。

    所谓"连接",他就只有一个发送端和一个接收端,就跟水管一样。

    而DHCP由于一开始并不知道要跟谁建立连接,所以只能通过广播的形式发送消息,注意,小细节,广播。

    广播寻找DHCP服务器.drawio

    同样是在本地网段内发广播消息,UDP只需要发给255.255.255.255。它实际上并不是值某个具体的机器,而是一个特殊地址,这个地址有特殊含义,只要设了这个目的地址,就会在一定本地网段内进行广播。

    而TCP却不同,它需要先建立连接,但实际上255.255.255.255对应的机器并不存在,因此也不能建立连接。如果同样要做到广播的效果,就需要先得到本地网段内所有机器的IP,然后挨个建立连接,再挨个发消息。这就很低效了。

    因此DHCP选择了UDP,而不是TCP。

    为什么第二阶段不是广播,而是单播。

    另外一个小细节不知道大家注意到没,上面在提到 DHCP Offer 阶段时,提到的是DHCP服务器会使用广播的形式回复。但抓个包下来却发现并不是广播,而是单播。

    其实,这是DHCP协议的一个小优化。原则上大家在DHCP offer阶段,都用广播,那肯定是最稳的,目标机器收到后自然就会进入第三阶段DHCP Request。而非目标机器,收到后解包后发现目的机器的mac地址跟自己的不同,也会丢掉这个包。

    但是问题就出在,这个非目的机器需要每次都在网卡收到包,并解完包,才发现原来这不是给它的消息,这。。。真,有被打扰到。

    如果本地网段内这样的包满天飞,也浪费机器性能。

    如果能用单播,那当然是最好的。但这时候目的机器其实并没有IP地址,有些系统在这种情况下能收单播包,有些则认为不能收,这个跟系统的实现有关。因此,对于能收单播包的系统,会在发DHCP Discover阶段设一个 Broadcast flag = 0 (unicast) 的标志位,告诉服务器,支持单播回复,于是服务器就会在DHCP Offer阶段以单播的形式进行回复。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论