本文为社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!
今日这篇文章,很有意思,它来历于我从前的一次实在面试里的其间一个小问题。其时是终面,面我的是那家公司的技术顾问,在面试前hr还让我看了他的阅历,是一位1996年就进了麻省理工计算机系的大佬。
属实有被震动到,什么概念?1996年,没记错的话那是个用BP机和大哥大的年代?有几个人能用上电脑?又有几个人有这种机会能出国深造。
这是哪部爽文小说的主人公剧情?
就算放到现在,这也是十分强的作业。
我这辈子是没希望了,也不知道我的儿子或者孙子辈有没有机会能做到。
也便是说,这位大佬,至少领先了我两代人。
那一天,我感触到了,那种跨过年代的碾压感。
好了,不讲骚话了,直接开端主题吧。
咱们知道,假如你知道某台电脑的IP,就能够向这个IP建议衔接恳求,树立衔接后就能够操作收发数据。
要发送的数据,会在网络层里参加IP头。
这儿边最重要的是发送端和接纳端的IP地址。这个IP地址就像是一个门牌号相同,有了它,数据包就能在这个纷繁复杂的网络世界里找到该由谁来接纳这个数据包。
所以说上面的网络通讯离不开IP。
假设我有一台新买的电脑,还没联网呢,这时分拿着新买的网线,刺进网线口,网线插口亮起来了。
然后就能够开端用它上网了。
那么问题来了。
刚插上网线,电脑怎样知道自己的IP是什么?怎样就突然能上网了呢?
这个话题,咱们从DHCP聊起吧。
DHCP是什么
插上网线之后,取得IP的方法主要有两种。
榜首种是,自己手动在电脑里配。像下图那样,是macOS的一个截图,在挑选手动装备之后,除了IP地址还需求配上子网掩码和路由器的地址。
这就很不科学了,电脑又不仅仅卖给程序员,这几个词关于大部分普通人来说,比赋能抓手闭环这种黑话还要难了解。
大部分人没事都不应该去配这玩意。
有没有办法能够让这些IP信息主动取得?
有,这便是第二种获取IP的方法,DHCP(Dynamic Host Configuration Protocol,动态主机装备协议)。
经过DHCP,在联网之后能够主动获取到本机需求的IP地址,子网掩码还有路由器地址。
DHCP的作业原理
DHCP的作业原理也十分简略。
说白了,便是向某个管IP分配的服务器,也便是DHCP服务器,请求IP地址。其实一般家里用的路由器就自带这个功能。
整个操作流程分为4个阶段。
- DHCP Discover:在联网时,本机因为没有IP,也不知道DHCP服务器的IP地址是多少,所以底子不知道该向谁建议恳求,所以索性挑选播送,向本地网段内所有人宣布音讯,问询”谁能给个IP用用“。
- DHCP Offer:不是DHCP服务器的机子会疏忽你的播送音讯,而DHCP服务器收到音讯后,会在自己保护的一个IP池里拿出一个空闲IP,经过播送的方式给回你的电脑。
- DHCP Request:你的电脑在拿到IP后,再次建议播送,就说”这个IP我要了”。
- DHCP ACK:DHCP服务器此时再回复你一个ACK,意思是”ok的”。你就正式取得这个IP在一段时间(比方24小时)里的运用权了。后续只需IP租约不过期,就能够一向用这个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服务器地址。
其他,经过抓包,咱们能够发现DHCP是应用层的协议,根据传输层UDP协议进行数据传输。
那么问题又来了。
为什么DHCP用UDP,能不能改用TCP?
按道理说,UDP能做到的,TCP一般也能做到。但这次真不行。
主要原因还是因为TCP是面向衔接的,而UDP是无衔接的。
所谓”衔接”,他就只有一个发送端和一个接纳端,就跟水管相同。
而DHCP因为一开端并不知道要跟谁树立衔接,所以只能经过播送的方式发送音讯,留意,小细节,播送。
同样是在本地网段内发播送音讯,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阶段以单播的方式进行回复。
是不是每次联网都要阅历DHCP四个阶段?
只需想联网,就需求IP,要用IP,就得走DHCP协议去分配。
但咱们也发现了,DHCP榜首阶段和第二阶段都或许会发播送音讯。关于家用电脑还好,插个网线,之后就雷打不动。但像手机这样的移动设备,是要带着到处跑的,坐个地铁,进个电梯,公司里到处逛逛,都或许会涉及到网络切换。
这每次都要来一个完整的四阶段,各种播送音讯满天飞,其实对网络环境不太友爱。
所以问题叒来了,是不是每次联网都要阅历DHCP四个阶段?
当然不需求。
咱们会发现每次断开wifi再翻开wifi时,机子会阅历一个从没网到有网的进程。
这时分去抓个包,会发现。
其实只发生了DHCP的第三和第四阶段。这是因为机子记载了从前运用过 192.168.31.170
这个IP,从头联网后,会优先再次恳求这个IP,这样就省下了榜首第二阶段的播送了。
其他需求留意的是,抓包图里DHCP Request
之所以呈现两次,是因为榜首次Request宣布后太久没得到回应,因而重发。
DHCP分配下来的IP必定不会重复吗?
一般来说DHCP服务器会在它保护的IP池里找到一个没人用的IP分配给机子,
这个IP假如重复分配了,那本地网段内就会呈现两个同样的IP,这个IP下面却对应两个不同的mac地址。但其他机器上的ARP缓存中却只会记载其间一条mac地址到IP的映射联系。
所以,数据在传递的进程中就会出错。
因而本地网段内IP必须仅有。
那么DHCP分配下来的IP有没有或许跟其他IP是重复的?
都这么问了,那肯定是或许的。
有两个常见的状况会呈现IP重复。
- 文章最初提到,IP是能够自己手动配的,自己配的IP是有或许跟其他DHCP分配下来的IP是相同的。解决方案也很简略,尽量不要手动去配IP,统一走DHCP。或者在DHCP服务器里保护的IP范围里,将这条IP剔除。
- 一个本地网段内,是能够有多个DHCP服务器的,而他们保护的IP地址范围是有或许重叠的,所以就有或许将相同的IP给到不同的机子。解决方案也很简略,修正两台DHCP服务器的保护的IP地址范围,让它们不重叠就行了。
不过吧,上面的解决方案,都需求有权限去修正DHCP服务器。
得到DHCP ACK之后立马就能运用这个IP了吗?
这就好像在问,拿到offer之后你是榜首时间就去上班吗?
不。
你会先告知你的同事同学朋友,甚至会发朋友圈。
你的机子也相同。
在得到DHCP ACK之后,机子不会立刻就用这个IP。
而是会先发三条ARP音讯。
咱们知道ARP音讯的意图是经过IP地址去取得mac地址。所以普通的ARP音讯里,是填了IP地址,不填mac地址的。
但这三条ARP协议,比较特别,它们叫无偿ARP(Gratuitous ARP
),特点是它会把IP和mac地址都填好了,而且填的还是自己的IP和mac地址。
意图有两个。
- 一个是为了告知本地网段内所有机子,从现在起,xx IP地址归于xx mac地址,让咱们记载在ARP缓存中。
- 另一个便是看下本地网段里有没有其他机子也用了这个IP,假如有抵触的话,那需求从头再走一次DHCP流程。
在三次无偿ARP音讯之后,承认没有抵触了,才会开端运用这个IP地址进行通讯。
这种行为,实际上就跟你拿了offer之后发了这么个朋友圈没啥区别。
而且,还连发了三条。
秀offer,offer抵触了不可怕。秀对象秀抵触了才可怕。
假如你朋友圈里有这种人,答应我,删了吧。
总结
- 电脑插上网线,联网后会经过DHCP协议动态请求一个IP,同时取得子网掩码,路由器地址等信息。
- DHCP分为四个阶段,别离是 Discover,Offer, Request和ACK。假如从前连过这个网,机器会记载你上次运用的IP,再次衔接时优先运用本来的那个IP,因而只需求阅历第三第四阶段。
- DHCP是应用层协议,考虑到需求支撑播送功能,底层运用的是UDP协议,而不是TCP协议。
- DHCP分配下来的IP是有或许跟某台手动装备的IP地址重复的。
- DHCP得到IP之后还会发3次无偿ARP布告,在承认没有抵触后开端运用这个IP。
最终给咱们留个问题吧。咱们上面的IP都是从DHCP服务器上请求的,在服务器回来DHCP Offer的时分,能够看到上面写了DHCP服务器的IP。比方192.168.31.1
,这明显是个局域网内的IP,但这能说明,你的DHCP服务器必定在这个局域网里吗?
参考资料
《图解TCPIP》
最终
兄弟们。
依照惯例,我应该在这儿百依百顺的求咱们叫我两声靓仔的。
但我今日不想。
因为越是这样,评论区里叫我diao毛的兄弟就越多。
上海这几天降温了,难怪你们能说出如此冰冷的话。
但是。
只需你们还能给我文章右下角来个点赞和收藏的话。
这口气,我还能忍。