浏览器输入url后发生了什么
2021-02-05 07:14
标签:请求 ssl rdl 移动 分组 头部 等待队列 skyline git 之后从DNS服务器中获得域名对应的ip地址 当浏览器得到了目标服务器的 IP 地址,以及 URL 中给出来端口号(http 协议默认端口号是 80, https 默认端口号是 443),它会调用系统库函数socket ,请求一个 TCP流套接字,对应的参数是 AF_INET/AF_INET6 和 SOCK_STREAM 。 操作系统的任务: 集成网卡的任务(实现以太网协议,负责组装成帧、串行/并行转换、缓存数据:由于网络上的数据率和计算机总线上的数据率并不相同,因此在网卡中必须装有对数据进行缓存的存储芯片): 再通过调制解调器把数字信号转换成模拟信号从网线发出 如上图,比特流在路由器中剖成ip数据报之后再提取出目标ip地址,并根据分组转发协议进行查找: 通过分组转发协议,得到相应的路由器或主机ip后,不是填入ip数据报,而是进行ARP将该ip地址转化为物理地址。之后将物理地址包入以太网帧,转成比特流之后继续发送。 在路由器之间移动的过程中可能会经过一些AS,顺便一提AS的路由选择协议有RIP(UDP)和OSPF(IP),AS间是BGP(TCP) (epoll的具体流程可以看这里epoll的实现原理) 这一部分将会在后面不停进行以传输TCP segment 这里你的http服务器(可以是nginx也可以是tomcat)就会开始接受socket连接(也就是tcp连接,socket是对tcp和udp的封装),这里如果是tomcat,源码中会有 .accept 和 .register 的调用,在经过三次握手之后 如果你是采用https,则会创建ssl连接: 连接完成之后继续接收从socket拿到的数据,如果是https,后续的数据都要进行简单的解密(加密方式是使用前面获得的随机密码串作为密码参数进行对称加密) 之后就是http服务器对传来的数据进行封装,封装成http请求类等。 总结一下,这里这些操作包括ssl连接主要是http服务器对socket的调用(如Java写的Tomcat调用的accept、register、select等,为NIO部分的知识),并封装http或https对象,感兴趣可以看一下我的这篇源码解析:jdk下httpserver源码解析,https部分详情请见:Https原理 之后就是容器的各种封装了,下图是Tomcat的架构图,这里会送到最右边的Container封装成servlet。这里本来可以写不少东西,不过我没研究过,就不多说了。 前面的Connector部分的解析的话可以看这里:Tomcat中对NIO的应用 之后就是SpringMVC对Servlet的封装了,具体就不细说了,之后就是常见的SpringMVC的流程了: 至于返回到浏览器的流程就大同小异了 本文是我当前水平对这个问题所能做到的最详细的解答了,后续如果有更加深入(例如我一直没看的linux内核)的理解的话再更新吧。 因为我是后端的,就不提浏览器解析部分了,感兴趣的可以看这里:What-happens-when,里面还有从键盘按键中断开始聊起的,还蛮有意思的。 最后惯例附一图:太棒了,我逐渐理解一切.jpg(顺便佩服找不到实习还花了几天水博客的自己) 浏览器输入url后发生了什么 标签:请求 ssl rdl 移动 分组 头部 等待队列 skyline git 原文地址:https://www.cnblogs.com/fatmanhappycode/p/12940214.html从url到ip地址
dns解析
hosts
里找到,则将会向 DNS 服务器发送一条 DNS 查询请求(UDP,53端口)
ARP
广播发送ARP请求,单播发送ARP响应。递归查询迭代查询
从tcp数据报到比特流
从路由器到路由器
分组转发协议
从网线到Socket
从socket到http或https
从http到servlet
从servlet到springMVC框架
上一篇:JSP显示新闻