例如:在浏览器地址栏输入www.taobao.com,按下回车,发生了什么?
1. 浏览器会进行DNS域名解析,拿到域名对应的服务器ip地址,再用该ip去访问web服务器
DNS域名解析的过程:
1.将待解析的域名放入DNS请求报文,以UDP报文段方式发给本地域名服务器
2.若本地域名服务器有查找到域名映射的信息,则把对应的IP地址放在响应报文中返回
3.若本地域名服务器没有查找到映射的信息,则会去根服务器找
4.若还没有找到,这里就有两种方式,由根DNS服务器迭代查找或者递归查找
5.直到找到为止
各种DNS服务器的请求顺序:本地DNS服务器、根DNS服务器、顶级DNS服务器、权威DNS服务器
使用DNS协议去层层解析,当然这中间有缓存,可能不会费太多时间就能拿到结果,别忘了互联网上还有另外一个重要的角色CDN,它也会在DNS解析过程中“插一脚”。DNS解析可能会给出DNS服务器的IP之地,这样你拿到的就会是CDN服务器而不是目的网站的实际地址,
因为CDN会缓存网站的大部分资源,比如图片、css样式表、所以有的HTTP请求就不需要再发到目的服务器,CDN就可以直接响应你的请求,把数据发给你
由Java等后台服务动态生成的页面属于“动态资源”,CDN无法缓存,只能从目标网站获取。于是你发出的HTTP请求就要开始在互联网上的“漫长跋涉”,经过无数的路由器、网关、代理,最后到达目的地。
2. 首先会和web服务器进行tcp的三次握手建立tcp连接
tcp三次握手的过程(建立连接):
1.客户端发送一个携带SYN标志位的包,请求建立连接
2.服务器响应一个携带SYN和ACK标志位的包,同意建立连接
3.客户端再发送一个携带ACK标志位的包,表示连接成功,开始进行数据传输
问:tcp建立连接为什么不采用两次握手?
之所以采用三次握手,而不是两次握手是有深层次原因的,因为两次握手不可靠,举个简单的例子,客户端发送了一个请求建立连接的包,由于网络原因迟迟没有抵达服务器,客户端只得再发一次请求,这次成功抵达并完成了数据传输。过了一段时间,第一次延迟的请求也到了服务器,服务器并不知道这是无效请求,依旧正常响应,如果是两次握手,那么这个时候就会建立一条无效的连接,如果是三次握手,那么客户端就能够丢弃这条连接,避免了无谓的网络开销。
3. 连接建立成功后,浏览器会发送http的get请求
4. 服务器收到请求并给予响应,返回请求的数据
5. 浏览器拿到数据并进行解析、渲染
浏览器渲染页面的过程:
1.解析HTML生成DOM树
2.解析CSS生成CSSOM规则树
3.将DOM树和CSSOM规则树合并在一起生成渲染树
4.遍历渲染树开始布局,计算每个节点的位置大小信息
5.将渲染树的每个节点绘制到屏幕
6. 浏览器和服务器进行tcp的四次挥手,断开连接
tcp四次挥手的过程(断开连接):
1.客户端发送一个携带FIN标志位的包,请求断开连接
2.服务器响应一个携带ACK标志位的包,同意客户端断开连接
经过1和2,客户端不会再向服务器发送数据了,服务器如果有数据要发送还会继续向客户端发送数据
3.服务器再发送一个携带FIN标志位的包,请求断开连接
4.客户端最后发送一个携带ACK标志位的包,同意服务器断开连接
问:为什么是四次挥手,而不是三次挥手?
当要断开连接时,通信两端就会进行四次挥手。由于连接上双向的,所以客户端和服务器都要发送FIN标志位的包,才算彻底断开连接,四次挥手的目的是确保双方都没有数据要发送,然后断开连接。
TCP与UDP的区别?可以用UDP实现像TCP那样的可靠连接吗?
tcp:tcp是一种有连接的、可靠的通信协议
udp:udp是一种简单的、不可靠的通信协议,只负责将数据发出,但不保证它们能否到达目的地
udp之所以不可靠,是由于以下几个原因:
1.udp没有顺序控制,所以当出现数据包乱序到达时,没有纠正功能
2.udp没有重传控制,所以当数据包丢失时,也不会重发
3.udp在通信开始时,不需要建立连接,结束时也不用断开连接
4.udp无法进行流量控制,拥塞控制等避免网络拥堵的机制
日常生活中的语音聊天和在线视频使用UDP作为传输协议的比较多,因为即使丢几个包,对结果也不会产生太大影响
可以用UDP实现像TCP一样的功能吗?
可以,UDP不可靠主要是因为没有TCP的那些机制,只要给UDP加上TCP的那些机制,UDP一样可以实现可靠传输,在应用层上加这些机制