《网络是怎样连接的》——读书笔记第一章

******************************************
*        第一章:浏览器生成消息            **
******************************************

生成http请求信息——》向DNS服务器查询web服务器的ip——》全世界DNS服务器的大接力——》委托操作系统协议栈发送消息

【1.1】 生成http请求信息

第一步:浏览器解析url

URL格式:http: // web服务器名 / 目录名 / ``` /    文件名     举例:https://blog.youkuaiyun.com/xxaqustc/article/details/106872874

省略文件名的情况,也就是 https://web服务器名/目录名/   最后没有文件名,根据URL规则,一般根据服务器的设置而有所不同,多数都会返回一个默认的页面,比如index.html或default.htm

当我们在浏览器的地址栏输入一个url地址时,浏览器首先做的就是按照上述格式对url进行解析

http的主要方法:
GET   : 获取URI指定的信息,如果URI指定的是文件,则返回文件的内容;若是CGI,则返回CGI的执行输出数据。
POST  : 从客户端向服务器发送数据,一般用于发送表单中填写的数据等情况。
HEAD  : 和GET 基本相同。不过它只返回HTTP 的消息头(message header),而并不返回数据的内容。用于获取文件最后更新时间等属性信息。
DELETE:删除URI 指定的服务器上的文件。
TRACE :将服务器收到的请求行和头部(header)直接返回给客户端。用于在使用代理的环境中检查改写请求的情况。

第二步:生成http请求消息

(a)请求消息格式:
<方法> <URI> <http版本>
<字段名>:<字段值>
...
...
...

<消息体>


(b)响应消息格式:
<http版本> <状态码> <响应短语>
<字段名>:<字段值>
...
...
...

<消息体>

HTTP响应消息的状态码说明:
1xx :告知请求的处理进度和情况
2xx : 成功
3xx : 表示需要进一步的操作
4xx : 客户端错误
5xx : 服务器错误

*****************************************************************************************************************
*                        *                                                                                        *
*        重要说明        *    1 条请求消息中只能写1 个URI。如果需要获取多个文件,必须对每个文件单独发送1 条请求    *
*                        *                                                                                        *
*****************************************************************************************************************
比如1 个网页中包含3 张图片,那么获取网页加上获取图片,一共需要向Web 服务器发送4 条请求

【1.2】 向DNS服务器查询web服务器的ip地址

有IP了,为啥还需要域名?——域名比IP好记
那都改成域名行不行?——计算机处理IP比处理域名的效率高
综合结果:人使用域名,好记。路由器使用ip,好处理。

上述原因就引出一个问题,谁来负责把域名和IP对应起来?——DNS

向DNS服务器发送查询信息,相应的,我们的计算机上就要有DNS客户端,由于通过DNS查询来获取IP的操作叫做解析URL,因此DNS客户端又称为解析器。
DNS解析器是一段程序,包含在操作系统的Socket库中。【socket库】用于调用网络功能的程序组件集合


【1.3】 全世界的DNS服务器大接力
[DNS查询消息格式]
来自DNS客户端的查询消息 包含以下三种信息,例如:
(a)域名 = www.lab.com
(b)Class = IN  (IN:InterNet)
(c)记录类型 = A (A: Address 表示域名对应的是IP地址; MX:MailExchange 代表域名对应的是邮件服务器)

[域名的层级结构]
域名是有层次结构的,比如www.baidu.lab.com这个域名,里面用英文句点隔开了三个层次。域名的层次越靠右层次越高,com > lab > baidu > www;
一个域的信息是作为一个整体存放在DNS服务器上的,不能让一个域拆分到多台DNS服务器上。
要想查询某个域名对应的信息,首先这个域名需要在DNS服务器上注册,注册的时候,一般是按照子域逐层向上注册的方式进行(如:管理baidu.lab.com域的DNS服务器的IP要注册到lab.com域的服务器中,依次类推)。
需要说明的是,类似com、cn、org等看似是层级最高的域了,其实上面还有一个一级域,称为根域,根域没有自己的名字,一般在最右侧的域后面追加 英文句点,这个英文句点就代表根域。
根域的DNS 服务器信息保存在互联网中所有的DNS 服务器中。这样一来,任何DNS 服务器就都可以找到并访问根域DNS 服务器了。因此,客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS 服务器
**************************************************************
*   提示:分配给根域DNS 服务器的IP 地址在全世界仅有13 个     *
**************************************************************

[DNS缓存]
DNS 服务器有一个缓存功能,可以记住之前查询过的域名。如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开
始向下进行。相比每次都从根域找起来说,缓存可以减少查询所需的时间。但是缓存需要有有效期,到期后要及时更新最新的注册信息。

【1.4委托协议栈发送消息】

(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)

[创建套接字]
调用Socket库的相关组件,完成套接字的创建,返回一个套接字的描述符(用于区分不同的套接字)

[连接阶段]
调用Socket 库中的名为connect 的程序组件来完成这一操作     例如:connect(<描述符> ,<服务器的IP地址和端口号>,....);

*********************************************************************
*    描述符:应用程序用来识别套接字的机制                            *
*    IP 地址和端口号:客户端和服务器之间用来识别对方套接字的机制        *
*********************************************************************

[传递消息]
发送时,调用Socket库的Write组件来完成消息的发送,例如:wirte(<描述符> , <发送数据> , <发送数据长度> , .....);
接收时,调用Socket库的read组件来完成消息的接收,例如: read(<描述符> , <接收缓冲区> , ....);

[断开连接]
调用Socket 库的close 程序组件进入断开阶段,例如: close(<描述符>);


http协议规定服务端在发送完响应消息之后,应该主动执行断开操作,而当客户端调用read方法接收最后的消息时可以知道连接已断开,并通知浏览器,浏览器得知后也会调用close方法来断开连接。


FAQ:
1、既然可以用端口号来识别套接字,那还需要描述符干嘛?
2、既然确定连接对象的套接字需要使用端口号,那服务器是如何知道客户端的套接字的呢?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值