https://github.com/skyline75489/what-happens-when-zh_CN/blob/master/README.rst
域名解析——TCP三次握手——IP层发起http请求——服务器响应http请求,返回结果——浏览器解析html,请求具体的资源文件——浏览器对页面进行渲染
DNS解析
1、先找浏览器自身的dns缓存(chrome://chrome-urls),1000条,是否过期
2、查找操作系统的dns缓存,通过命令行ipconfig /allcompartments /displaydns
3、本地host目录 ,优先于dns服务器,通过手动配置来进行某些ip地址的映射,是dns解析之前的地址解析方式,现在的dns是对hosts的统一管理C:\windows\System32\drivers\etc
4、向本地DNS服务器发起域名解析请求,从右往左解析,首先一般是运营商提供的dns服务器(通过UDP协议向DNS的53端口发起递归请求),迭代查询的步骤是
- 本地向区域服务器发送查询,区域服务器返回给本地,下一次向根服务器进行查找
- 本地向根服务器进行查找,根服务器返回给本地,下一次向顶级服务器进行查找
- 本地向顶级服务器进行查找,顶级服务器返回给本地,下一次向 目标区域服务器进行查找
- 本地向目标区域服务器进行查找,区域服务器将解析出来的ip地址告诉本地服务器,本地服务器进行缓存和返回
两种DNS查询方式:
- 分布式查询:在用户客户机维护静态映射表,随着网络的发展越来越难以维护
- 集中式查询:去DNS服务端查询,一般是运营商的服务端,这时该DNS服务端作为DNS客户机去DNS层级表中进行递归查询,而在服务器之间进行迭代查询
1.递归查询是最常见的查询方式,地区DNS服务器将代替提出请求的用户进行域名查询,若DNS服务器不能直接回答,则该DNS服务器将作为客户机在域各树中的各分支的上下进行递归查询,最终将返回查询结果给DNS客户机,在域名服务器查询期间,DNS客户机将完全处于等待状态,其他域名服务器进行查询,是节约本地服务器性能的查询方式;
2.迭代查询又称重指引,当DNS客户机使用迭代查询时其他服务器,其他域名服务器查询不到,则返回一个最佳的查询点提示或主机地址给DNS客户机进行下一次查询,若此最佳的查询点中包含需要查询的主机地址,则返回主机地址信息,若此时其他服务器不能够直接查询到主机地址,则DNS客户机按照返回提示的指引依次查询,直到服务器给出的提示中包含所需要查询的主机地址为止,一般每次指引都会更靠近根服务器,查寻到根域名服务器后,则会再次根据提示向下查找,也就是说每次查询都需要DNS客户机完成
5、url的补全机制,比如说淘宝会将所有可能的相关的域名都买下来,然后当发出dns解析的时候,会将这些域名都会被重定向到www.taobao.com这个正确的域名,当然除了这种情况,在浏览器中会有一些补全的优化机制,所以会发现在浏览器上能访问一些不全或部分错误的请求,是浏览器做了补全和纠正的工作
6、浏览器一直都是默认的http协议和80端口,对于只接受https请求的服务器,之前的操作是先发送http请求,又服务端返回定向到https请求,这样可能会让服务器受到攻击,所以现在的方案是浏览器会维护一个列表,记录了需要https请求的服务器,直接进行https请求(443),如果不匹配则发送HTTP请求(80)
更多:https://blog.csdn.net/hydro88/article/details/87934150
7.nds服务器的负载均衡,一般来说会有多个域名到ip地址的映射
优点: dns服务器会根据复杂均衡算法选择一个ip地址返回,通过物理分析可以分配近距离ip地址,免去了服务器处理的压力,作为一个价格低,性能还可以的方式被广泛使用;
缺点:多级缓存,导致同步慢,短轮询同步导致流量损失,无法知晓服务器的负载情况,所以现在一般dns指向的服务器会进行负载均衡服务器的嵌套,再进行一次分配到达真正的服务器。
https://blog.csdn.net/p312011150/article/details/82979568
TCP三次握手
传输层的TCP协议是端到端的可靠的面向连接的协议,首先服务端会启动服务Listened状态,准备接受请求
1.客户端起始状态Closed,发出SYN=1 seq=x,发出后状态变为SYN-SENT
2.服务端收到后 返回确认信息SYN=1 ACK=1 seq=y ack=x+1, 发出后状态变为SYN-RCVD
3.客户端收到确认后发起真正的http请求 ACK=1 seq=x+1 ack=y+1,客户端状态变为ESTABLISHED
4.服务端收到确认后,状态变为ESTABLISHED,建立TCP连接成功
- 连接成功后可以调用accept获取该连接,连接失败的话,有可能遭遇SYN泛洪攻击,攻击者向服务器发送很多SYN的请求连接,而不进行确认,这会导致半连接的产生,服务器这时就不能连接真正的请求,所以当这种情况发生,不进行重传而是直接返回RST响应,回到CLOSED状态
5.服务端给浏览器返回需要的html文件
6.浏览器进行解析,并下载所需的css js 图片资源包,进行渲染
7.四次挥手断开tcp连接
TCP四次挥手
1、Client发起断开请求FIN=1 seq=w 状态变为FIN-WAIT1
2、Server收到后立即返回ACK=1 seq=v ack=w+1 发出后状态变为CLOSED-WAIT
3、Client收到确认信息 状态变为FIN-WAIT2
4、Server发送完毕后发起断开 FIN=1 ACK=1 seq=u ack=w+1 发出后状态变为LAST-ACK
5、Client收到后发出确认关闭 ACK=1 seq=w+1 ack=u+1 后进入TIME-WAIT状态,2msl后进入CLOSED状态
6、Server收到确认后 进入CLOSED状态
注:等待2ms是为了防止server收不到client最后发的确认消息,而导致半连接的请求未关闭,会导致资源的溢出,甚至残留的数据错误。
参考:https://blog.51cto.com/linux5588/1351007