一次完整的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协议,协商完成后就可以进行通信了,当然这样理解不是那么准确。
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(服务器内部错误) 若干响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据 实体内容:服务器返回给客户端的数据
微服务是把原来的单体服务切割成小的服务。一般来说通过RPC技术通信,微服务不仅仅是把http请求分到不同的服务器上,而是逻辑上进行切割,包括数据库。比如订单服务,产品服务,如果仅仅是请求分到不同服务器,只能算负载均衡。如果订单有独立的数据库,独立的服务,产品也有独立的服务,甚至实现架构都不一样 比如订单用java,产品用go。甚至各个微服务的耦合交给前端实现。而http和webservice可以说是微服务接口实现调用的方式。
相同点:底层通讯都是基于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语言
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次挥手过程完毕
|