前言
放暑假了,我好久没有写博客了,主要是因为整个六月都很忙,忙着去完成编程实训,忙着去期末复习,还有个原因就是自己变懒了,我发现坚持写文章可以使自己勤奋起来,于是我开始了新的旅程……本来想着去深入学习一下计算机网络这门课程,可是我了解到这门课程需要花很多的时间,而我现在的精力主要放在算法与数据结构上面,所以就选择了《网络是怎么连接的》这本计网的入门科普书进行学习
Day01:
整书目录:
第一章:浏览器生成消息
1.网址中的”www”只是Web服务器上的一种命名 ,是
World Wide Web
的缩写,它不是一个协议的名字,而是
Web的提出者最早开发的浏览器兼HTML编辑器的名字
。
2.互联网中常见的几种URL(统一资源定位系统(uniform resource locator;URL)是
因特网
的
万维网服务
程序上用于指定信息位置的表示方法。它最初是由
蒂姆·伯纳斯·李
发明用来作为
万维网
的地址。现在它已经被
万维网联盟
编制为互联网标准
RFC
1738。):
浏览器要做的第一步工作就是对URL进行解析:
在这里介绍一下
http 协议
(资料来自知乎:
详细链接
)
HTTP
协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
HTTP
是一种
无状态
(stateless) 协议,
HTTP
协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
HTTP协议定义了客户端和服务器之间交互的消息内容和步骤
,其基本思路非常简单。首先,客户端会向服务器发送请求消息 。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相当于“对什么”的部分称为URI 。一般来说,URI的内容是一个存放网页数据的文件名或者是一个CGI程序[插图]的文件名,例如“/dir1/file1.html”“/dir1/program1.cgi”等 。不过,URI不仅限于此,也可以直接使用“http:”开头的URL 来作为URI。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为URI。
相当于接下来“进行怎样的操作”的部分称为方法,常见的方法如下:
HTTP请求的所发送的数据格式
写好方法之后,加一个空格,然后写URI。URI部分的格式 一般是文件和程序的路径名。
第二行开始为消息头。尽管通过第一行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来存放这些信息。
消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。
当我们将上述请求消息发送出去之后,Web服务器会返回响应消息。
响应消息的格式请求消息是基本相同的 ,差别只在第一行上。在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。状态码和响应短语表示的内容一致,但它们的用途不同。状态码是一个数字,它主要用来向程序告知执行的结果 ;相对地,响应短语则是一段文字,用来向人们告知执行的结果。
关于状态码,我发现了一篇很好的文章:
HTTP状态码详解
Day02
向DNS服务器查询Web服务器的IP地址
生成HTTP消息之后,我们要委托操作系统将消息发送到网络中,
在委托操作系统发送消息时,我们查询并提供网址中服务器域名对应的IP地址。
互联网和公司内部的局域网都是基于
TCP/IP的思路
来设计的:
号”对应的号码称为网络号,“室”对应的号码称为主机号,这个地址的整体称为IP地址,际的IP地址是一串32比特的数字,按照8比特(1字节)为一组分成4组,分别用十进制表示然后再用圆点隔开。
主机号部分的比特全部为0或者全部为1时代表两种特殊的含义,
主机号部分全部为0代表整个子网而不是子网中的某台设备,主机号部分全部为1代表向子网上所有设备发送包,即广播。
Socket库提供查询IP地址的功能
查询IP地址的方法非常简单,只要询问最近的DNS服务器。向DNS服务器发出查询,也就是向DNS服务器发送查询消息,并接收服务器返回的响应消息。换句话说,对于DNS服务器,我们的计算机上一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器,或者简称解析器。通过DNS查询IP地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。解析器实际上是一段程序,它包含在操作系统的Socket库中。
接下来,浏览器在向Web服务器发送消息时,只要从该内存地址取出IP地址,并将它与HTTP请求消息一起交给操作系统就可以了。
Day03
DNS服务器的工作
DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。
除了A和MX这两个记录类型,实际上还有很多其他的类型。例如根据IP地址反查域名的PTR类型,查询域名相关别名的CNAME类型,查询DNS服务器IP地址的NS类型,以及查询域名属性信息的SOA类型等。
信息分布保存在多台DNS服务器中,按照域名以分层次的结构来保存。
DNS中的域名都是用句点来分隔的,比如www.lab.glasscom.com,这里的句点代表了不同层次之间的界限。比如www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部lab科的www”这样。其中,相当于一个层级的部分称为域。因此,com域的下一层是glasscom域,再下一层是lab域,再下面才是www这个名字。
比如www.lab.glasscom.com这个域名如果按照公司里的组织结构来说,大概就是“com事业集团glasscom部lab科的www”这样。其中,相当于一个层级的部分称为域。因此,com域的下一层是glasscom域,再下一层是lab域,再下面才是www这个名字。
根域不像com、jp那样有自己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应该像www.lab.glasscom.com.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域。不过,一般都不写最后那个句点,因此根域的存在往往被忽略,但根域毕竟是真实存在的,根域的DNS服务器中保管着com、jp等的DNS服务器的信息。
客户端首先会访问最近的一台DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址),然后进行后续访问。
有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存[插图]功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。并且,当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。
委托协议栈发送消息
知道了IP地址之后,就可以委托操作系统内部的协议栈向这个目标IP地址,也就是我们要访问的Web服务器发送消息了。 要发送给Web服务器的HTTP消息是一种数字信息(digital data),因此也可以说是委托协议栈来发送数字信息。
向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件。
收发数据的操作分为四个阶段:
(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)