从输入网址到获得页面的过程 (越详细越好)?
- 浏览器查询 DNS,获取域名对应的 IP 地址: 具体过程包括浏览器搜索自身的 DNS 缓存、搜索操作系统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询等。对于向本地 DNS 服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
- 浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手;
- TCP/IP 链接建立起来后,浏览器向服务器发送 HTTP 请求;
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
- 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
请阐述 HTTP 跟 HTTPS 的区别
- 端口不同:HTTP 使用的是 80 端口,HTTPS 使用 443 端口;
- HTTP(超文本传输协议)信息是明文传输,HTTPS 运行在 SSL(Secure Socket Layer) 之上,添加了加密和认证机制,更加安全;
- HTTPS 由于加密解密会带来更大的CPU和内存开销;
- HTTPS 通信需要证书,一般需要向证书颁发机构(CA)购买;
Https的连接过程?
- 客户端向服务器发送请求,同时发送客户端支持的一套加密规则(包括对称加密、非对称加密、摘要算法);
- 服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥(用于非对称加密),以及证书的颁发机构等信息(证书中的私钥只能用于服务器端进行解密);
- 客户端验证服务器的合法性,包括:证书是否过期,CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配;
- 如果证书受信任,或者用户接收了不受信任的证书,浏览器会生成一个随机密钥(用于对称算法),并用服务器提供的公钥加密(采用非对称算法对密钥加密);使用Hash算法对握手消息进行摘要计算,并对摘要使用之前产生的密钥加密(对称算法);将加密后的随机密钥和摘要一起发送给服务器;
- 服务器使用自己的私钥解密,得到对称加密的密钥,用这个密钥解密出Hash摘要值,并验证握手消息是否一致;如果一致,服务器使用对称加密的密钥加密握手消息发给浏览器;
- 浏览器解密并验证摘要,若一致,则握手结束。之后的数据传送都使用对称加密的密钥进行加密
总结:非对称加密算法用于在握手过程中加密生成的密码;对称加密算法用于对真正传输的数据进行加密;HASH算法用于验证数据的完整性。
客户端 TIME_WAIT 状态的意义是什么?
第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。
MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
什么是零窗口(接收窗口为0时会怎样)?
如果接收方没有能力接收数据,就会将接收窗口设置为0,这时发送方必须暂停发送数据,但是会启动一个持续计时器(persistence timer),到期后发送一个大小为1字节的探测数据包,以查看接收窗口状态。如果接收方能够接收数据,就会在返回的报文中更新接收窗口大小,恢复数据传送。
第三次握手中,如果客户端的 ACK 未送达服务器,会怎样?
- Server 端:
- 由于 Server 没有收到 ACK 确认,因此会重发之前的 SYN+ACK(默认重发五次,之后自动关闭连接进入 CLOSED 状态),Client 收到后会重新传 ACK 给 Server。
- Client 端,两种情况:
- 在 Server 进行超时重发的过程中,如果 Client 向服务器发送数据,数据头部的 ACK 是为 1 的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
- 在 Server 进入 CLOSED 状态之后,如果 Client 向服务器发送数据,服务器会以 RST 包应答。
什么是四次挥手?
- 第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态;
- 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
- 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态;
- 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。
TCP如何保证传输的可靠性
- 1、应用数据被分割成 TCP 认为最适合发送的数据块。
- 2、超时重传:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
- 3、TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
- 4、校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
- 5、TCP的接收端会丢弃重复的数据。
- 6、流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
- 7、拥塞控制:当网络拥塞时,减少数据的发送。
TCP 建立连接可以两次握手吗?为什么?
不可以。有两个原因:
- 首先,可能会出现已失效的连接请求报文段又传到了服务器端。 client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达 server。本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求。于是就向 client 发出确认报文段,同意建立连接。假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了。由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了。采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。
- 其次,两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号。
Session与Cookie的区别?
- Session是服务器端保持状态的方案,Cookie是客户端保持状态的方案
- Cookie保存在客户端本地,客户端请求服务器时会将Cookie一起提交;Session保存在服务端,通过检索Sessionid查看状态。保存Sessionid的方式可以采用Cookie,如果禁用了Cookie,可以使用URL重写机制(把会话ID保存在URL中)。
简述 HTTP 常见状态返回码
2xx状态码:操作成功。200 OK 3xx状态码:重定向。301 永久重定向;302暂时重定向 4xx状态码:客户端错误。400 Bad Request;401 Unauthorized;403 Forbidden;404 Not Found; 5xx状态码:服务端错误。500服务器内部错误;501服务不可用
什么是NAT (Network Address Translation, 网络地址转换)
用于解决内网中的主机要和因特网上的主机通信。由NAT路由器将主机的本地IP地址转换为全球IP地址,分为静态转换(转换得到的全球IP地址固定不变)和动态NAT转换。
简述DNS解析的过程
- 客户端向本地DNS服务器发出递归查询请求
- 本地DNS服务器向根域名服务器发出迭代查询请求,得到顶级域名服务器的地址
- 本地DNS服务器向顶级域服务器发出请求,得到权威域名服务器的地址
- 本地DNS服务器向顶级域服务器发出请求,得到域名对应ip地址
- 本地DNS服务器返回域名的ip地址给客户端 可能出现问题的点:
- 网络连接
- 浏览器DNS缓存
- 系统DNS缓存
- 路由器DNS缓存
- ISP DNS缓存
排查方法: 1. 检查网络连接:ping等 2. 检查DNS解析:dig