网站访问流程
1. 解析出主机名和端口号
2. 查询浏览器或者操作系统的DNS缓存,如果命中缓存,则使用缓存的IP地址,否则,使用DNS解析出IP地址
- 在DNS协议中,先向本地DNS服务器求助(一般是路由器),希望从本地DNS服务器那里得到主机名对应的IP,得到就好,得不到还得向更高层次的DNS服务器求助,直到解析出主机名对应的IP。
3. 使用IP, ARP, RARP, OSPF协议获取目标IP的MAC地址(唯一标示机器的地址),知道MAC地址后才能进行TCP连接
4. 进行TCP的3次握手
- 在TCP协议中,建立TCP需要与目标服务器握手三次,你先告诉服务器你要给服务器发东西(将IP分组的SYN位设置为1),服务器应答你并告诉你它也要给你发东西(将IP分组的SYN、ACK位设置为1),然后你应答服务器(将IP分组的ACK位设置为1),总共来回了3次,称为3次握手。(可使用wireshark抓包分析)
5. 建立了TCP连接后,如果使用HTTPS,则需要进行SSL握手,沟通加密参数(如,SSL版本)以及交换秘钥,握手完成后,报文会在发送给TCP之前在SSL层进行加密。
6. 建立了TCP连接便可以发送HTTP请求了,HTTP请求通过TCP协议发到Server端
7. Server端一般会有Nginx之类的WebServer,在收到HTTP请求后,查看HTTP请求Header的Host字段判断是请求的哪个web app
- 如果有多个app的话),然后nginx会做一些验证或者黑名单拦截之类的操作,然后直接处理静态资源请求,其他请求分配给后端worker进程(由WSGI服务器创建,比如Gunicorn,Gunicorn使用pre-fork模式提前开启多个web app worker进程用来处理请求),Gunicorn将HTTP请求转为WSGI请求,由web框架如Django, Flask处理请求,返回响应,返回结果使用WSGI协议处理后返回给Nginx,Nginx将结果通过HTTP响应返回给浏览器,浏览器渲染响应。