从输入网页到显示
从输入网址到显示网页
URL 解析
输入网页首先进行的是 URL 解析 例如输入如下 URL ( URL 使用 unicode 编码)
可知请求的是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 报文。