浏览器访问一个网站全过程

网上关于这个话题的文章颇多,这里只是做个总结,理清思路!

  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响应返回给浏览器,浏览器渲染响应。

大致的处理过程如上,后续会不断订正,如果存在问题,请指出!

你可能感兴趣的:(浏览器访问一个网站全过程)