浏览器发送HTTP请求过程与DNS解析

一、 生成HTTP请求消息


  • 1.1 各种各样的URL

    浏览器是一个具备多种客户端功能的综合性客户端软件,会根据URL(Unfiorm Resource Locator,统一资源定位符)的不同,来使用不同的协议来访问对应的服务器。

  • 用HTTP协议访问Web服务器时:
    http://user:passwoard@www.glasscom.com:80/dir/file.html
  • 用FTP协议下载和上传文件时:
    ftp://user:password@ftp.glasscom.com:21/dir/file/html
  • 读取计算机本地文件时:
    file://localhost/c:/path/file.zip
  • 发送电子邮件时:
    mailto:617223700@qq.com
  • 阅读新闻组的文章时:
    news:com.protocols.tcp-ip

  • 1.2 URL解析规则

  • URL示例:
    http://user:passwoard@www.glasscom.com:80/dir/file.html
    user,password,80:分别为用户名,密码,端口号都可省略。
    http:URL开头表示访问数据源的协议。
    //.../:中间表示Web服务器的名称。
    / + 目录名 + / ... + 文件名:表示文件的路径名。
  • http://www.baidu.com/dir/
    表示dir/后面的文件名被省略了,服务器已经事先设置好了省略时访问的默认文件名,这个设置不一定都相同,不过大多是index.html或default.html,所以上面这种情况可能就是访问/dir/index.html。
  • http://www.baidu.com/ or http://www.baidu.com
    表示访问"/"目录也就是根目录(目录层级中最顶层)下的默认文件如index.html或default.html,即/index.html。
  • http://www.baidu.com/this
    首先如果Web服务器上存在this的文件,则将this作为文件名处理,其次如果存在名为this的目录,则将this作为目录名处理。

  • 1.3 生成HTTP请求消息

解析完URL之后,浏览器会使用HTTP协议访问Web服务器。HTTP协议定义了客户端和服务器之间交互的消息内容和步骤。

  • 1.3.1 客户端会向服务器发送请求消息。

      请求消息包含:"对什么" 和 "进行怎样的操作" 两个部分。
    

** "对什么" 部分为URI (Uniform Resource Identifier,统一资源标识符)。**URI内容是一个存放网页数据的文件名或者是一个CGI程序(对Web服务器程序调用其他程序的规则所做的定义就是CGI,而按照CGI规范来工作的程序就称为CGI程序。)的文件名。比如:"/dir/fiel.html","/dir/program.cgi"等,其实URI文件未必在Web服务器上真实存在,可以是Web服务器通过重写规则对虚拟URI进行映射。
"进行怎样的操作"就是方法也叫HTTP谓词。包括读取URI表示的数据(GET),将客户端输入的数据发送给URI表示的程序(POST)等。
GET:获取URI指定信息。如果URI指定的是文件,返回文件内容。如果指定的是CGI程序,则返回该程序输出数据。大概过程是:在请求消息中写上GET方法,然后在URI中写上存放网页数据的文件名"/dir/file.html",当Web服务器收到消息后,会打开/dir/file.html文件读取里面数据,然后将读出的数据存放到响应消息返会给客户端。
POST:从客户端向服务器发送数据。一般用于发送表单中填写的数据等情况。使用POST时,URI会指向Web服务器中运行的一个应用程序的文件名,如:"index.cgi","index.php"等,在请求消息中,除了URI和方法,还要加上传递给应用程序和脚本数据也就是表单内容。Web服务器会把请求信息中的数据发给URI指定应用程序,并从应用程序接收输出的结果放到响应消息返回给客户端。
HEAD:和GET基本相同,不过只返回HTTP的消息头,不返回数据内容。
PUT:替换URI指定服务器上的文件,没有则创建。
...

  • 1.3.2 请求消息构成:

请求消息第一行为** 请求行。格式:
<方法><空格><URI><空格><HTTP版本>
GET www.baidu.com HTTP/1.1
请求消息第二行开始为
消息头**,包括:日期,客户端支持数据类型,数据有效期等等一系列详细细节。

屏幕快照 2017-05-21 下午11.06.30.png

写完消息头后,还需要添加一个空行,然后写上** 消息体**,就是需要发送的数据。GET方法时,不需要在消息体填写任何数据,Web服务器能凭借URI和方法做相应操作。


  • 1.4 响应消息

响应消息的格式以及基本思路和请求消息大致相同,差别只在第一行,第一行为状态码和响应短语,用来表示请求的执行结果成功还是出错。

  • 1.4.1 状态码概要:

1xx : 告知请求的处理进度和情况。
2xx : 成功。
3xx :表示需要进一步操作。
4xx : 客户端错误。
5xx : 服务器错误。
一条请求消息只能写一个URI。如果需要获取多个文件,必须对每个文件单独发送一条请求。比如:一个网页中包含3个图片,那么获取网页加上图片,一个需要向Web服务器发送4条请求。 以下为www.baidu.com的请求数

屏幕快照 2017-05-21 下午11.24.28.png

网页中的文本数据和其中嵌入的图片数据是分别保存在不同文件中的,他们合在一起就组成了一张网页。读取文件的操作是对各个文件分别执行的,而且是相互独立的。比如:①用于获取/file.html文件的请求消息,②将/file.html的内容返回给客户端的响应消息,③用于获取/picture.jpg文件的请求消息,④将/picture.jpg的内容返回给客户端的响应消息。


二、 向DNS服务器查询Web服务器的IP地址

生成HTTP消息后,下一步需要根据域名查询IP地址,委托操作系统发送消息。互联网和局域网都是基于TCP/IP的结构。TCP/IP的网络结构:用集线器连接起来的几台计算机看作一个单位,子网,然后一些小的子网通过路由器连接起来组成一个大的网络。IP地址分为网络号和主机号,网络号对应的是这个子网,主机号对应的是分配个子网中的计算机。有了IP地址,就能将数据以包的形式通过集线器,路由器的转发传送到目标服务器。


  • 2.1 IP地址组成

IP地址是一串32比特的数字,按照8比特(1字节)为一组分为4组,分别用十进制表示再用圆点隔开。除此之外,我们还需要附加信息即子网掩码来表示IP地址内部结构,也就是哪部分是网络号,哪部分是主机号。子网掩码是与IP地址相同长度的32比特数字,左边一半都是1,右边一半都是0,为1的部分表示网络号,为0的部分表示主机号。
(1) 采用与IP地址主体相同格式表示子网掩码的方法
10.11.12.13/255.255.255.0 即 IP地址/子网掩码
10进制转化为比特:
IP地址: 00001010.00001011.00001100.00001101 子网掩码: 11111111.11111111.11111111.00000000 网络号: 00001010.00001011.00001100 即 10.11.12 主机号: 00001101 即 13

(2) 采用网络号比特数表示子网掩码的方法
10.11.12.13/24
(3)表示子网的地址
10.11.12.0/24 主机号部分的比特全部为0,表示不是单独计算机而是代表整个子网。
(4)表示子网内广播的地址
10.11.12.255/24 主机号部分的比特全部为1,表示对整个子网进行广播,就是向子网内所有设备发送包。


三、DNS工作原理

向DNS(Domain Name System,域名服务系统。将服务器名称和IP地址进行关联是DNS最常见用法,但DNS也可以用于关联邮件地址和邮件服务器等其他信息和对应名称的关联)服务器发出查询,并接收服务器返回的响应信息。 通过DNS查询IP地址的操作称为域名解析,所以计算机内部的DNS客户端也称之为解析器。解析器实际上是包含在操作系统里的Socket库中的一段程序,Socket库是用于调用网络功能的程序组件集合,包含很多用于发送和接收数据的程序组件。

  • 3.1 解析器内部原理

解析器既然是Socket库中的程序都是标准组件,所以只要在编写浏览器等应用程序的时候,进行调用就行了。

99E1D683E695E07510DA789115D2B45D.png

解析器会生成要发送给DNS服务器的查询消息,这个过程类似于浏览器生成要发送给Web服务器的HTTP请求消息过程,不过HTTP请求消息是文本,DNS查询消息是二进制数据编写。而发送给DNS服务器这个操作不是解析器完成,是委托给操作系统内部的协议栈(操作系统内部的网络控制软件也叫协议驱动,TCP/IP驱动)完成。类似浏览器,解析器也不具备使用网络收发数据功能。而是通过协议栈进行发送消息操作,再通过网卡将消息发送给DNS服务器。

当DNS服务器收到查询消息后,会根据消息进行查询,如果要访问的Web服务器已经在DNS服务器上注册,那么这条记录肯定能查询到,然后将其IP地址写入响应消息并返回给客户端。接下来,消息经过网络到达客户端,再经过协议栈被传递到解析器,解析器读取消息取出IP地址,返回给应用程序(浏览器)里指定的内存地址。具体如下图:

19C8EEFCDB9936836A6216C0115EE3A0.png

顺便提下,向DNS服务器发送查询消息,也需要知道DNS服务器的IP地址,不过这个IP地址是作为TCP/IP的一个设置选项事先设置好的。可以手动设置也可以自动获取。

B987B1EECB87A78AC4AF4DB5382861B0.png
  • 3.2 DNS服务器工作原理

DNS服务器的基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。查询消息包括以下三种:
(a) 域名:服务器、邮件服务器(邮件地址中@后面的部分)的名称。
(b) Class : 用来代表互联网的IN。
(c) 记录类型:表示域名对应何种类型的记录。例如,当类型为A(Address)时,表示域名对应IP地址;当类型为MX(Mail eXchange)时,表示域名对应邮件服务器。对于不同的记录类型,服务器返回的响应消息也不同。

DNS服务器上会事先保存有前面这3种信息对应的记录数据,然后根据记录查找符合查询请求的内容并对客户端作出响应。比如下表:

| 域名 | Class | 记录类型 | 响应数据
| ------------- |:-------------: | -----: |
| www.lab.glasscom.com | IN | A | 192.0.2.226
| glasscom.com | IN | MX | 10 mail.glasscom.com
| mail.glasscom.com | IN | A | 192.0.2.227
| ...|...|...|...|

上述表格信息是保存在配置文件中的,表格中的一行信息称为一条资源记录。对于邮件地址tone@glasscom.com,@后面就是域名,10代表优先级,当一个邮件地址对应多个邮件服务器时,需要根据优先级判断哪个服务器优先,越小越优先。10后面代表邮件服务器域名,第三行就是域名对应的IP。

总结:DNS服务器会从域名和IP地址的对照表中查找相应记录,并返回IP地址。

  • 3.3 域名的层次结构与DNS服务器接力

DNS中的域名都是用句点来分割,比如:www.lab.glasscom.com,句点划分了不同层次,也就是不同的域。类似于公司的组织结构。越靠右,层级越高。如果按照公司的组织结构来说,大概就是com事业集团glasscom部lab科的www。就是com域的下一层glasscom域再下一层lab域,再下面才是www这个名字。

负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中,以此类推。比如:lab.glasscom.com域的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中。我们可以通过上级DNS服务器查询出下级DNS服务器中的IP地址。

com域被称为顶级域,顶级域上面还有一级域,称为根域。根域没有自己名字,一般省略,如果表示则在最后加个句点,如:www.glasscom.com. 。根域的DNS服务器保管着com等DNS服务器信息。上级DNS服务器保存着所有下级DNS服务器的信息,我们可以从根域开始往下找。另外,根域的DNS服务器信息保存在互联网所有DNS服务器中,分配给根域DNS服务器的IP地址在全世界仅有13个,保存在所有DNS服务器的配置文件中,任意一台都能访问根域DNS服务器。下图为客户端向DNS服务器查询IP地址的过程:

3869C3E17FA142D1B0CDD9E55BFCFE42.png

DNS服务器有缓存功能,查询不存在域名的也会缓存,如果原本的注册信息发生改变,缓存的信息就可能不正确,需要删除缓存。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容