浏览器访问网站的过程

前言

当我们在浏览器中输入一个网址,比如www.百度.com,浏览器就会加载出百度的主页。那么浏览器背后完成的具体是怎么样的呢?
总结起来大概的流程是这样的:

(1)浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP
(2)然后通过IP地址找到IP对应的服务器后,要求建立TCP连接
(3)浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包
(4)在服务器收到请求之后,服务器调用自身服务,返回HTTP Response(响应)包
(5)客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。

就可以用下面的这幅图来进行解释

一. DNS解析

在浏览器中输入的是一个网址,是不能直接用来进行连接的,因而就要使用DNS地址解析将输入的URL网址转换为IP地址。查找的流程图是这样的

具体的查找过程和策略可以分为下面这几步:

(1)在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
(2)如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
(3)如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
(4)如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
(5)如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找google.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。
(6)如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

二.建立tcp协议三次握手过程

好了经过DNS解析,现在我们已经知道了百度服务器的地址(111.13.101.208),可以访问它了。

约会也得先发个邀请吧,网络也一样。先建立连接,才可以传输数据呢。接下来看看怎么和百度服务器约会吧。

1.简单说明TCP协议

IP 协议定义了一套自己的地址规则,称为 IP 地址。它实现了路由功能,允许某个局域网的 A 主机,向另一个局域网的 B 主机发送消息。
IP 协议只是一个地址协议,并不保证数据包的完整。如果路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包。这就要依靠 TCP 协议。
简单说,TCP 协议的作用是,保证数据通信的完整性和可靠性,防止丢包。

TCP三次握手建立过程简单说明:

1.由客户端(用户)发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的。

并且还将报文中SYN字段置为1,表示需要建立TCP连接请求。

2.服务端(就是百度服务器)会回复客户端(用户)发送的TCP连接请求报文,其中包含seq序列号,也是由回复端随机生成的,

并且将回复报文的SYN字段置1,而且会产生ACK验证字段,ACK验证字段数值是在客户端发过来的seq序列号基础上加1进行回复:

并且还会回复ack确认控制字段,以便客户端收到信息时,知晓自己的TCP建立请求已得到了确认。

3.客户端收到服务端发送的TCP建立请求后,会使自己的原有序列号加1进行再次发送序列号,并且再次回复ACK验证请求,在B端发送过来的seq基础上加1,进行回复;同时也会回复ack确认控制字段,以便B收到信息时,知晓自己的TCP建立请求已经得到了确认。

三.客户端发出访问网站相应页面请求(发出http协议请求报文)

 建立连接后,发送请求报文,想看什么数据。 输入www.baidu.com时,默认请求的是index.html首页文件

请求报文结构:

1. 请求行:
    ①. 请求的方法(get post)
    ②. 请求的数据信息(默认请求index.html首页文件)
    ③. 请求http协议版本

    tcp协议分为长连接(http1.1)和短连接(http1.0)

2.请求头:

3.空行:

4.请求主体:get方法没有请求主体内容 post方法会有请求主体信息

HTTP请求方法:GET方法与POST方法

GET方法

GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于
GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大

POST方法
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

各种HTTP请求的含义

GET
通过请求URI得到资源
POST
用于添加新的内容
PUT
用于修改某个内容
DELETE
删除某个内容
CONNECT
用于代理进行传输,如使用SSL
OPTIONS
询问可以执行哪些方法
PATCH
部分文档更改
PROPFIND
查看属性
PROPPATCH
设置属性
MKCOL
创建集合(文件夹)
COPY
拷贝
MOVE
移动
LOCK
加锁
UNLOCK
解锁
TRACE
用于远程诊断服务器
HEAD
类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据

四.服务端发出相应访问页面的请求信息(发出http响应报文)

应答 web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。

1.起始行(响应行)

①. HTTP协议版本信息

②. 响应的状态码信息(请求成功状态码 200)

③. 响应状态码说明信息

2.响应头部:

3.空行:

4.响应主体内容:一般为html css js 等等代码信息

协议状态代码描述HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP1.1服务器已经成功的处理了客户端发出的请求(200表示成功):
HTTP/1.1 200 OK
响应头(Response Header)响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等:

响应正文响应正文就是服务器返回的HTML页面:

响应头和正文之间也必须用空行分隔。

5.HTTP应答码

HTTP应答码也称为状态码,它反映了Web服务器处理HTTP请求状态。HTTP应答码由3位数字构成,其中首位数字定义了应答码的类型:
1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中
2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK
3XX - 重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。
4XX - 客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found,意味着请求中所引用的文档不存在。
5XX - 服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500
对于我们Web开发人员来说掌握HTTP应答码有助于提高Web应用程序调试的效率和准确性。

五.断开tcp协议四次挥手过程

当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。

    第一次挥手:
    Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
    第二次挥手:
    Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
    第三次挥手:
    Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
    第四次挥手:
    Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

原文地址:https://blog.51cto.com/14359196/2416037

时间: 2024-10-12 20:41:57

浏览器访问网站的过程的相关文章

浏览器访问网站过程

1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把http://www.baidu.com/变成ip,如果url里不包含端口号,则会使用该协议的默认端口号.DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相 应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,

java 实现模拟浏览器 访问网站

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等.所访问的这些页面 有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS.目前我们使用的浏览器处理这些情况都 不会构成问题.不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据:利用某些站点提供的页面来完成某种功能,例如 说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好

火狐浏览器访问网站出现 HTTP Error 400. The request is badly formed.错误,怎么解决

今天在访问某个网站时,出现一个"HTTP Error 400. The request is badly formed."错误, 那么应该如何解决呢? 1.问题描述: 用火狐浏览网站出现""HTTP Error 400. The request is badly formed."错误 2.问题原因: Http error 400错误请求,是客户端问题,跟服务器没关系(也就是本地出问题了) 3.解决方法: 通过清理垃圾.清洁注册表,或检查广告拦截模块及防火墙

学习:浏览器访问网站的总流程

个人理解,有错误麻烦纠正下! 主机A打开浏览器进行访问www.baidu.com的流程如下: 第一步:主机A访问www.baidu.com,那么肯定需要知道www.baidu.com的IP地址,原来肯定是不知道的 第二步:找的优先级是先WINDOWS缓存 > HOSTS文件 > DNS服务,如果都没找到,那么就会去请求本地DNS服务器,这里自己的本地DNS服务器如下:电信 第三步:想要请求本地DNS服务器,那么就需要出网关,那么就需要先知道网关的MAC的地址,用来封装链路层用的 回复包: 第四

黄聪:wordpress如何携带cookie模拟浏览器访问网站

$args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'headers' => array( 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q

DNS解析原理(客户访问网站流程)

DNS( Domain Name System)是"域名系统"的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作.DNS就是这样的一位"翻译官",它的基本工作原理可用下图来表示.DNS域名称空间的组织方式: 基本流程:1.客户机通过浏览器访问网站:www.baidu.com此过程需要将域名映射为IP地址,首先调用解析函数将待转换的域名放在DNS请求中,以UDP的报文方式发给本地

浏览器访问网页过程中发生了什么?

在浏览器输入:http://www.baidu.com/,最后,浏览器呈现出相应网页,这个过程究竟发生了什么? 第一步,解析域名,找到主机IP (1)浏览器会缓存DNS一段时间,一般2-30分钟不等.如果有缓存,直接返回IP,否则下一步. (2)缓存中无法找到IP,浏览器会进行一个系统调用,查询hosts文件.如果找到,直接返回IP,否则下一步.(在计算机本地目录etc下有一个hosts文件,hosts文件中保存有域名与IP的对应解析,通常也可以修改hosts科学上网或破解软件.) (3)进行了

DNS设置错误,浏览器能够正常访问网站么?

大家在看到这个问题,第一反应是不是都认为:不能? 嘿嘿,我料定大家的正常思路也该是这样. 起初我也认为应该是这样但是前段时间遇到一件事让我改变了这个固有观念: 前段时间机房的dhcp服务关闭,我们不得已开始使用静态IP,此时由于老师没说DNS服务器在另外一台机器上,我们想当然的认为DNS的IP就是原来DHCP的IP,因为我们使用的是360浏览器,我发现设置好静态IP并不影响我们正常上网查资料.之后由于51cto的视频看不了,就去问老师原因,老师看了IP说DNS设置错误.老师一改就恢复正常.我当时

浏览器访问网页过程中发生了什么?(转)

在浏览器输入:http://www.baidu.com/,最后,浏览器呈现出相应网页,这个过程究竟发生了什么? 第一步,解析域名,找到主机IP (1)浏览器会缓存DNS一段时间,一般2-30分钟不等.如果有缓存,直接返回IP,否则下一步. (2)缓存中无法找到IP,浏览器会进行一个系统调用,查询hosts文件.如果找到,直接返回IP,否则下一步.(在计算机本地目录etc下有一个hosts文件,hosts文件中保存有域名与IP的对应解析,通常也可以修改hosts科学上网或破解软件.) (3)进行了