参考资料:网络是怎样连接的 【日】户根勤 /著 周自恒 /译
我自己有点网络基础就写的比较简略了
网址指的就是URL(Uniform Resource Locator,统一资源定位符号),也就是以http://开头的,除了http:以外还有"ftp:" ,“file:”,"mailto"等,表示的是浏览器应该使用的访问方法。
为什么要有各种各样的URL?
虽然我们通常都是使用浏览器访问Web服务器,但是浏览器还能用来在FTP服务器上下载和上传文件,也具备电子邮件客户端的功能。
URL包含什么?
根据需求来,根据访问目标的不同,URL 的写法也会不同例如在访问 Web 服务器和 FTP 服务器时, URL 中
会包含服务器的域名 E 和要访问的文件的路径名等, 而发邮件的 URL 则包含收件人的邮件地址。 此外, 根据需要, URL 中还会包含用户名、 密码、服务器端口号等信息。、
1.浏览器要先解析URL
先对URL解析,才能生成发送给Web服务器的请求消息
**2.使用HTTP协议访问Web服务器的基本思路 **
HTTP协议定义了客户端和服务器之间交互的消息内容和步骤。
其实请求信息这里没说明白。。。。
DNS:域名系统
生成HTTP消息之后,接下来需要委托操作系统将消息发送给Web服务器,在进行这一操作的时候,还要查询网址中服务器域名对应的IP地址。(这里要注意的是在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是IP),在生成HTTP消息之后,下一个步骤就是根据域名查询IP
1.IP地址基本知识
互联网和公司内部的局域网都是基于TCP/IP的思路来设计的,所以我们先了解TCP/IP的基本思路,TCP/IP的结构如图:
这个结构就是由一些小的子网,通过路由器连接起来组成一个大的网络。这里的子网可以理解成用集线器连接起来的几台计算机,我们将它看成一个单元,称为子网,子网通过网络连接就形成了一个网络。
路由器:一种对包进行转发的设备
集线器:一种对包进行转发的设备,分为中继式集线器和交换式集线器两种。
当计算机数量较少的时候,可以用一台集线器连接;当计算机数量较多的时候,一台集线器可能无法连接这么多计算机,可以增加集线器数量并将集线器相互连接起来,这时,凡是通过集线器连接起来的所有设备都属于同一个子网
一些家用路由器中已经内置了集线器功能,因此大家可以理解为这种路由器内部同时包含路由器和集线器两种设备,它们在里面已经连接起来了。
通过IP地址我们就可以判断出访问对象服务器的位置,从而将消息发送到服务器。发送者发出的消息首先经过子网中的集线器,转发到距离发送者最近的路由器上。接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器。
IP地址的表示方法不想详细说了,如下图:
2.域名和IP地址并用的理由
书里面写了一大段,最重要的理由就是更好记,访问百度会使用www.baidu.com这个能记住,但是百度的ip地址我反正记不住
3.Socket 库提供查询 IP 地址的功能
使用过Socket的应该很熟悉这个功能
查询 IP 地址的方法非常简单, 只要询问最近的 DNS 服务器,服务器就会给一个回应。
向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并接收服务器返回的响应消息。我们的计算机上一定有相应的 DNS 客户端, 而相当于 DNS 客户端的部分称为 DNS 解析器, 或者简称解析器。 通过 DNS 查询 IP 地址的操作称为域名解析, 因此负责执行解析( resolution) 这一操作的就叫解析器( resolver)
解析器实际上是一段程序, 它包含在操作系统的 Socket 库中。
4.通过解析器其向DNS服务器发出查询
解析器只要从应用程序中进行调用就可以了,就是在编写浏览器等应用程序的时候,只要写上解析器的程序名称“gethostbyname”以及Web服务器的域名就可以了。对于C语言来说gethostbyname其实就是个函数。
调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息。响应消息中包含查询到的 IP 地址, 解析器会取出 IP地址, 并将其写入浏览器指定的内存地址中。接下来,浏览器在向 Web 服务器发送消息时, 只要从该内存地址取出 IP 地址, 并将它与 HTTP 请求消息一起交给操作系统就可以了。
1.DNS域名服务器概述
DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。
来自客户端的查询消息有以下三种:
域名服务器也不可能只有一个,一般都是将一个域作为一个整体存放在一个DNS服务器中,当然也可以将多个域存放在同一服务器中,但是同一个域不能拆分。每一个域下面可以有子域,在com的上面其实还有根域,不像com一样有自己的名字。
这个可以去看书,其实很容易理解
2.DNS域名服务器获取ip地址
互联网中有数万台 DNS 服务器, 肯定不能一台一台挨个去找。 我们可以采用下面的办法。 首先, 将负责管理下级域的 DNS 服务器的 IP 地址注册到它们的上级 DNS 服务器中, 然后上级 DNS 服务器的 IP 地址再注册到更上一级的 DNS 服务器中
如图 1.16 所示, 客户端首先会访问最近的一台 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址), 假设我们要查询 www.lab.glasscom.com 这台 Web 服务器的相关信息(图 1.16 ①)。 由于最近的 DNS 服务器中没有存放 www.lab.glasscom.com 这一域名对应的信息, 所以我们需要从顶层开始向下查找。 最近的 DNS 服务器中保存了根域 DNS 服务器的信息, 因此它会将来自客户端的查询消息转发给根域 DNS 服务器(图 1.16 ②)。 根域服务器中也没有 www.lab.glasscom.com 这个域名, 但根据域名结构可以判断这个域名属于 com 域, 因此根域 DNS 服务器会返回它所管理的 com 域中的DNS 服务器的 IP 地址, 意思是“虽然我不知道你要查的那个域名的地址但你可以去 com 域问问看”。 接下来, 最近的 DNS 服务器又会向 com 域的DNS 服务器发送查询消息(图 1.16 ③)。 com 域中也没有 www.lab.glasscom.com这个域名的信息, 和刚才一样, com 域服务器会返回它下面的 glasscom.com域的 DNS 服务器的 IP 地址。 以此类推, 只要重复前面的步骤, 就可以顺藤摸瓜找到目标 DNS 服务器(图 1.16 ⑤), 只要向目标 DNS 服务器发送查询消息,就能够得到我们需要的答案, 也就是 www.lab.glasscom.com 的 IP 地址了。
通过缓存加快DNS服务器的响应,我理解的就是费劲千辛万苦查一次,就不用在查一次了,要查询的消息已经在缓存中了,可以直接响应了
知道ip地址之后就可以委托操作系统内部的协议栈向这个目标IP地址,也就是我们要访问的Web服务器发送消息了。要发送给web服务器的http消息是一种数字消息,委托协议栈来完成,这里应该说的是TCP/UDP,和向DNS服务器查询IP地址的操作一样,也使用的是Socket库
收发数据的操作过程应该分为四步:
1.创建
2.连接
3.收发
4.断开
当数据全部发送完毕之后,连接的管道将会被断开,管道的连接是由客户端发起,断开可以由任意一端发起
不想详细写了,学过套接字或者网络编程都应该有了解,后面有时间再深入的写一下,太多要学的了。。。。