第 1 部分 生成 HTTP 请求消息

2.1. 向 DNS 服务器查询 Web 服务器的 IP 地址

2.1.1 IP 地址的基本知识

生成 HTTP 消息之后,接下来我们需要委托操作系统将消息发送给 Web 服务器。尽管浏览器能够解析网址并生成 HTTP 消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现。在进行这一操作时,我们还有一个工作需要完成,那就是查询网址中服务器域名对应的 IP 地址。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的 IP 地址。因此,在生成 HTTP 消息之后,下一个步骤就是根据域名查询 IP 地址。在讲解这一操作之前,让我们先来简单了解一下 IP 地址。

互联网和公司内部的局域网都是基于 TCP/IP 的思路来设计的,所以我们先来了解 TCP/IP 的基本思路。 TCP/IP 的结构如图1.8 所示,就是由一些小的子网,通过路由器连接起来组成一个大的网络。这里的子网可以理解为用集线器连接起来的几台计算机,我们将它看作一个单位,称为子网。将子网通过路由器连接起来,就形成了一个网络。

在网络中,所有的设备都会被分配一个地址。这个地址就相当于现实中某条路上的“XX 号 XX 室”。其中“号”对应的号码是分配给整个子网的,而“室”对应的号码是分配给子网中的计算机的,这就是网络中的地址。“号”对应的号码称为网络号,“室”对应的号码称为主机号,这个地址的整体称为 IP 地址。通过 IP 地址我们可以判断出访问对象服务器的位置,从而将消息发送到服务器。消息传送的具体过程在后面的章节有详细讲解。发送者发出的消息首先经过子网中的集线器,转发到距离发送者最近的路由器上(图1.8(1))。接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息发送到下一个路由器,即消息再次经过子网内的集线器被转发到下一个路由器(图1.8(2))。前面的过程不断重复,最终消息就被传送到了目的地。

前面这些就是 TCP/IP 中 IP 地址的基本思路。了解了这些知识之后,让我们再来看一下实际的 IP 地址。如图 1.9 所示,实际的 IP 地址是一串 32 比特的数字,按照 8 比特(1字节)为一组分成 4 组,分别用十进制表示然后在用圆点隔开。这就是我们平常经常见到的 IP 地址格式,但仅凭这一串数字我们无法区分哪部分是网络号,哪部分是主机号。在 IP 地址的规则中,网络号和主机号连起来总共是 32 比特,但这两部分的具体结构是不固定的。在组建网路时,用户可以自行决定它们之间的分配关系,因此,我们还需要另外的附加信息来表示 IP 地址的内部结构。

这一附加信息称为子网掩码。子网掩码的格式如图1.10(2)所示,是一串与 IP 地址长度相同的 32 比特数字,其左边一半都是1,右边一半都是 0 。 其中,子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机号。将子网掩码按照和 IP 地址一样的方式以每 8 比特为单位用圆点分组后写在 IP 地址的右侧,这就是图1.9(b)的方法。这种写法太长,我们也可以把 1 的部分的比特数用十进制表示并写在 IP 地址的右侧,如图1.9(c)所示。这两种方式只是写法上的区别,含义是完全一样的。

顺带一提,主机号部分的比特全部为 0 或者全部为 1 时代表两种特殊的含义。主机号部分全部为 0 代表整个子网而不是子网中的某台设备(图1.9(d))。此外,主机号部分全部为 1 代表向子网上所有设备发送包,即广播(图1.9(e))。

2.1.2. 域名和 IP 地址并用的理由

TCP/IP 网络是通过 IP 地址来确定通信对象的,因此不知道 IP 地址就无法将消息发送给对方,这和我们打电话的时候必须要知道对方的电话号码是一个道理。因此,在委托操作系统发送消息时,必须要先查询好对方的 IP 地址。

可能你会问“既然如此,那么在网址中不写服务器的名字,直接写 IP 地址不就好了吗?”实际上,如果用 IP 地址来代替服务器名称也是能够正常工作的。然而,就想你很难记住电话号码一样,要记住一串由数字组成的 IP 地址也非常困难。因此,相比 IP 地址来说,网址中还是使用服务器名称比较好。

那么又有人问了:“既然如此,那干脆不要用 IP 地址,而是用名称来确定通信对象不就好了吗?互联网中使用的是最新的网络技术,和电话那种老古董可不一样,这样的功能应该还是做得到吧?”这样的想法其实并不奇怪。

不过从运行效率上来看,这并不能算是一个好主意。互联网中存在无数的路由器,它们之间相互配合,根据 IP 地址来判断应该把数据传送到什么地方。那么如果我们不用 IP 地址而是改用名称会怎么样呢?IP 地址的长度为 32 比特,也就是 4 字节,相对地,域名最短也要几十个字节,最长甚至可以达到 255 字节。换句话说,使用 IP 地址只需要处理 4 字节的数字,而域名则需要处理几十个到 255 个字节的字符,这增加了路由器的负担,传送数据也会花费更长的时间。可能有人会说:“那使用高性能路由器不就能解决这个问题了吗?”然而,路由器的速度是有极限的,而互联网内部流动的数据量已然让路由器疲于应付了,因此我们不应该再采用效率更低的设计。

随着技术的发展,路由器的性能也会不断提升,但与此同时,数据量也在以更快的速度增长,在可预见的未来,这样的趋势应该不会发生变化。出于这样的原因,使用名称本身确定通信对象并不是一个聪明的设计。

于是,现在我们使用的方案是让人使用名称,让路由器使用 IP 地址。为了填补两者之间的障碍,需要一个机制能够通过名称来查询 IP 地址,或者通过 IP 地址来查询名称,这样就能够在人和机器双方都不做出牺牲的前提下完美地解决问题。这个机制就是 DNS 。

2.1.3. Socket 库提供查询 IP 地址的功能

查询 IP 地址的方法非常简单,只要询问最近的 DNS 服务器 “www.lab.glasscom.com 的 IP 地址是什么” 就可以了,DNS 服务器会回答说“该服务器的 IP 地址为 xxx.xxx.xxx.xxx”。这一步非常简单,很多读者也都很熟悉,那么浏览器是如何向 DNS 服务器发出查询的呢?让我们把向 Web 服务器发送请求消息的事情放一放,先来探索一下 DNS。

向 DNS 服务器发出查询,也就是向 DNS 服务器发送查询消息,并接收服务器返回的响应消息。换句话说,对于 DNS 服务器,我们的计算机上一定有相应的 DNS 客户端,而相对于 DNS 客户端的部分称为 DNS 解析器,或者简称解析器。通过 DNS 查询 IP 地址的操作称为域名解析,因此负责执行解析(resolution)这一操作的就叫解析器(resolver)了。

解析器实际上是一段程序,它包含在操作系统的 Socket 库中,在介绍解析器之前,我们先来简单了解一下 Socket 库。首先,库到底是什么东西呢?库就是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件。库有很多好处。首先,使用现成的组件搭建应用程序可以节省编程的工作量;其次,多个程序使用相同的组件可以实现程序的标准化。除此之外还有很多其他的好处,因此使用库进行软件开发的思路已经非常普及,库的种类和数量也非常之多。Socket 库也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能,而解析器就是这个库中的其中一种程序组件。

Socket 库中包含很多用于发送和接收数据的程序组件。Socket 库是用于调用网络功能的程序组件的集合。

2.1.4. 通过解析器向 DNS 服务器发出查询

解析器的用法非常简单。Socket 库中的程序都是标准组件,只要从应用程序中进行调用就可以了。具体来说,在编写浏览器等应用程序的时候,只要像图1.11 这样写上解析器的程序名称“gethostbyname” 以及 Web 服务器的域名 “www.lab.glasscom.com” 就可以了,这样就完成了对解析器的调用。

调用解析器后,解析器会向 DNS 服务器发送查询消息,然后 DNS 服务器会返回响应消息。响应消息中包含查询到的 IP 地址,解析器会取出 IP 地址,并将其写入浏览器指定的内存地址中。只要运行图1.11中的这一行程序,就可以完成前面所有这些工作,我们也就完成了 IP 地址的查询。接下来,浏览器在向 Web 服务器发送消息时,只要从该内存地址取出 IP 地址,并将它与 HTTP 请求消息一起交给操作系统就可以了。

网络是怎样连接的(2)相关推荐

  1. Linux 开机网络无法自动连接配置、网络开机自动连接

    第一步:查看开机后网络是否正常连接? 1.图形界面开机后直接看右上角的网络是否连接正常(如图一).               图一(表示未正常连接↑↑↑↑↑↑↑↑↑) 2.如果是命令页面的,可以使用 ...

  2. 网络摄像机ip修改工具_网络监控怎么连接网络

    网络摄像机是现在市场上比较受欢迎的一种安防产品.现在向大家介绍一下网络监控怎么连接网络 工具原料摄像头 方法/步骤分步阅读 1.连接 网络摄像机是用网络线连接到PC机或者路由器上. 2.安装网络视频软 ...

  3. 王者荣耀服务器响应超时,“团战”打游戏,为什么你的网络信号总是连接超时?...

    原标题:"团战"打游戏,为什么你的网络信号总是连接超时? 在给大家提供帮助之前,我们要先了解一下信号格的作用.要明确一点的是--信号格不一定代表信号强度. 如果在人多的地方使用支持 ...

  4. 网络情况不稳定 无法连接服务器,提示网络正常无法连接服务器

    提示网络正常无法连接服务器 内容精选 换一换 Agent无法正常启动,Linux系统提示"SMS.0201 Failed to start sms agent! Please check t ...

  5. 计算机安全性无效无法连接到网络,图文研习windows10系统连接网络提示无法连接到此网络错误的方法?...

    图文研习windows10系统连接网络提示无法连接到此网络错误的方法? 近期有windows10系统网友到本站咨询说碰到这样一个问题,就是要连接网络的时候,提示无法连接到此网络错误,导致无法连接到in ...

  6. suse 启动oracle11g,SuSe10下Oracle11g文件系统模式安装及配置、网络配置与连接

    SuSe10下Oracle11g文件系统模式安装及配置.网络配置与连接 概述 本课程主要讲解oracle数据库软件的安装及配置,以及数据库的创建过程和网络配置与连接等:同时讲解一些数据库安装过程中的常 ...

  7. 浏览器向服务器发送的消息称为,网络是怎样连接之浏览器的探索之旅读书笔记(一)...

    照例是写在前面的话,今天在这里想和自己说一些话,希望未来的自己能够记住,就像我在简书的签名里写下的,"希望自己能记得当下写下那段文字的初心!",学习其实是一件非常严肃的事情,它容不 ...

  8. 蝙蝠未能连接到服务器是什么原因,打开蝙蝠侠提示网络异常或者连接不上

    打开蝙蝠侠提示网络异常或者连接不上,相信大家在玩蝙蝠侠的过程中,经常会遇到这样的问题,下面ourplay小编就简单为大家介绍几种常见的解决方案. 蝙蝠侠游戏简介 <蝙蝠侠:The Telltal ...

  9. 《网络是这样连接的》读书笔记2

    <网络是这样连接的>读书笔记2 文章目录 <网络是这样连接的>读书笔记2 6. 从网线到网络设备--探索集线器.交换机和路由器 6.1信号在网线和集线器中传输 发包 啥是防止信 ...

  10. win7网络感叹号dns服务器未响应,笔记本win7系统下无线网络显示已连接却不能上网有感叹号如何解决...

    在笔记本中通常都内置有无线网卡,可以让用户们连接无线网络来使用,但是最近有不少笔记本win7系统用户到本站反馈说无线网络显示已连接,却不能上网,而且无线网络显示有感叹号,该怎么办呢,本教程就给大家讲解 ...

最新文章

  1. R 调用 python
  2. 更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
  3. 【数据库学习笔记】——操作sqlite(增删改查)以及cursor的方法介绍
  4. cmd运行python脚本处理其他文件_如何在cmd命令行里运行python脚本
  5. 【转】Unity3D 关于贝赛尔曲线,平滑曲线,平滑路径,动态曲线
  6. android给图片加边框,Android学习笔记进阶19之给图片加边框
  7. checkbox取值 php_php获取checkbox复选框的内容
  8. Codeforces Round #FF(255) DIV2
  9. win10去掉文件夹前面的复选框
  10. office密码解锁工具
  11. 模式识别学习笔记——1(线性分类器)
  12. 累次积分怎么计算_【高等数学】二重积分化累次积分方法
  13. 自动目录中的页码格式-1-变为为1
  14. docker部署eureka时无法启动容器(问题解决)
  15. 微信语音技术原理_微信语音电话是如何实现的?
  16. 苹果手机计算机软件不见了怎么办,苹果通讯录怎么不见了?苹果通讯录没了怎么办...
  17. 每天一个CSS小特效,文字闪烁——【钢铁侠:爱你三千遍】
  18. (五)JMeter 断言
  19. 相当不错的在线用户故事地图绘制工具
  20. DBLP实验数据集处理

热门文章

  1. java false 0_Java中false指的是1还是0
  2. Ajax+Css表格(转载)
  3. 完全竞争市场的含义和特征
  4. 微信小程序源代码_模仿今日头条APP
  5. 三档六脚开关接线图详细剖析
  6. Firefox浏览器驱动GeckoDriver安装方法
  7. 炒币机器人和区块链与数字货币有什么区别
  8. JAVA的四类八种基本数据类型
  9. 高光谱图像分类python代码
  10. Self-Attention 及Multi-Head Attention