一次完整的http请求过程是怎样的?

陆仴


一、从输入一个网址开始

当我们在浏览器输入一个网址,然后按下回车,接下来浏览器显示了页面。网速好的话这之间可能就一秒,但在这一秒内到底发生了什么?

本文主要内容是试图记录一个完整 Web 请求的详细过程,从用户在浏览器中输入 URL 地址说起,然后浏览器如何找到服务器地址的过程,并发起请求;分析请求在达反向代理服务器内部处理过程;最后到请求在服务器端处理完成后,浏览器渲染响应页面过程。

Web请求的工作原理可以简单地归纳为:

浏览器通过 DNS 把域名解析成对应的IP地址;

根据这个 IP 地址在互联网上找到对应的服务器,建立 Socket 连接;客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档;

服务器端,实际上还有复杂的业务逻辑:服务器可能有多台,到底指定哪台服务器处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;还有请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库里;当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如:css,js或者图片)时又会发起另外的请求,而这些请求可能会在CDN上,那么CDN服务器又会处理这个用户的请求。

客户端与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果。

一个 HTTP 事务就是这样实现的,看起来很简单,原理其实是挺负责的。需要注意的是客户机与服务器之间的通信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。

但需要注意的是,从 HTTP 1.1 开始,服务器可以与客户端保持长连接,不一定是请求完成后就断开连接,这取决于服务器的操作。

二、DNS 域名解析

首先来看看最先发生的事情——DNS 域名解析,简单的说就是把域名翻译成 IP 地址。例如:把 http://www.test.com 这个域名翻译成对应 IP 192.168.1.1,这里只是举个例子。

如果你在浏览器中直接输入的 IP 地址,那么实际上会跳过这个步骤,否则会经理下面几部:

1、浏览器缓存检查

浏览器会首先搜索浏览器自身的 DNS 缓存,缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存,看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。

2、操作系统缓存检查 + hosts 解析

如果浏览器的缓存里没有找到对应的条目,操作系统也会有一个域名解析的过程,那么浏览器先搜索操作系统的 DNS 缓存中是否有这个域名对应的解析结果,如果找到且没有过期则停止搜索,解析到此结束。

在 Linux 中可以通过 /etc/hosts 文件来设置,可以将任何域名解析到任何能够访问的 IP 地址。如果在这里指定了一个域名对应的 IP 地址,那么浏览器会首先使用这个 IP 地址。当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。

3、本地区域名服务器(Local DNS Server)解析

如果在 hosts 文件中也没有找到对应的条目,浏览器会发起一个 DNS 的系统调用,会向本地配置的首选 DNS 服务器发起域名解析请求(通过的是 UDP 协议向 DNS 的 53 端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。

在我们的网络配置中都会有“DNS 服务器地址”这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办。操作系统会把这个域名发送给这里设置的 LDNS,也就是本地区的域名服务器。

这个 DNS 通常都提供给你本地互联网接入的一个 DNS 解析服务,例如你是在学校接入互联网,那么你的 DNS 服务器肯定在你的学校;如果你是在一个小区接入互联网的,那这个 DNS 就是提供给你接入互联网的应用提供商,即电信或者联通。大约 80% 的域名解析都到这里就已经完成了,所以 LDNS 主要承担了域名的解析工作。

4、根域名服务器解析(Root Server)

如果 LDNS 没有找到对应的条目,则由运营商的 DNS 代我们的浏览器发起迭代 DNS 解析请求。它首先是会找根域的 DNS 的 IP 地址,找到根域的 DNS 地址,就会向其发起请求。然后根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址。

5、主域名服务器(gTLD Server)

本地域名服务器(LDNS Server)再向上一步返回的 gTLD 服务器发送请求。

接受请求的 gTLD 服务器查找并返回此域名对应的 Name Server 域名服务器的地址,这个 Name Server 通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。

Name Server 域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个 TTL 值返回给 DNS Server 域名服务器。

三、TCP 的 3 次握手

拿到域名对应的 IP 地址后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的 WEB 程序发起 TCP 的连接请求。

这里还涉及 ARP(地址解析协议):是根据 IP 地址获取物理地址 (MAC 地址) 的一个协议。

当一个数据帧经过多次路由到达目的网络时,路由器只能知道其数据帧中的目的 IP 地址,而不知目标主机的硬件地址,网络层使用的是 IP地址,但是在实际网络链路上传送数据帧时,最终必须使用该网络的硬件地址,此时需要目的主机的硬件地址,就要使用 ARP 来获取到对应 IP 地址主机的物理地址。

这个连接请求(原始的 Http 请求经过 TCP/IP 4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的 TCP/IP 协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

Client 首先发送一个连接试探,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示 Client 自己的初始序号(seq = 0 就代表这是第 0 号包),这时候 Client 进入 syn_sent 状态,表示客户端等待服务器的回复。

Server 监听到连接请求报文后,如同意建立连接,则向 Client 发送确认。报文中的 SYN 和 ACK 都置 1 ,ACK = x + 1 表示期望收到对方下一个报文段的第一个数据字节序号是 x+1,同时表明 x 为止的所有数据都已正确收到(ACK = 1 其实是 ACK = 0 + 1,也就是期望客户端的第 1 个包),seq = y 表示 Server 自己的初始序号(seq = 0 就代表这是服务器这边发出的第 0 号包)。这时服务器进入 syn_rcvd,表示服务器已经收到 Client 的连接请求,等待确认。

Client 收到确认后还需再次发送确认,同时携带要发送给 Server 的数据。ACK 置 1 表示确认号 ack= y + 1 有效(代表期望收到服务器的第 1 个包),Client自己的序号 seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入 Established 状态,就可以发起请求了。

四、Nginx 反向代理

1、反向代理

反向代理(Reverse Proxy)方式是指:代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部网络上服务器得到的结果返回给 Internet 上请求连接的客户端。此时代理服务器对外就表现为一个服务器,反向代理服务器对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。

反向代理的作用:

保证内网的安全,可以使用反向代理提供 WAF 功能,阻止 web 攻击。

负载均衡,通过反向代理服务器来优化网站的负载。

2、正向代理

既然有反向代理,就肯定有正向代理。什么叫正向代理呢?

正向代理(Forward Proxy)通常都被简称为代理,就是在用户无法正常访问外部资源,可以通过代理的方式,让用户绕过防火墙,从而连接到目标网络或者服务。

正向代理的工作原理就像一个跳板。

比如:我访问不了 http://google.com,但是我能访问一个代理服务器 A,A 能访问 http://google.com,于是我先连上代理服务器 A,告诉它我需要 http://google.com 的内容,A 就去取回来,然后返回给我。

从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器。为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

3、正向代理与反向代理对比

五、关闭 TCP 连接

这一步不是所有的网页都会这么做,例如网页版微信就没有关闭 TCP 连接,因为微信上别人可以随时发消息给你,实际上别人先把消息发送到了微信服务器,微信服务器再通过 TCP 链接,把消息推送到你的屏幕上。

试想一下,如果网页版微信关闭了 TCP 连接会怎样?

结果是:你不刷新网页,就永远收不到消息了。同时,如果你频繁的发消息给别人,那么就在频繁的创建连接,关闭连接,这是很消耗资源的。所以微信就干脆不关闭 TCP 连接,这样微信服务器就可以给我们的浏览器发消息。

下图是一次 Http 请求报文头部信息,其中 Connection: keep-alive 意味着这次请求结束后不会关闭 TCP 连接。

当然不是所有的 HTTP 请求都没有关闭连接,例如一篇博文,浏览器收到数据显示就可以了,没有那么多动态数据,我看完就关了,这时就应该关闭 TCP 连接,当然这还是取决于请求的服务器。说了这么多,还没说关闭连接。

关闭 TCP 连接专业点说叫做“四次挥手”,与 TCP 建立连接的“三次握手”相对应。

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个 FIN 来终止这个方向的连接。收到一个 FIN 只意味着这一方向上没有数据流动,一个TCP连接在收到一个 FIN 后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

至此,一个 Web 请求的大致流程差不多就是这样,东西还是挺多的,如果有不完善的地方,欢迎大家补充。





Kali技术


我们打开浏览器,在地址栏输入\\www.wukong.com\\,几秒后浏览器打开悟空问答的页面,那么这几秒钟内发生了哪些事情,我就带大家一起看看完整的流程:

解析URL

浏览器首先会对输入的URL进行验证,如果不合法的时候,那么会把输入的文字传给默认的搜索引擎,比如你只在地址栏输入“悟空问答”几个字。

如果URL通过验证,那么可以解析得到协议(http或者https)、域名(wukong)、资源(首页)等信息。

DNS查询

  • 浏览器会先检查域名信息是否在缓存中。

  • 再检查域名是否在本地的Hosts文件中。

  • 如果还不在,那么浏览器会向DNS服务器发送一个查询请求,获得目标服务器的IP地址。

TCP封包及传输

这时候浏览器获得了目标服务器的IP(DNS返回)、端口(URL中包含,没有就使用默认),浏览器会调用库函数socket,生成一个TCP流套接字,也就是完成了TCP的封包。

TCP封包完成之后,就可以传输了,在完成“你瞅啥”,“瞅你咋地”,“来,过来唠唠”一系列操作之后,浏览器和服务器就完成了TCP的三次握手,建立了连接,后面就可以请求服务器资源了。

服务器接收请求并相应

  • HTTP有很多请求方法,比如:GET/POST/PUT/DELETE等等,我们浏览器输入URL这种,是GET方法。

  • 服务器接收到GET请求,服务器根据请求信息,获得相应的相应内容。例如我们输入的是:\\www.wukong.com\\,那么意味着访问首页文件。

浏览器解析并渲染

浏览器从服务器拿到了想要访问的资源,大多数时候,这个资源就是HTML页面,当然也可能是一个其他类型的文件。

  • 浏览器先对HTML文档进行解析,生成解析树(以DOM元素为节点的树)。

  • 加载页面的外部资源,比如JS、CSS、图片。

  • 遍历DOM树,并计算每个节点的样式,最终完成渲染,变成我们看到的页面。

这次请求响应之后,会断开连接,就这样,完成了一次HTTP的请求。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


Http请求的一次详解:

  1. 客户端输入URL

  2. 客户端检测缓存:

有缓存且较新,客户端直接读取本地缓存进行资源展示;

有缓存但是不新,准备http请求包,发送至服务端进行缓存校验;

备注:http1.0中Expire、http1.1中是Cache-Control根据发起http请求:

请求报文包含:
a) 请求行
用来说明请求类型(get\\post\\delete等)、要访问的资源(URI)以及使用的HTTP版本(1.0还是1.1)
b) 首部(header)
HOST将指出请求的目的地;
User-Agent由浏览器来定义,自动发送;
Connection:通常设置为keep-Alive, 长连接;
其他首部包括等。


c) 空行
d) 请求实体

3. 提取请求首部HOST通过DNS域名解析获取服务IP(DNS缓存\\递归等)

4. 通过IP与默认端口创建TCP连接,进行http请求报文数据发送,其中重点就三次握手进行描述:

客户端向服务端发送syn=1,seq=client请求的ID;
服务端向客户端发送syn=1,seq=服务端请求的ID,ack=客户端请求的ID+1;
客户端向服务端发送syn=0,seq=客户端请求的ID+1,ack=服务端请求的ID+1,data\\data…

5. 服务端程序接受请求,定向到请求路径处理请求:

服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理

元数据:请求报文首部
<method> <version>
HEADERS格式name:value
<request>
示例:
Host: www.chuyuni.cn 请求的主机名称
Server: Apache/2.4.7/<request>/<version>
/<method>

HTTP常用请求方式:MethodGET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

6.访问资源:

服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

\t资源放置于本地文件系统特定的路径:DocRoot
\tDocRoot → /var/www/html
\t/var/www/html/images/logo.jpg
\thttp://www.magedu.com/images/logo.jpg
web服务器资源路径映射方式:
(a) docroot (b) alias
(c) 虚拟主机docroot(d) 用户家目录docroot

7. 返回处理结果,准备http响应:

响应报文包含:
a) 状态行:http版本(1.1或者1.0),状态码
200:请求正常处理
304:返回上次请求资源未作改动,验证浏览器的缓存机制
400:请求参数错误
401:客户端无权访问,要去输入用户名\\密码之类的授权信息
403:禁止访问(读写权限等影响)
404:请求的资源不存在
500:服务内部错误
502:网关错误
503:临时过载或者维护,导致服务端无法正常处理请求
b) 首部
报文支持的语言\\编码格式\\等,注意If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答,用于服务端缓存校验

c) 空行
d) 响应报文实体

8. 通过建立的tcp连接来返回相关的http响应报文及http状态信息,然后根据实际情况看是否关闭连接(Connection的keep-alive)

9. TCP连接关闭经历4次握手

客户端主动关闭连接放发送FIN进入FIN_WAIT1状态

服务端发最后的data和ack客户端接收进入CLOSEWAIT状态,客户端进入接受ACK进入FINWAIT2状态

服务端主动发FIN,客户端接受FIN并发送ack进入TIMEWAIT状态

服务器端正式关闭连接进入close状态

10. 客户端拿到http响应的报文信息,经过一系列前端处理过程最终将请求的资源进行展示。


夕阳雨晴


专业问题我来回答,

背景

  • HTTP(HyperText Transfer Protocol超文本传输协议),该协议位于OSI模型的应用层,应用层是开放系统的最高层,是程序员能直接操纵的通信层。一次HTTP的请求主要建立在传输层TCP三次握手建立通信和四次分手断开通信的基础上,应用层在TCP建立好通信线路后直接发送数据到对端服务器上
  • TCP:TCP是一种面向连接的可靠传输协议,为什么说它是一种可靠的传输协议,就在于他这种三次握手和四次分手的机制,通过握手能定时重传,序号确认,数据包校验,拥塞控制来达到可靠传输。当然UDP是不建立这种可靠传输的因而没有握手机制。

TCP三次握手和四次分手

所谓三次握手(Three-way Handshake),是在建立通信过程中,服务端和客户端总共发送三次数据包。三次握手的目的是:建立TCP通信,和对方同步序列号和确认号,交换通信窗口的大小等。

  • 第一次握手(SYN=1,seq=x):客户端向服务端发送一个TCP标志位SYN为1的数据包,表明要与服务端指定的端口建立连接,同时知名该数据包的第一个字节的序号为seq=X,发送完毕后,客户端进入SYN-END状态。
  • 第二次握手(SYN=1,ACK=1,ack=x+1,seq=y
    ):服务端向客户端发送一个同步确认包(SYN=1,ACK=1,确认号为x+1,表明自己已经收到序号为x开始的数据包,并向客户端发送一个序号为seq=y的包,发送完毕后,服务器端进入 SYN_RCVD 状态。
  • 第三次握手(ACK=1,seq=x+1,ack=y+1):此时客户端向服务端发送一个确认包(ACK=1),同时确认号为y+1,表明客户端已经接受到服务器以y序号开始的数据包,发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP握手结束。
  • 第一次挥手(FIN=1,seq=u):客户端向服务端发送FIN=1的包,表明要断开通信,同时发送一个序号seq=u的数据包;
  • 第二次挥手(ACK=1,seq=v,ack=u+1):服务端向客户端发送一个确认数据包(ACK=1),同时发送一个序列号为seq=v的数据包。
  • 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1):FIN=1,表明服务端同意断开通信链路,这个包同样是确认包(ACK=1),因为服务端发送的两次确认包之间客户端并没有发送数据包给服务端,所以确认号都是ack=u+1;
  • 第四次挥挥手(ACK=1,seq=u+1,ack=w+1):服务端向客户端发送确(ACK=1),同时发送一个序列号为u+1的包。至此,通信链路断开。

完整的HTTP请求过程

1.建立TCP连接:只有当TCP建立完成后才能进行通信。

2.客户端向服务端发起请求:

该阶段应用层通过HTTP协议组装请求包通过传输层网络层和数据链路层到达服务器。

3.客户端向服务端发送请求头信息:在这一步客户端将请求头信息组装在各类头部字段中,进行发送。

4.服务端向客户端发送响应:服务端接收到客户端的请求信息后,做出响应来客户端。

5.服务端向客户端发送响应报文的头部字段:将响应数据包的头部字段发送给客户端。

6.服务端向客户端发送响应数据:通过Body将响应数据给客户单,而这些数据才是客户端要获取的。

7.关闭通信线路:数据发送完毕后,如果是短连接将马上关闭通信线路,如果是长连接,服务端会通过同步信息Connection:keep-alive来告诉客户端。

以上,就是一个完整HTTP请求的流程,其主要在于TCP建联,后续都是应用层之间的交互来通信。<strong>

感觉我的回答对你有帮助,麻烦点赞关注哈,你的关注是我继续下去的动力对网络有兴趣的可以留言交流,有疑问的也可以私信,大家一起成长,一起交流,谢谢大家

<strong>


爱答问题的小星星


一次完整的HTTP请求过程是怎么样的?事实上,题主的这个问题,最开始我也是抱着试一试的心态进来的,后来发现整个回答区基本上都是学术回答,讲的通俗一点,都是专业人士在那边玩,但是……没几个民众能看得懂。就好像评论区那边有一个回答的评论是,“在头条发计算机学术信息好像怪怪的。”

我大致把这个问题查了个遍,写个最通俗的版本给大家看看吧。

其实HTTP请求过程,就是发送请求—响应的过程。

第一步

今天你想起来,有事,需要找隔壁老王要个小视频。于是,你打开了“TCP协议牌”机器,这是一台高清组装的移动电话机。

①TCP告诉你,电话线路连接通道正在接通……

第二步

电话接通了,在视频上出现了隔壁老王那张猥琐的笑脸。

你开始说话。

  • ①你:喂,你能听到我说话吗?(第一次握手)
  • ②隔壁老王:能能能,我能听到,那你能听到我的说话吗?(第二次握手)
  • ③你:哈哈,我也能听到!那咱们开始吧!(第三次握手)

接下来,就要开始做正事了。

第三步

1.你说:

哎呀老王呀,我这边需要一个小电影,你能给我发过来吗?(客户端发送请求信息)

2.接着,没等老王说话,你就把需要的小电影名字、大小、我这网速等等信息给他发了过去(客户端发送头部信息),末尾还加上了一长串省略空格(以空格做结尾)。

第四步

老王皱皱眉头。

“行吧!”(服务器端回应请求信息)

“你是要这个小电影《XXX》,番号XXX,1GB大小,某度网盘是吧?行!”(服务器端回应头部信息)

老王动了动手指,查找了一下储存卡目录,翻出小电影。

“我给你发过去了!”(服务器端发送请求数据)

第五步

你:哎呀哎呀,收到了!谢谢老王哈!下次请你吃饭!那我就先关闭了!(第一次挥手)老王:最后跟你说一句,少看小电影!(第二次挥手)老王:那我就先关闭了?(第三次挥手)你:行,那你关闭吧!(第四次挥手)

视频聊天结束。你随即打开收到的抖音小视频,美滋滋的看起成都小甜甜姐姐起来。

这件事告诉我们:

我还没有女朋友。


赖仲达


一次完整的http请求过程是怎样的?

一次完整的http请求可以说相当迷人:

从你输入网址点击回车的那一刻开始,一切就开始发生:

1、首先浏览器会解析你输入的这一串字符;主要是解析协议(HTTP(s)、ftp:)、域名(www.qq.com)等;如果是合法的网址就继续进行;

2、接下啦就是要根据第一步解析到的域名找到域名指向的IP我们称之为DNS查询。当然这也是一个相对有趣的过程,但不是问题重点,此处简略;

3、找到服务器的IP地址后写下来就是http请求的开始:

三次握手建立连接:

客户端:“在吗?”;

服务端:“在啊”;

客服端 :“那我开始连你啦”;开始发起http请求

建立连接后发生Http请求,请求内容有:

请求行:uri和协议的版本 (如:GET /index.php HTTP/1.1 )

请求头部:关客户端信息及请求正文信息(长度、编码格式等)

请求数据:如:u=admin&pwd=123456 (可为空)

服务端在收到这些信息后作出相应的回答:

状态:协议版本+状态码+简要描述(如:HTTP/1.1 200 OK)

响应头部:Content-Type(必须有:比如Content-Type: text/html), 其他可选:Date 、server 等

响应数据:即服务器回应客户端的内容

打开浏览器=》F12 访问一下百度看一下这个完美的过程吧!

当然其中涉及的到东西远不止这些,比如浏览器静态文件的缓存;各个状态码含义;单次请求最大返回资源数;请求字节长度限制等等。

此处班门弄斧,如有错误请批评指正。


有点IT


“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”

如题,一个完整的HTTP过程是怎样的?

一个完整的HTTP过程包括建立连接、数据传输、断开连接等七个步骤。

下面哟哟来详细介绍一下每一步:

1、TCP建立连接

HTTP协议是基于TCP协议来实现的,因此首先就是要通过TCP三次握手与服务器端建立连接,一般HTTP默认的端口号为80;

2、浏览器发送请求命令

在与服务器建立连接后,Web浏览器会想服务器发送请求命令

3、浏览器发送请求头消息

在浏览器发送请求命令后,还会发送一些其它信息,最后以一行空白内容告知服务器已经完成头信息的发送;

4、服务器应答

在收到浏览器发送的请求后,服务器会对其进行回应,应答的第一部分是协议的版本号和应答状态码;

5、服务器回应头信息

与浏览器端同理,服务器端也会将自身的信息发送一份至浏览器;

6、服务器发送数据

在完成所有应答后,会以Content-Type应答头信息所描述的格式发送用户所需求的数据信息;

7、断开TCP连接

在完成此次数据通信后,服务器会通过TCP四次挥手主动断开连接。但若此次连接为长连接,那么浏览器或服务器的头信息会加入keep-alive的信息,会保持此连接状态,在有其它数据发送时,可以节省建立连接的时间;

欢迎大家多多关注我,在下方评论区说出自己的见解。


哟哟吼说科技


一,在浏览器地址栏输入网址

二,解析域名,找到主机的ip地址

三,浏览器与主机建立TCP连接

四,浏览器向主机发起GET请求

五,服务器响应请求,返回html页面

六,浏览器开始显示服务器返回的页面,并且在显示html页面的时候,如果遇见css文件,js文件,图片,就又会再次给相应地址服务器发起请求。


神圣秋刀鱼


域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户


骚年不6忙


wireshark抓个包,对着资料看报文


分享到:


相關文章: