一次完整的http请求过程

一次完整的http(超文本传输协议)请求过程会经历以下几个过程:
在这里插入图片描述

  • 域名解析
    把一个域名解析成可用的ip地址和端口号,Windows具体解析步骤如下:
    1.搜索浏览器自身DNS缓存,如果没有过期,则解析结束。
    2.如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的DNS缓存
    3.如果浏览器没有解析出域名,则看电脑的hosts文件,看是否在此处配置了域名。C:\Windows\System32\drivers\etc\hosts
    4.如果无,则远程发起DNS域名解析请求。
  • 发起TCP3此握手
    拿到IP地址后,浏览器会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。

TCP标志位有6种标示,即:SYN(建立联机) 、 ACK(确认) 、 PSH(传送) 、 FIN(f结束) 、 RST(重置) 、 URG(紧急) 、 Sequence number(顺序号码) 、 Acknowledge number(确认号码)

ACK=0表示未确认,
SYN = 1 表示这是一个连接请求或连接接受报文

第一次:客户端向服务端发送建立连接的请求,seq = x 表示客户端自己的初始序号,此时客户端处于等待状态。
第二次:服务器如果监听到客户端请求,如果同意建立连接,则发送ACK=1表示确认建立连接,再发送SYN=1请求和客户端建立连接,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,seq = y 表示Server 自己的初始序号。此时服务器表示已收到客户端的连接请求,服务器处于等待状态。
第三次:客户端收到确认后还需再次发送确认给服务端,ACK 置1 表示确认,服务器ack= y + 1 有效,客户端自己的设置为序号seq= x + 1。
在这里插入图片描述

2个计算机通信是靠协议(目前流行的TCP/IP协议)来实现,如果2个计算机使用的协议不一样,那是不能进行通信的,所以这个3次握手就相当于试探一下对方是否遵循TCP/IP协议,协商完成后就可以进行通信了,当然这样理解不是那么准确。

  • 建立TCP连接后发起http请求

HTTP请求报文由三部分组成:请求行,请求头和请求正文
请求行:用于描述客户端的请求方式,请求的资源名称以及使用的HTTP协议的版本号(例:GET/books/java.html HTTP/1.1)
请求头:用于描述客户端请求哪台主机,以及客户端的一些环境信息等
请求正文:当使用POST, PUT等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)

  • 服务器端响应http请求,浏览器得到html代码
    服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件

HTTP响应也由三部分组成:状态码,响应头和实体内容
状态码:状态码用于表示服务器对请求的处理结果
列举几种常见的:200(成功)
302(临时重定向,显式重定向, Location响应首部的值为新的URL)
304(如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码, 告诉浏览器,你不用请求该资源,直接使用本地的资源即可)
403(有这个资源,但是没有访问权限)
404(服务器没有这个资源)
500(服务器内部错误)
若干响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据
实体内容:服务器返回给客户端的数据

  • 浏览器解析html代码,并请求html代码中的资源
    浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这是时候就用上 keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里面的顺序,但是由于每个资源大小不一样,而浏览器又是多线程请求请求资源,所以这里显示的顺序并不一定是代码里面的顺序。
  • 浏览器对页面进行渲染呈现给用户
    最后,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。
  • 微服务和一般的http请求或webservice的关系:
    一般我门很自然的认为微服务之间的调用和http和webservice的调用是不同的调用类型,其实不是的。

微服务是把原来的单体服务切割成小的服务。一般来说通过RPC技术通信,微服务不仅仅是把http请求分到不同的服务器上,而是逻辑上进行切割,包括数据库。比如订单服务,产品服务,如果仅仅是请求分到不同服务器,只能算负载均衡。如果订单有独立的数据库,独立的服务,产品也有独立的服务,甚至实现架构都不一样 比如订单用java,产品用go。甚至各个微服务的耦合交给前端实现。而http和webservice可以说是微服务接口实现调用的方式。

  • RPC协议与HTTP协议的区别
    RPC:Remote Produce Call远程过程调用,类似的还有RMI,自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型

相同点:底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务

不同点:
RPC:框架有:dubbo、cxf、(RMI远程方法调用)Hessian
当使用RPC框架实现服务间调用的时候,要求服务提供方和服务消费方 都必须使用统一的RPC框架,要么都dubbo,要么都cxf

跨操作系统在同一编程语言内使用
优势:调用快、处理快

http:框架有:httpClient
当使用http进行服务间调用的时候,无需关注服务提供方使用的编程语言,也无需关注服务消费方使用的编程语言,服务提供方只需要提供restful风格的接口,服务消费方,按照restful的原则,请求服务,即可

跨系统跨编程语言的远程调用框架
优势:通用性强

总结:对比RPC和http的区别
1 RPC要求服务提供方和服务调用方都需要使用相同的技术,要么都hessian,要么都dubbo
而http无需关注语言的实现,只需要遵循rest规范
2 RPC的开发要求较多,像Hessian框架还需要服务器提供完整的接口代码(包名.类名.方法名必须完全一致),否则客户端无法运行
3 Hessian只支持POST请求
4 Hessian只支持JAVA语言
在这里插入图片描述

  • 四次挥手
    ACK:表示验证字段
    SYN:位数置1,表示建立TCP连接
    FIN:位数置1,表示断开TCP连接

1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成)
2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)
3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)
4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
至此TCP断开的4次挥手过程完毕

在这里插入图片描述

  • 6
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 1. 用户在浏览器中输入网址并发送请求。 2. DNS解析,将域名解析成IP地址。 3. 浏览器向服务器发送TCP连接请求。 4. 服务器接受连接请求并建立TCP连接。 5. 浏览器发送HTTP请求,请求所需资源。 6. 服务器处理请求并返回HTTP响应。 7. 浏览器接收响应并显示页面。 ### 回答2: 从浏览器点击到服务器响应需要经历以下步骤: 1. URL解析:浏览器首先解析用户在地址栏中输入的URL,将其切分成协议、域名和资源路径等部分。 2. DNS查询:浏览器会通过DNS(域名系统)将域名转换为服务器的IP地址。浏览器会查找本地DNS缓存中是否存在对应的IP地址,如果不存在,则向DNS服务器发送查询请求获取IP地址。 3. TCP连接建立:浏览器会与服务器建立TCP连接。首先,浏览器会发送一个三次握手的请求到服务器,以确保双方建立起可靠的传输通道。 4. 发送HTTP请求:一旦TCP连接建立成功,浏览器就会发送HTTP请求到服务器。请求中包含了请求的方法(例如GET或POST)、资源路径、请求头等信息。 5. 服务器处理请求:服务器接收到浏览器发送的请求后,会根据请求的资源路径和相关参数进行处理。服务器可能会调用相应的处理程序或脚本来生成响应。 6. 服务器发送响应:服务器处理完请求后,会将生成的响应发送回浏览器。响应中包含了响应头和响应体两部分。响应头包含了响应的状态码、内容类型等信息,而响应体则包含了服务器返回的具体数据。 7. 浏览器解析响应:浏览器接收到响应后,会根据响应头中的内容进行相应的解析和处理。如果响应的内容类型是HTML,浏览器会开始解析HTML代码,并将结果显示在用户界面上。 8. 关闭连接:一旦响应解析完毕并显示在界面上,浏览器会关闭与服务器的TCP连接,释放资源。 总之,从浏览器点击到服务器响应经历了URL解析、DNS查询、TCP连接建立、发送HTTP请求、服务器处理请求、服务器发送响应、浏览器解析响应和关闭连接这些步骤。这个过程实际上是一种客户端(浏览器)和服务器之间的通信过程,以确保用户能够获得所需的网页内容。 ### 回答3: 从浏览器点击到服务器响应,需要经历以下几个步骤: 1. 域名解析:浏览器首先将输入的域名发送给本地DNS服务器,本地DNS服务器通过递归查询,从根域名服务器、顶级域名服务器等逐步获取目标服务器的IP地址。 2. 发起TCP连接:浏览器会通过TCP协议与服务器建立连接,进行三次握手,确保连接的可靠性和完整性。 3. 发送HTTP请求:一旦建立了TCP连接,浏览器就会向服务器发送HTTP请求,请求中包含了方法(GET、POST等)、路径、协议版本、头部信息等。 4. 服务器处理请求:服务器接收到请求后,根据请求中的具体信息,找到相应的资源文件,进行相应的处理,处理过程可能包括验证用户身份、读取数据库、执行后台程序等。 5. 服务器返回响应:服务器处理完请求后,将生成的响应信息通过TCP连接返回给浏览器。响应包括状态码、响应头和响应体,状态码表示请求的处理结果,响应头包含了响应的其他附加信息,响应体则是服务器返回的具体内容。 6. 接收响应:浏览器接收到服务器返回的响应后,会根据响应头中的信息,判断响应的具体类型和长度,并开始接收响应体的内容。 7. 渲染页面:一旦浏览器接收到响应体的全部内容,会开始根据响应中的HTML、CSS、JavaScript等文件,进行页面的渲染和展示,同时进行布局、样式、脚本的解析和执行。 以上是从浏览器点击到服务器响应的步骤,通过这一系列的过程,浏览器能够与服务器进行通信,并获取到服务器返回的数据,完成页面的显示和功能交互。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值