之前对于黑砖头书,一直有种抵触感,看着看着就不想看了,总感觉TM这么厚,什么时候能看完,看着就愁,暑假,硬着头皮啃了《Thinking in Java》,还有《Head First设计模式》,边做笔记,边读,这样还是蛮有成就感的,要不单纯的读,读到后面,忘了前面,这样反而对自己做这件事情产生了怀疑,和身边的几个大牛交流,给予的反馈是,看编程方面这些书,如果不是立刻去实践,忘记很正常的事情,想起了知乎上一个关于读书有什么用的回答?我们忘掉的往往是那些细节,而潜移默化的改变了我们的思考方式。个人认为对于编程的方面的学习就是建立一个知识框架,然后大脑中有了个框架,去实践,根据实践中遇到的问题,去具体的章节进行反馈,如果是要搞Android,要学Java上来就看《Thinking in Java》,势必是一很痛苦的,如果先找一本基础的书籍把体系建立起来,然后去实践开发,遇到具体的问题去书中反馈,效果就会很好。回到正题。装逼采用了春上春树的命题方式,想着来将最近读的《计算机网络--自顶向下方法》结合现实中我们网络请求的整个过程做一个梳理。
上面都是废话。
接下来我们从我们在浏览器中输入一个URL,到我们得到一个页面开始讨论,内容中如有错误,欢迎各位指正。以百度为例。从如何接入网络到数据返回给我们这个过程。
主机如何上网
首先我们要考虑的一个问题就是,我们的主机如何连入到网络之中,也就是为什么当我们将电脑连接网线之后,我们就可以上网了,这个过程发生了什么?
首先根据上图,我们来一个总览,当我们的电脑通过网线接入的时候,是如何获取到IP的来上网的,当我们用手机连接wifi又是如何获取IP来上网的。
拨号连接
对于拨号连接,当我们电脑连接网线,然后开始进行拨号连接的时候,我们的电脑此时在拨号未成功前已经进入了一个网段,但是不能上网的原因就是我们没有IP,即使我们的请求可以出去,它也回不来,没有源IP地址,返回的数据是无法找到我们的,然后这个时候,如果要上网,获取IP是迫在眉睫的事情了。当我们在我们家中上网的时候是如何获取的呢?
先看下我们小区网络设施的架构是如何?
我们的每一个小区中有一个路由器,路由器是具有IP和Mac地址的,然后我们的小区中还有一个交换机,交换机是没有IP和MAC地址的,其作用是根据我们来的数据包进行一个针对mac地址的转发,其中存放的是MAC地址和对应的转发接口,这个时候可能会存在的一个疑问是为什么不直接用路由器进行转发而还要用交换机呢?
路由器和交换器的不同
路由器是可以替代交换机的,但是交换机是不可以替代路由器的,路由器相当于是网桥,而交换机则相当于一个加强的集线器。
路由器是根据网络IP地址进行转发,属于网络层。而交换机是根据MAC地址进转发,属于链路层。
路由器可以自行拨号,而交换机则不可以。通过路由器,我们将路由器的wan口连接到网络,lan口连接我们的电脑,进入我们的路由器配置界面,此时,路由器会自动的检测我们的上网方式,然后根据我们输入的相应的参数进行一个连接,这个时候,我们上网就不需要自己配置了,直接就可以上网了。
路由还可以提供防火墙的功能。而交换机不可以。
交换器具有自学习功能,而路由不具备,从交换器流过的数据报,其mac地址会被记录下来。
为什么要用交换机
交换器常用来组建一个局域网,然后通过路由器将其连接到Internet上去,说了其不同,但是为什么要用交换机呢?它能干的事情,路由器都能干,而且路由器还有其很多无法实现的功能。原因就是其处理快速,价格便宜,其根据帧中的MAC地址识别转发接口的算法简单,而如果将这些全部让路由器来承担,这样就要精确的保存,该小区中所有用户的IP地址,并且每一个IP地址,我们都需要进行一个比对,确定从哪个接口中出来,因为不在是第一个区域的ip表示,无法通过前缀辨别了,所以需要对每一个ip都预留一个唯一的端口,这样当我们的小区中新添加了用户,那么就需要单独有一根线从路由器中出来连接向它,这样一个小区就需要很多台路由器来做这个操作,但是当我们使用交换机就可有效的解决这个问题,我们将每所有的用户通过交换机进行连接,交换机的另一端和路由器进行连接,这样路由器就可以通过前缀匹配将数据报发给一个交换器,然后交换器负责分发,这样即使用户增加,其只需要连接到交换器,而不需要到路由器拉根线过来。这样可以减少了路由器数量上消耗,降低了成本,提升了速度。
开始获取IP
当我们接入到了网络中之后,我们的操作系统生成一个DHCP(Dynamic Host Configuration)报文,发向DHCP的服务器的67端口,但是我们怎么知道DHCP服务器地址呢?我们是不知道的,因此采用方式是在我们本地的68端口,生成一个UDP包,其目的IP字段填写的IP地址是255.255.255.255,然后向全子网进行广播通过发送以太网帧,该帧的目的MAC地址是FF:FF:FF:FF:FF:FF,此时局域网中的主机收到后,是不会进行处理的,然后传到路由器,路由器接收到之后,检测其包含DHCP请求,然后交给上层处理,此时发送给DHCP服务器,这个时候,服务器接收到DHCP报文,会返回一个回应报文,其中包含分配给它的IP地址,DNS服务器地址,默认网关路由器IP地址,也就是第一跳路由器的IP地址,这个时候,开始返回报文,报文如何找到是那一台主机发出了这个报文呢?没有IP地址,但是它有默认网段路由器地址,也就是第一跳路由的地址,得到这个地址后,填充发送过来的源的MAC地址,然后返回,这个时候,到达路由器之后,发送到交换器,因为交换器具有自学习功能,也就是谁从它走过,它都是会记录下来的,而且会记录下从哪个接口进入,什么mac地址从哪一个接口进入,然后什么时间进入的,通过这个表,我们就可以将信息转发给我们的目的广播主机。此时我们就拿到IP和DNS服务器的地址,和我们默认网关的地址。
有了IP地址,我们接下来就可以访问网络了。但是还有一个问题是当我们拿到了网关的IP,但是却不知道网关的mac地址,而我们和网关处于同一个局域网下,因此我们需要获取到其mac地址,才可以在链路层级上和其进行通信,因此,这个时候出现了ARP,我们将要找的IP地址广播出去,这个时候局域网上的各个主机将会根据其中的IP地址进行一个回应,如果是自己的将会返回一个mac地址回去,我们会将其存放在一个ARP缓冲区中,然后下次如果需要就不需要再去寻找,直接通过mac地址就可以找到。
无线连接
WIFI
我们通过我们的wifi进行连接上网的时候,和该过程不同,我们的发送wifi信号的AP本身是具有IP地址的,在其下面的连接的便携设备的IP是采用NAT协议(Network Address Translation)来给我们本地的便携设备生成一个ip,然后通过这个ip进行标记每个接入设备。讲到NAT,可能会想到一个问题,为什么有mac地址,而要用IP地址呢?原因是MAC地址的分配是不规则的,无法根据一个mac地址来确定其存在的位置,所以找起来是非常费力的。但是如果在一个wifi下的话,在查询上这应该不是一个问题了,为什么还用用ip,通过mac地址,再去广播,确认接收,不也是可以的吗,但是当我们最初没有分配IP的时候,怎么通过IP找呢?只能通过MAC地址去找。
如何接入?
首先,每个AP设备会会周期性的发送一些信表帧(SSID,MAC地址),然后我们的便携设备会扫描所有的信道获取该区域内的所有信标,也就是我们手机开机wifi的时候,我们看到的名字是ssid,mac地址,我们看不到的,然后我们与之建立关联,即可发送数据。我们请求的数据报,会被路由进行伪造,然后通过路由器的IP发送出去,回来的时候进行解包,分到每一个设备上。
WLAN
我们使用的移动的WLAN虽然都是通过我们的wifi可以搜索的到,但是其实现是不同的,对于WLAN,其被我们找到的过程和我们连接wifi是一样的,但是其并不通过NAT协议,而是我们借助于它作为一跳路由,向DHCP服务器获取一个IP,这个过程和我们通过拨号接入大致相同,唯独不同之处在于我们和第一跳路由的连接方式,一个是有线,一个是无线的,无线的如何维持这个连接和避免信道冲突的,将在后面具体细说。
下一篇文章写如何根据URL从DNS获取IP地址
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。