第1章 浏览器生成消息

一. 生成HTTP请求消息
1. 浏览器解析URL

URL的“http:”、“ftp:”、“file:”、“mailto:”这部分文字表示浏览器应当使用的访问方法(协议类型)

image-20210220104550995

2. URL省略文件名的情况

(a) http://www.lab.glasscom.com/dir/

这个例子可以这样理解,以“/”结尾代表/dir/后面本来应该有的文件名被省略了。服务器会事先设置好文件名省略时要访问的默认文件名,大多数情况下是index.html或者default.htm之类的文件名。

(b) http://www.lab.glasscom.com/

这个例子表示访问一个名叫“/”(目录层级最顶层的目录,本身没有名字,出于方便的考虑把它叫作根目录,并用"/"表示它)的目录,由于省略了文件名所以会访问事先设置的默认文件。

© http://www.lab.glasscom.com

没有路径名时,就代表访问根目录下事先设置的默认文件。

(d) http://www.lab.glasscom.com/whatisthis

如果服务器上存在名为whatisthis的文件名,则将whatisthis作为文件名来处理;如果存在名为whatisthis的目录,则将whatisthis作为目录名来处理。(不会同时存在两个名字相同的文件或目录)

3. HTTP的基本思路

image-20210224100619281

基本思路:客户端向服务器发送请求消息,请求消息的内容是“对什么”和“进行怎样的操作”两个部分。相当于”对什么“的部分称为URI,相当于“进行怎样的操作”的部分称为方法(如get、post、head等)(一般是使用get和post方法,其他方法很少使用)。

image-20210220150427803

4. 生成HTTP请求消息

image-20210220152430404

http中主要的头字段

image-20210220153008970

image-20210220153101716

image-20210220153156083

5. 发送请求后会收到响应

image-20210220154620802

由于每条请求消息中只能写一个URI,所以每次只能获取1个文件,如果需要获取多个文件,必须对每个文件单独发送1条请求。

二. 向DNS服务器查询Web服务器的IP地址
1. IP地址与子网掩码的基本知识

通过一个或多个集线器连接起来的若干台计算机组成一个子网,路由器(很多家用路由器中已经内置了集线器功能)把不同的子网连接起来就形成了网络。在网络中所有的设备都会被分配一个唯一的IP地址,但现实中其实存在因为疏漏两台设备被分配了相同的IP地址的情况,但这种情况下网络会发生故障无法正常工作。

实际的IP地址是一串32比特(bit,即位,最小的信息量单位)的数字,按照8比特(1字节)为一组分成4组,分别用十进制标识,然后再用圆点隔开。IP地址包含了网络号和主机号2个信息,但仅凭这串数字还无法区分网络号与主机号,所以需要结合子网掩码使用。

子网掩码也是一串与IP地址长度相同的32比特数字,左边部分都是1,右边部分都是0。其中1的部分表示网络号,0的部分表示主机号。子网的主机数 = 2的主机位数次方 - 2,减2是因为***主机号全为0时代表整个子网而不是子网中的某台设备,全为1时代表向子网上所有设备发送包(即广播)***。

通过计算机的子网掩码判断两台计算机是否属于同一网段的方法是:将十进制的IP地址和子网掩码转换为二进制的形式,然后进行二进制逻辑与计算,如果得出的结果是相同的,那么这两台计算机就属于同一网段,同一网段的的主机可以在没有路由器的情况下相互通信,不同网段的主机则要通过路由器通信。

IP地址的结构:

image-20210224103530160

IP地址与子网掩码的表示方法:

image-20210222151052482

©中的24表示网络号的比特数量为24(有24个1)

2. Socket库提供查询IP地址的功能(DNS解析器)

Socket库是用于调用网络功能的程序组件集合,互联网中所使用的大多数功能都是基于Socket库来开发的。DNS解析器(DNS客户端部分,负责域名解析,委托协议栈向DNS服务器查询IP地址)就是这个库中的其中一种程序组件。

PS:向DNS服务器发送消息时,也需要知道DNS服务器的IP地址,只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的。

应用程序查询IP地址的流程:

image-20210223155914767

三. 全世界DNS服务器的大接力
1. 域名的层次结构与DNS服务器的工作方式

DNS服务器除了可以查询IP地址,还可以根据IP地址反查域名,查询域名相关的别名,查询DNS服务器的IP地址,以及查询域名属性信息等。

在域名中,越靠右的位置表示其层级越高。常见的“.com”、“.cn”、“.org”、“.net”等是顶级域名(但这些域名并不是真正最顶级的,在它们之上还有一级域,称为根域)。

负责管理下级域的DNS服务器的IP地址会注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中。比如,负责管理lab.glasscom.com这个域名的DNS服务器的IP地址需要注册到glasscom.com域的DNS服务器中,而glasscom.com域的DNS服务器的IP地址又需要注册到com域的DNS服务器中,而com域的DNS服务器的IP地址又需要注册到根域的DNS服务器中。这样的话,从根域开始一路往下顺藤摸瓜就能找到任意一个域的DNS服务器,进而找到具体某个域名的IP地址了。PS:上级域和下级域有可能共享同一台DNS服务器。

关于根域DNS服务器。分配给根域DNS服务器的IP地址在全世界仅有13个,但根域DNS服务器在运营上使用多台服务器来对应一个IP地址,因此尽管IP地址只有13个,但其实服务器的数量是很多的。根域DNS服务器的相关信息包含在每一台DNS服务器程序的配置文件中。

image-20210223150539798

2. 通过缓存加快DNS服务器的响应

有时候并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以根据缓存结果直接返回或进行进一步的查询。相比每次都从根域找起来说,缓存可以减少查询所需的时间。

信息被缓存后原本的注册信息可能会发生改变。因此缓存的信息都设置有一个有效期,当缓存信息超过有效期后,数据就会从缓存中删除。而且,DNS服务器在返回响应结果的时候也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS服务器。

四. 委托协议栈发送消息
1. 数据收发操作概览

把数据想象成在一条管道中流动,管道的两个出入口称为套接字(分别对应客户端与服务器)。

数据收发操作可大致总结为以下4个阶段:

(1)创建套接字(创建套接字阶段)

(2)将管道连接到服务器端的套接字上(服务器在启动后要先创建好套接字等待客户端去连接)(连接阶段)

(3)收发数据(通信阶段)

(4)断开管道并删除套接字(断开阶段)

这4个操作都会调用Socket库中的程序组件,但其实Socket只是充当一个桥梁角色并不执行任何实质性的操作,最终所有操作都是委托给协议栈去完成的。

2. 数据收发4个操作的简单介绍

image-20210223165456323

注意,socket、connect、write和close这些都是Socket库中的组件。

①准备:创建套接字。创建完成会返回一个描述符,描述符是用来(在一台计算机内部)识别不同的套接字的,后面的操作把描述符传给协议栈,协议栈就知道是要对哪个套接字进行操作了。

②连接:将刚创建的套接字与服务器那边的套接字连接起来。这里解释一下参数里的端口号,端口号是用来识别对方的套接字的。端口号规则是全球统一的,是根据应用的种类事先规定好的,比如Web是80号端口,电子邮件是25号端口。同样的,服务器也要识别客户端的套接字,也就是说也要知道客户端端口号,这个端口号是这样获得的:客户端在创建套接字时,协议栈会为这个套接字随机分配一个端口号,当协议栈执行连接操作时会将这个端口号通知给服务器。

③发送④接收:通信阶段,传递信息。

⑤断开:根据应用种类的不同,客户端和服务器哪一方先执行close都有可能。

杂记
  1. 协议栈:操作系统内部的网络控制软件,也叫“协议驱动”、“TCP/IP驱动”等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值