当你在浏览器输入一个网址后,页面是怎么出现的呢?这中间经过了哪些过程?
比如:http://shop.com/goods.php?id=101, 访问一个商品的详细信息。
客户端请求发送
首先会根据 URL 中的域名,进行 DNS(Domain Name System)域名解析,解析出 IP 地址,方便后续在网络层中通过 IP 协议找到对方的地址;
然后由浏览器发起一个基于 HTTP 协议的请求;
接下来进行网络传输:
- 为了传输方便,在传输层(TCP 协议)将 HTTP 请求进行分割,然后转发给网络层
- 在网络层(IP 协议),通过 IP 地址找到服务器的 MAC 地址
- 通过链路层,将该请求发送出去
服务器端接收请求
首先是接收请求:
- 服务器在链路层接收到客户端浏览器发送的请求后,一层层的向上传递
- 传递到网络层,然后再传输层通过(TCP 协议)进行将分割的数据进行组合
- 最后传递到应用层
HTTP 协议的默认端口为 80(HTTPS默认端口为443),也就是该请求会被发送到服务器的 80 端口。
服务器的 80 端口一般由 web 服务器软件(中间件,Apache,Nginx, IIS, Jboss,weblogic 等)监听。这里以 Apache 为例:
- 当 Apache 接收到请求后,根据 url 中的路径(这里是 goods.php),找到对应的处理代码,并把 url 中的参数和报文传递给对应的代码;
- 代码文件接收到请求后,就调用对应的函数来处理;
- 函数解析出url中的参数,作为查询的一个参数;
- 在函数中连接数据库,并根据参数中的商品 id 查询具体的商品信息;
- 数据库返回对应的数据;
- 函数对数据库返回的商品数据进行加工处理,封装成对应格式的数据(HTML 或 JSON),然后返回给 Apache;
- Apache 把数据作为 HTTP 请求的响应按原路返回给客户端。
网络传输部分与客户端发送过程相似。
客户端处理响应
客户端(浏览器或者App)接收到数据后,进行数据解析,并将服务端返回的数据按照 UI 的要求进行展示。
于是,我们就看到了服务器返回的数据。