1.1、生产HTTP请求消息
-
浏览器的第一步就是根据规则对URL进行解析
http://服务器名/目录名/+……/文件名
-
Http
的工作过程:-
浏览器向Web服务器先发送头节点,再发送请求
-
Web服务器解析请求,并做出响应放在响应消息中,通过响应消息的头部状态码判断响应是否成功
-
响应失败,则显示状态码,否则将响应消息返回客户端,由浏览器读出响应结果。
-
-
生成
http
请求消息-
第一行是请求行:重点是最开头的方法(GET、POST等)。方法+URI+HTTP版本号
-
第二行是消息头:存放额外的详细信息(日期、语言、压缩格式等)
-
添加一个没有内容的空行,然后写上需要发送的数据(称为消息体)
这里要注意:一条请求消息只能写一个URI,每个文件都要单独发送一次1次请求。
-
-
这里简单说下响应消息:格式和思路基本和请求消息一样,差别在第一行:响应消息第一行为状态码和响应消息,表示执行是否成功。
1.2、向DNS
服务器查询Web服务器的IP
地址
-
生成HTTP消息之后,下一步就是根据域名查询
IP
地址-
先了解
IP
地址(1)局域网都是基于
TCP/IP
的思路设计的:多台计算机通过集线器组成子网,子网再通过路由器连接形成网络(2)通过
IP
地址我们可以判断出访问对象服务器的位置,从而将消息发到服务器中。(3)
IP
地址是比特的数字,按照8比特为一组分成4组,十进制表示并用原点隔开注:
IP
地址的主机号为0,表示整个子网,为1表示向子网上所有设备发送包 -
为什么使用域名和
IP
地址并用?域名容易记住,
IP
地址比较难记;域名的长度是IP
地址的很多倍,只用域名会加重路由器的负担,传送数据会发费更多时间
-
-
怎样通过域名来查询
IP
地址?(反之亦然)-
通过查询
DNS
(域名服务系统)服务器,会返回IP
地址(1)解析器可以看作是
DNS
服务器的客户端,调用解析器后,解析器会向DNS
服务器发送查询消息,然后DNS
服务器会返回响应消息。(2)响应消息包含查询到的
IP
地址,解析器会取出,将其放入浏览器指定的内存中。(3)浏览器向Web服务器发送消息时,从内存中取出地址,将其与HTTP请求消息一起交给操作系统就可以了
注:根据域名查询
IP
地址时,浏览器会使用Socket库的解析器 -
DNS
服务器的基本工作(1)基本工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。
(2)
DNS
服务器会从域名与IP
地址的对照表中查找相应的记录,并返回IP
地址 -
域名的层次结构
(1)越靠右的位置级别越高,如
www.lab.glasscom.com
,.com的级别最大(2)一个域的信息是作为一个整体存放在服务器中,不可拆开放在其他服务器
(3)下级域的
IP
地址会注册到上级域中 -
DNS
服务器查询IP
地址的过程(1)客户端会会先访问最近的
DNS
服务器,如果服务器有的话直接可以查询地址,没有的话转而向根域查询(2)通过根域一级一级往下一级找,最后会找到目标服务器
(3)向目标
DNS
服务器查询IP
地址,服务器将地址返回给客户端注:为了加快查询的速度,可以在
DNS
服务器中设置缓存,记住之前的查询过的域名,为了保证信息一致性,给缓存设置有效期
-
-
委托协议栈发送消息
-
查询到
IP
地址之后,就委托操作系统内部的协议栈方向Web服务器发送消息 -
收发操作大致分为以下4步:
(1)创建套接字(创建套接字阶段)
调用Socket库的socket组件就可以创建套接字,协议栈在套接字创建完成后,会返回一个描述符,应用程序将描述符保存到内存中。应用程序通过”描述符“这一类似号码牌的东西识别套接字
(2)将管道连接到服务器端的套接字上(连接阶段)
调用
Socket
库中的connect组件,需要指定描述符、IP
地址和端口号三个参数描述符:协议栈知道去使用哪个套接字去和服务器的套接字连接
ip
地址和端口号:客户端和服务器之间用来识别对方套接字的机制(3)收发数据(通信阶段)
发送数据调用的是Socket库的write组件,接收消息是调用read组件,响应消息会被存放在应用程序内部的接收缓冲区中
(4)断开管道并删除套接字(断开阶段)
调用Socket库中的close组件。
-
实际上负责收发消息的是协议栈、网卡和网卡驱动
-