终于可以访问 Google 了

终于可以访问 Google 了

devna

经过上一篇域名的IP地址是怎么来的,浏览器得到了域名www.google.com对应的IP地址。接下来,浏览器就可以向 Google 服务器请求 Google 首页了,但在此之前,浏览器需要先生成一个 TCP 套接字,并与 Google 服务器建立 TCP 连接。

TCP三次握手

浏览器是通过 TCP 三次握手与 Google 服务器建立 TCP 连接的。

  1. TCP SYN

浏览器会通过套接字先生成一个TCP SYN报文段( TCP 首部中的 SYN 标志位设置为 1),目的端口80( HTTP 默认端口,HTTPS 默认端口为 443)。

TCP SYN报文段被放入 IP 数据报,目的地址为 Google 服务器的 IP 地址。

上述 IP 数据报被放入链路帧,目的地址为网关路由器的 MAC 地址。

最终链路层帧被发往网关路由器,网关路由器根据路由表将其转发到下一跳路由器,经过路由器的层层转发,最终帧会到达 Google 服务器。

2. TCP SYNACK

Google 服务器收到浏览器发来的 TCP SYN报文段,为该连接分配资源,生成一个新的连接套接字。接下来,连接套接字生成一个 TCP SYNACK 报文段(此时 TCP 首部中的 SYN 标志位仍为 1),其中包含服务器自己的 SYN 报文,以及对浏览器 SYN 的 ACK 报文,目的端口为浏览器请求的源端口(主机操作系统分配的随机端口)。

TCP SYNACK报文段被放入 IP 数据报,目的地址为浏览器所在主机的 IP 地址。

同样,IP 数据报被放入链路层帧,目的 MAC 为 Google 所在局域网的网关路由器 MAC 地址。该帧同样会经过路由器的层层转发,最终到达浏览器。

3. TCP ACK

浏览器收到 Google 服务器回的 TCP SYNACK,同样为该连接分配资源,并向服务器发送另外一个 ACK 报文(TCP 首部中 SYN 标志位被设为 0,因为此时连接已经建立)。

最后一次握手的 TCP ACK 报文段中可以携带浏览器到 Google 服务器的数据。

HTTP 请求与响应

TCP 连接建立后,浏览器就可以通过 TCP 连接发送 HTTP 请求给 Google 服务器了。

HTTP请求

为了得到 Google 首页,浏览器向 Google 服务器发出一个HTTP GET请求,请求URL为 www.google.com。

HTTP GET 请求被放入 TCP 报文段(可能是三次握手的最后一次 TCP ACK 报文,也可能是一个新的 TCP 报文),目的端口 80。

TCP 报文段被放入 IP 数据报,目的地址为 Google 服务器的 IP 地址。

IP 数据报被放入链路层帧,目的地址为网关路由器的 MAC 地址。

链路层帧被发往网关路由器,并经过路由器的层层转发,到达 Google 服务器。

HTTP 响应

Google 服务器收到浏览器发来的 HTTP GET 请求,生成一个 HTTP 响应,将 Google 首页的内容放入 HTTP 响应体中,沿原路发往浏览器。

浏览器收到服务器的 HTTP 响应后,从响应体中抽取出 Google 首页的 html,解析 html 并将其呈现给用户。

Report Page