《网络*》——读书笔记1

1.Web浏览器生成信息——浏览器内部

本章名词收录

  1. URL:Uniform Resource Locator,统一资源定位符

  2. 协议栈:操作系统内部的网络控制软件,也叫“协议驱动”、“TCP/IP驱动"

1.1生成http请求信息

对URL进行解析

输入“网址”(URL)时,开头的“http:”或者“ftp:”、“file:”、“mailto:”表示浏览器应当使用的访问方法(或者叫做协议)。浏览器对URL进行解析,按照规则进行拆分,生成待发送的信息。

拆分规则(对URL进行解析)

  1. http: + // + Web服务器名 + / + 目录名 / +文件名

    例:http://www.glassing.com/dir1/file.html

  2. 省略文件名的情况

    例:http://www.glassing.com/dir1/

    服务器根据预设好的规则访问该路径下的默认文件,通常叫 index.html 或 default.html

  3. 只有域名(Web服务器名)的情况

    例:http://www.glassing.com/

    访问的是“根目录”,处理方式类似2

  4. http://www.glassing.com

    代表访问“根目录”下的默认文件,处理方式类似2

  5. http://www.glassing.com/whatisthis

    访问的时根目录下的文件“whatisthis”

    【无法创建两个名字完全相同的文件和目录】

HTTP协议是怎么回事

简单来说,http协议定义了客户端和服务器之间信息交互的内容和步骤。客户端发送”请求信息“(“方法”和“URI”)给服务器,服务器返回“响应消息”。

“URI”代表客户端访问的目标,内容是一个存放网页数据的文件吗或一个CGI程序,或者直接放一个URL。“方法”代表让Web服务器完成什么样的工作,例如 读取URI表示的数据、将客户端输入发送给URI等。

常见的“方法”

  1. GET 获取URI指定的信息,也可以用于表单向客户端获取信息(限制几百个字节)

  2. POST 从客户端向服务器发送数据

  3. HEAD 获取文件最后更新时间等属性信息

  4. OPTIONS 用于通知或者查询通信选项

  5. PUT 替换URI指定服务器上的文件,URI指定的文件不存在则创建该文件

  6. DELETE 删除URI上的文件

  7. TARCE 在使用了代理的环境中检查改写情况

  8. CONNECT 传输加密信息

最常用的GET用来获取数据、POST用于填写表单数据。

“响应消息”的开头有一个状态码(例如:404Not Found),然后就是头字段+网页数据。后边会详解。

“请求报文”

请求消息有规定的格式:

  1. 请求行:包含“方法”+空格+“URI”+空格+HTTP版本

  2. 消息头:由多行(几行到几十行不等)组成,每行都包含字段名(头字段)+字段值,表示附加信息。

  3. 空行

  4. 消息体:包含客户端向服务器发送的数据

方法根据需求生成,URI直接放URL里的路径信息。消息头可以表示非常细节的信息,参考P17-P19。一般来说消息体不需要填写任何数据,因为仅凭方法和URI,服务器就能够判断需要进行怎样的操作。当使用 POST 方法时,需要将表单中填写的信息写在消息体中。

“响应报文”

响应消息也有规定的格式:

  1. 状态行:包含HTTP版本+空格+状态码+空格+响应短语

  2. 消息头:由多行(几行到几十行不等)组成,每行都包含字段名(头字段)+字段值,表示附加信息。

  3. 空行

  4. 消息体:包含服务器向客户端发送的数据

状态行里面,状态码和响应短语表示的信息是一致的,不同的响应短语用不同的状态码进行表示:

  1. 1xx :告知请求的处理进度和情况

  2. 2xx:成功

  3. 3xx:标志需要进一步操作

  4. 4xx:客户端操作

  5. 5xx:服务器错误

当网页包含图片时,网页的相应位置会有表示图片文件的“控制信息(<image src="image.jpg">)。浏览器会在屏幕上预留空间,然后再次向服务器发送请求信息以获取相应的图片。1 条请求消息中只能写 1 个 URI。如果需要获取多个文件,必须对每个文件单独发送 1 条请求。例如一个网页包含三张图片,那么需要对服务器发送4次请求。

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

http消息生成之后委托操作系统发送给Web服务器,在此之前需要查询目的地的IP地址。

IP地址基础知识
  1. 发送者发出的消息到达当前子网的集线器,然后被转发到距离发送者最近的路由器上。接下来路由器会根据目的地发送给下一个路由器,不断重复最终到达目的地。

  2. 实际上IP地址是一串32比特的数字,每8比特(1字节)为一组,分四组

  3. IP地址的主体有两部分,网络号和主机号,他们的分界由子网掩码决定

    例如10.11.12.13/24、10.11.12.13/255.255.255.0,表示前24个比特为网络号,后面为主机号

  4. 主机号全为0(10.11.12.0/24)表示整个子网

  5. 主机号全为1(10.11.12.255/24)表示子网上的所有设备,即广播

为什么要保留域名和IP地址

IP地址长度为32比特(4个字节),域名是几十个字节到255个字节,如果直接用域名会因为增大数据量而增大路由器的负担。因此需要保留域名和IP地址,而他们之间的对应机制就是DNS

Socket库提供查询IP地址功能——DNS

操作系统可以调用计算机上的DNS解析器查询IP地址,这一动作称为域名解析。DNS解析器实际上是一段程序,包含在Socket库中。Socket库是用于调用网络功能的,包含很多发送和接收数据的程序组件。

< 内存地址 > = gethostbyname("www.baidu.com");

调用解析器(gethostbyname)后,解析器会向DNS服务器发送查询信息,DNS服务器会返回响应消息,包含查询到的IP地址。

解析器的内部原理

实际上解析器功能的实现需要调用多个程序,委托操作系统内部的协议栈来发送查询信息。

HTTP 消息是用文本编写的,但 DNS 消息是使用二进制数据编写的。

DNS服务器也是有IP地址的,通常在操作系统的TCP/IP中会设置好。

1.3 DNS服务器是怎么工作的

解析器发来的查询信息

包含3种信息:

  1. 域名:待查询服务器的名称(邮件的话就是@后面的部分)

  2. Class:现在永远是代表Internet的IN

  3. 记录类型:A表示IP地址、MX(Mail eXchange)表示邮件服务器、PTR表示根据IP地址反查域名、CNAME表示查询域名相关别名、SOA表示查询域名属性信息

DNS服务器有层次结构

DNS中的域名用句点来分隔,越往右层次结构越高。例如 www.nikkeibp.co.jp ,最上层的 jp 代表分配给日本这个国家的域;下一层的 co 是日本国内进行分类的域;再下层的 nikkeibp 就是分配给某个公司的域;最下层的 www 就是服务器的名称。也就是说,负责管理下级域的DNS服务器会将IP地址注册到它对应的上级DNS服务器中,并且以此类推。

  1. com、jp这类域称为顶级域,在顶级域之上还有一级域,称为“根域”,根域的DNS服务器信息保存在互联网所有DNS服务器中。任何DNS服务器都可以找到并访问根域DNS服务器,也就是说只要找到任何一台DNS服务器,就能从根域开始找到对应的DNS服务器。

  2. 根域DNS服务器对应的IP地址有13个,但实际服务器的数量远多于此。

  3. 一台DNS服务器可以存放多个域的信息(上下级也有可能)。

DNS服务器可以通过缓存机制加快响应

有时候并不需要从顶层的根域开始往下查找,只要待查询的域名和相关信息储存在缓存中就可以直接返回响应(待查询的域名不存在也会被存储)。

但要注意缓存也有有效期,因为域名的信息可能发生改变。

在对查询进行响应时,DNS 服务器也会告知客户端这一响应的结果是来自缓存还是来自负责管理该域名的 DNS 服务器。

1.4 委托协议栈发送信息

  1. HTTP信息是一种数字信息,因此要发送给Web服务器的HTTP消息也可以说是委托协议栈发送数字信息。该过程不局限于浏览器,对于各种使用网络的应用程序都是共通的。该过程需要通过按照指定顺序调用Socket库中的多个程序组件实现的。

  2. 简单来说,需要收发数据的两台计算机之间连接了一条数据通道,数据从一段被送入管道,就会从另一端取出,数据的流动是双向的。

  3. 实际的过程首先需要建立通道。听到两端的数据出入口称为套接字,服务器端先创建套接字,然后等待客户端向该套接字连接通道。客户端也会先创建好套接字,然后从该套接字延伸出通道。

  4. 数据发送完成之后连接的管道将会断开。管道连接由客户端发起,断开可以由客户端或服务器任一方发起,当管道断开后,套接字也会被删除。

  5. 综上所述,收发数据的操作分为若干个阶段,可以大致总结为以下 4 个。 (1)创建套接字(创建套接字阶段) (2)将管道连接到服务器端的套接字上(连接Web服务器阶段) (3)收发数据(通信阶段) (4)断开管道并删除套接字(断开阶段)

  6. 在每个阶段,操作系统中的协议栈会通过调用Socket库中的应用程序来完成各个步骤

  7. HTTP协议将HTML数据和图像都当做单独的对象进行处理,每获取一次数据就要执行一遍收发数据的4个阶段。因此如果一个网页有多张图片,那就要重复执行多次,这样效率太低。在HTTP 1.1协议中,可以在1次连接中连续执行多次发送和接收响应的步骤,提高效率。

创建套接字(socket)阶段

调用Socket库中的socket之后套接字就被创建好了,协议栈返回一个描述符并将它存放在内存中,用来给应用程序识别不同的套接字。

可以同时打开多个浏览器窗口,也就是可以同时创建多个套接字。

连接Web服务器阶段

调用Socket库中的connect,输入参数“描述符”、“服务器IP地址”和“端口号”,协议栈会执行连接操作。

  1. 描述符:用以协议栈中的应用程序根据描述符识别本方(客户端)的套接字;

  2. 服务器IP地址:用来让双方识别套接字,通过DNS服务器查询;

  3. 端口号:用来让双方识别套接字,服务器上所使用的端口号是固定的,例如Web是80号端口、电子邮件是25号端口。

通信阶段

调用Socket库中的write,输入参数“描述符”、“发送数据”和“发送数据长度”,协议栈就可以根据描述符指定的套接字识别出通信对象,然后向其发送数据。

服务器执行接收操作之后,解析数据内容并执行相应操作,向客户端返回响应消息。

调用Socket库中的read,输入参数“描述符”、“接收缓冲区”(一段用来存放接收到的消息的内存地址),协议栈将接收到的响应消息存放到接收缓冲区中。

断开管道并删除套接字

调用Socket库中的close,可以断开连接。

HTTP协议规定,Web服务器发送完响应消息之后,应主动调用close断开连接。当断开操作随着read传达到客户端时,客户端也会在调用read之后调用close进入断开阶段。(有些应用是客户端先断开)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值