这个问题在各个角度来看都有不一样的答案,在这里我在两个角度回答这个问题:
站在网络原理的角度
- 输入的URL会先触发DNS(先查看浏览器的缓存,在查看hosts文件,在查看DNS服务器);
- 构造 HTTP 协议的数据包,方法GET,URL输入的URL,浏览器会自动填上一些包头信息,接下来会将这个数据报交给传输层;
- TCP就会把这个数据构成一个TCP数据报(在构造这个包之前,已经进行了三次握手,具体握手流程可以参看之前的TCP十大特性),然后再将数据传给IP协议;
- IP协议就会构造一个IP数据报,此处要根据数据报的长度,以及MTU的限制,考虑是否进行分包,查路由表决定从哪一个端口转发,将数据交给数据链路层;
- 将数据构造一个以太网数据帧,源mac就是本机mac,目的mac根据上面IP确定的转发端口来决定(基于mac学习完成)
- 数据到达物理层,转换成光电信号或者电信号进行传输;
- 首先传输到下一台路由器上,路由器进行解析和分用(解析到传输层)NAT 路由选择 ,继续查路由表,把数据再次封装的,往下一个路由器设备上转发(在这里封装和分用和上边是一样的)
- 中间会经过若干个路由器转发的过程,最终到达目的服务器;
- 服务器就会进行分用。物理层把光电信号1转成二进制bit流,交给数据链路层;
- 数据链路层解析出其中的IP数据报交给网络层;
- 网络层可能需要组包(取决于第4步是否分包),解析出传输层数据交给传输层;
- TCP解析出其中的应用层数据,交给应用程序,返回ACK(确认序号、窗口大小、延时应答、捎带应答)在这里ACK也是一个TCP数据报,也会涉及到一系列的封装和分用过程;
- 服务器的应用程序读取数据,根据请求计算响应,得到一个html页面。把页面构造成一个HTTP响应报文,经过一系列的封装,分用,传输,最终回到客户端;
- 客户端浏览器把报文解析出来,渲染html,显示到浏览器上。
站在后端开发工程师的角度来看
在这里就不考虑网络通信的细节,我从应用层的角度来考虑:
- 请求百度首页,可能直接请求到达CDN服务器,就直接返回了,不需要真正访问百度的机房。(CDN 是网络运营商架设的服务器,百度就会吧一些常用的静态资源直接部署到CDN);
- 如果CDN上没有,请求可能会到达百度机房的反向代理服务器(缓存)
- 如果反向代理服务器也没有就会访问百度的应用服务器;
- 如果是一些更复杂的应用(百度搜索),要做的处理也就会更多。