从输入网页到显示

从输入网址到显示网页

URL 解析

输入网页首先进行的是 URL 解析 例如输入如下 URL ( URL 使用 unicode 编码)

https://mrzzzz1.github.io/2023/03/07/%E4%BD%BF%E7%94%A8maven%E7%AE%A1%E7%90%86java%E9%A1%B9%E7%9B%AE/index.html

可知请求的是mrzzzz1.github.io 域名下的 /2023/03/07/使用maven管理java项目/index.html 文件。

若域名后没有文件呢?如 mrzzzz1.github.io 或 URL 以 / 结尾,例如

这是在请求什么?

这是在请求根目录下设置的默认文件,也就是 /index.html 或 /default.html 文件,取决于服务器的设置。

产生 HTTP 请求

知道了用户想要什么,浏览器就会根据这些信息封装 HTTP 请求,请求有很多种,最常见的是 get 和 post

将请求封装成 HTTP 数据包后,浏览器要将数据包交给操作系统,请它发送给 web 服务器,但在这之前,还需要获取服务器域名对应的 IP 地址

DNS 域名解析

域名解析即找到域名对应的 IP 地址

域名的层级关系

在域名中,不同级别的域名之间以 . 分隔,越靠右级别越高,形成一颗树。

如上述域名 mrzzzz1.github.io ,其实在 io 后省略了一个 . ,这个点是根域,.io 为顶级域,.github 为二级域,mrzzzz1 为三级域名。

首先客户端会查看缓存(浏览器缓存 –> 操作系统DNS缓存 –> hosts 文件)中是否有所需域名和 IP 对应的缓存,若没有,则向本地 DNS 服务器请求,若本地 DNS 服务器存有则直接放回,若没有,则由本地 DNS 服务器向根服务器询问,根服务器告知对应顶级域名服务器 IP 地址,本地服务器在向顶级域服务器询问,顶级域名服务器在告诉本地 DNS 服务器权威服务器地址,依次往下询问,采用只指路不带路的方式减少上层服务器负载。

TCP段封装

浏览器调用 Socket 函数,将要绑定的源 IP ,目标 IP , 源端口,目标端口传给操作系统,操作系统为数据包封装 tcp 头部,形成 tcp 段。

由于 一个 TCP 段长度固定,数据包可能被分为多个段。

  • MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
  • MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。

TCP头内容

  • 16位源端口号和16位目的端口号
  • 32位序号:一次 TCP 通信过程中某一个传输方向上的字节流的每个字节的编号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。
  • 32位确认号:用来响应 TCP 报文段,给收到的 TCP 报文段的序号加1,三握时还要携带自己的序号。
  • 4位头部长度:标识该 TCP 头部有多少个4字节,共表示最长15*4=60字节。同 IP 头部
  • 6位保留。6位标志。URG(紧急指针是否有效)ACK(表示确认号是否有效)PSH(提示接收端应用程序应该立即从TCP接收缓冲区读走数据)RST(表示要求对方重新建立连接)SYN(表示请求建立一个连接)FIN(表示通知对方本端要关闭连接)
  • 16位窗口大小:TCP 流量控制的一个手段,用来告诉对端 TCP 缓冲区还能容纳多少字节。
  • 16位校验和:由发送端填充,接收端对报文段执行 CRC 算法以检验 TCP 报文段在传输中是否损坏。
  • 16位紧急指针:一个正的偏移量,它和序号段的值相加表示最后一个紧急数据的下一字节的序号

三次握手

在将数据发送给服务端之前,需进行 tcp 三次握手

  • 一开始,客户端和服务端都处于 CLOSE 状态,服务端开始监听某个端口,处于 LISTEN 状态

  • 客户端主动发起连接 SYN(Synchronize Sequence Numbers,同步序列编号),并告知之后处于 SYN-SENT 状态。

  • 服务端接收到 SYN 连接,返回 ACK(Acknowledge Character,确认字符),并且向客户端发起 SYN ,之后处于 SYN-RCVD 状态。

  • 客户端收到服务端发送的 SYN 和 ACK 之后,发送对 SYN 确认的 ACK,之后处于 ESTABLISHED 状态。

  • 服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。

    三次握手的作用

    • 确定客户端和服务端双方都具有发送和接收数据的能力。
    • 防止服务端收到客户端已失效的连接请求导致混乱。

封装 IP 报文

IP 模块为 tcp 段添加 IP 头部,生成 IP 报文。

未完待续…


从输入网页到显示
http://mrzzzz1.github.io/2023/03/08/从输入网页到显示/
作者
Mrzzzz1
更新于
2023年3月13日
许可协议