写这篇文章的目的:看完了图解HTTP,系统的梳理一下整个流程。就想到了这个题目,浏览器输入url回车后发生了什么。参考了很多文章,整理了一下,作自己理解。
浏览器回车后:
无CDN情况下: 域名解析,获取目标服务器IP地址 ①浏览器向本地DNS服务器请求对该域名的解析。 ②本地DNS服务器中如果缓存有这个域名的解析结果,则继续进行。 ③本地DNS服务器中如果没有关于这个域名的解析结果的缓存,则以递归方式向整个DNS系统请求解析,获得应答后将结果反馈给浏览器。TCP连接,三次握手HTTPS四次握手、HTTP封装请求(应用层包)发送请求(TCP段)(网络层)路由寻址 (忽略链路层和物理层)服务器响应客户端关闭连接,TCP四次挥手 有CDN情况下 ①经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。 ②CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。 ③用户向CDN的全局负载均衡设备发起内容URL访问请求。 ④CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。 ⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。 ⑥全局负载均衡设备把服务器的IP地址返回给用户。DNS(Domain Name System):域名转IP地址
DNS具有两层含义:
一个由分层的DNS服务器实现的分布式数据库;一个允许主机查询分布式数据库的应用层协议。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器以下图的层次结构组织起来。
DNS缓存: 从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存(hosts文件),路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
查询过程
查询浏览器缓存查询hosts文件本地DNS解析器缓存本地DNS服务器(TCP/IP参数中设置的DNS服务器)如果本地DNS服务器设置了转发模式,就会把请求向上一级转发;未设置转发,就直接把请求发送到跟DNS服务器,向下查询;最后都把结果返回给本地DNS服务器,它再返回给客户端。DNS负载均衡 DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。 CDN(Content Delivery Network)就是利用DNS的重定向技术。
套接字: 在应用层和传输层之间,更准确地讲是在浏览器进程和操作系统提供的TCP服务程序之间,有一个很重要的东西叫做套接字(Socket)。 套接字是对TCP和UDP的封装,它的作用是实现传输层的多路复用和多路分解。 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据(http 协议默认端口号是 80, https 默认端口号是 443)。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。
建立TCP连接,三次握手: TCP是面向连接的,在实际发送数据之前,客户端和服务器需要建立起一个TCP连接。
客户端发送SYN标志的数据包请求连接当服务器收到SYN请求后,如果其所请求的端口号正在等待连接,则会为这一条TCP连接分配资源,并发送一个SYN/ACK报文段作为应答。客户端机收到SYN/ACK报文段后,客户机回传一个带ACK标志的数据包,此时握手结束。数据包在第三次握手时发送。此时连接已经建立起来,请求也被传送到客户端主机的网络层。
IP路由选择是逐跳(hop-to-hop)进行的。IP并不知道完整路径。 所有的IP选择只为数据报提供下一站的IP地址。 路由选择机制的基础是在每一台主机和路由器里都存储着一张路由表。路由表的每一项包含了目的主机IP地址、下一跳路由器(或主机)的IP地址、相对应的网络接口以及其他必要的信息。
发送响应报文,同样的传输路径发送至客户端。
至此,关于通信过程有个大概了解了,接下来弄些小问题
根据Restful的定义,GET用来获取资源,POST用来更新资源。这是语义上的区别。
GET把参数会附在请求行中,以?分割URL和传输数据,多个参数用&连接。 POST把参数放在请求体中。HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 但实际上(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。POST的安全性要比GET的安全性高。等但实际上HTTP是建立在TCP连接上的,所发送的都是TCP数据包,并不本质区别,但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
而真正的区别在于:GET产生一个TCP数据包;POST产生两个TCP数据包。 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。参考: 99%的人都理解错了HTTP中GET与POST的区别
Transmission Control Protocol传输控制协议 User Datagram Protocol用户数据报协议
UDP:单个数据报,不用建立连接,简单,不可靠,会丢包,会乱序; TCP:流式,需要建立连接,复杂,可靠 ,有序。
UDP:
无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。数据报模式不保证可靠交付,因此主机不需要为此复杂的连接状态表面向报文的,意思是 UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界,在添加首部后向下交给 IP 层。没有阻塞控制,因此网络出现的拥塞不会使发送方的发送速率降低。支持一对一、一对多、多对一和多对多的交互通信,也即是提供广播和多播的功能。首部开销小,首部只有 8 个字节,分为四部分。TCP:
面向连接,流模式可靠的,所有会消耗资源进行连接等一对一的参考: UDP 和 TCP 的不同 TCP与UDP的区别
文章参考了很多东西,梳理了一下整个通信流程,有个大概框架了解,之后遇到某方面知识再往里面填。
参考: 前端经典面试题: 从输入 URL 到页面加载发生了什么? 在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤? what happens when you type in a URL in browser [closed] 当···时发生了什么? FEX:从输入 URL 到页面加载完成的过程中都发生了什么事情?
网络模型 TCP/IP协议栈及OSI参考模型详解DNS解析过程: 什么是 DNS DNS解析的过程是什么,求详细的?CND 百度百科:CDN套接字 网络套接字 Socket 百度百科:socket通信流 TCP/IP 协议如何处理数据通信