Http详解

Http请求完整流程

Posted by Jian Shen on May 2, 2020

Http请求完整流程

1、整体概括

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

2、举例说明

举个例子在浏览器中输入 www.baidu.com 后执行的全部过程:

  1. 浏览器获取输入的域名 www.baidu.com
  2. 浏览器向DNS请求解析 www.baidu.com 的IP地址
  3. 域名系统DNS解析出百度服务器的IP地址
  4. 浏览器与该服务器建立TCP连接(默认端口号80)
  5. 浏览器发出HTTP请求,请求百度首页
  6. 服务器通过HTTP响应将首页文件发送给浏览器
  7. TCP连接释放
  8. 浏览器将首页文件进行解析,并将WEB页展示给用户

3、涉及的协议

  1. 应用层:HTTP、DNS
  2. 传输层:TCP、UDP
  3. 网络层:IP(IP数据包传输和路由选择)、ICMP(提供网络传输过程中的差错检测)、ARP(将本机的默认网关IP地址映射为MAC地址)

4、HTTP协议的特点,与HTTPS的区别

HTTP是超文本传输协议,是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型,特点主要有:

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记

  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间

  4. 无状态:HTTP协议是无状态协议。协议对于事务处理没有记忆能力。

    • 缺点:每次发送请求的时候都需要不断的重新传输数据。
    • 优点:server服务器只是作为应答,时效速度比较快。

    为了解决上述无状态的特性:可以使用cookie 和 session ,来支持客户端和服务端的动态交互

  5. 支持B/S及C/S模式

HTTPS是http over ssl(Secure Socket Layer),简单讲就是http的安全版本,在http的基础上通过传输加密和身份认证保证了传输过程中的安全性。你通常访问的网站大部分都是http的,最简单的方法可以看看网址是以 http:// 开头还是以 https:// 开头

http不安全,主要是因为它传输的是明文内容,也不对传输双方进行身份验证。只要在数据传输路径的任何一个环节上,都能看到传输的内容,甚至对其进行修改。例如一篇文章“攻下隔壁女生路由器后,我都做了些什么”中,很多攻击的环节,都是通过分析http的内容来进行。而在现实生活中呢?你很有可能泄露你的论坛高级会员账号/密码,游戏VIP账号/密码,隐私的聊天内容,邮件,在线购物信息等等。

https之所以安全,是因为他利用ssl/tls协议传输。

HTTPS耗性能么?

三次握手的时候耗,建好连接之后就不太耗了。按照目前加密强度的计算开销,服务器支撑握手性能会下降6-8倍,但是如果建立好连接之后,服务器就几乎可能撑住打满网卡的https流量了。所以连接复用率的提升和计算性能的优化都是重点

5、三次握手四次挥手原理及原因

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

三次握手

为了准确无误的将数据发送到指定IP处,TCP协议采用了三次握手的策略,如下步骤所示:

  1. 客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器的确认

  2. 服务器端在收到SYN的数据包后,必须确认SYN,即自己发送的ACK标志,同时,自己也将会向客户端发送一个SYN标志

  3. 客户端在接收到服务器短的SYN+ACK包后,自己会向服务器发送ACK包,完成三次握手。那么客户端和服务器正式建立了连接,开始传输数据。

四次挥手

四次挥手是用来断开服务器和客户端之间的通信的,之所以要断开连接,是因为TCP/IP协议是要占用端口号的,而计算机的端口却是有限的,不进行断开的话,势必会造成计算机资源的浪费。

  1. 在整个通信的过程中,谁先发起请求,谁就是客户端。当客户端的数据传输到尾部时,客户端向服务器发送带有FIN标志的数据包,使其明白自己准备断开通信了。

  2. 因为TCP的通信是使用全双工通信的WebSocket,所以在断开连接的时候也应该是双向的;当服务器收到带有FIN标志的数据包时,其必不会直接发送FIN标志断开通信的请求,而是先发送一个带有ACK标志的应答信息,使客户端明白服务器还有数据要进行发送。

  3. 当服务器的数据发送完成后,向客户端发送带有FIN标志的数据包,通知客户端断开连接。

  4. 当客户端收到FIN后,担心网络上某些不可控制的因素导致服务器不知道他要断开连接,会发送ACK进行确认,同时把自己设置成TIME_WAIT状态并启动定时器,在TCP的定时器到达后客户端并没有接收到请求,会重新发送;当服务器收到请求后就断开连接;当客户端等待2MLS(两倍报文最大生存时间)后,没有收到请求重传的请求后,客户端这边就断开连接,整个TCP通信就结束了。

三次握手为什么不能改成两次握手?

三次握手中的每一次都是必须的。如果是两次握手,在第二次结束后,服务器并不能保证客户端已经收到了第二次的请求,如此一来的话,服务器会一直保存着这个通信过程,因为TCP通信都是要占用端口的,造成了一定的资源浪费。所以,就一定要让客户端来发送ACK的确认请求

关闭的时候为什么是四次挥手?

四次挥手不能像三次握手一样,三次握手可以将ACK+SYN一起发送,ACK用于确认信息,SYN却是用来建立联机的;四次挥手中的ACK是不能和FIN一起发送的,ACK只是告诉客户端确认我收到了,等我将数据发送完毕之后会向其发送FIN标志,所以四次挥手是不能够改变的。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可能最后一次ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

TCP和UDP的区别

  • TCP的优点:可靠,稳定。TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。
  • TCP的缺点:慢,效率低,占用系统资源高,易被攻击。TCP在传递数据之前,要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击
  • UDP的优点:快,比TCP稍安全。UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood 攻击。。。
  • UDP的缺点:不可靠,不稳定。因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

基于上面的优缺点,各自的应用场景

  • 什么时候应该使用TCP:当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。在日常生活中,常见使用TCP协议的应用如下:浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 …………
  • 什么时候应该使用UDP:当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……

6、DNS具体解析原理

DNS(Domain Name System) 是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP 网络,它从事将主机名或域名转换为实际IP地址的工作。DNS就是这样一位“翻译官”,它的基本工作原理可用下图来表示:

  1. 在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有就先调用这个IP地址映射完成域名解析

  2. 如果hosts里没有这个域名映射,则查找本地DNS解析器缓存是否有这个网址映射关系,如果有直接返回,完成域名解析。

  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至“根DNS服务器”,“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址qq.com给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直到找到www.qq.com主机。

  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级 DNS 服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。不管是本地 DNS 服务器用是是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。

7、通俗的表达整个流程让小白用户理解

普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端客户端内部也是浏览器实现的)。

Web服务器的工作原理可以简单地归纳为:

  • 客户机通过TCP/IP协议建立到服务器的TCP连接

  • 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档

  • 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端
  • 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果

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