网络相关基础
TCP/IP网络模型
应用层
含义:应用层是应用程序的入口,我们的电脑或手机使用的软件都是在应用层实现的。
应用层协议:HTTP,HTTPS,FTP,Telenet,DNS等。
传输层
应用层的数据包会传给传输层,传输层是为应用层提供网络支持的。
传输层协议:TCP UDP等
TCP与UDP
TCP协议:全称传输控制协议,大部分应用使用的都是传输层协议。TCP具有流量控制,超时重传,拥塞控制等,都是为了保证数据包可靠的传输给对方。
UDP协议:UDP相对来说比较简单,只负责发送数据包,并不关心数据包是否能够到达,但实时性能比TCP更好一点。
应用需要传送的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过MSS,就要将数据包分块,这样即使中途中有包丢失,只需要传送相应的数据包即可,在TCP协议中,我们把每个包分块称为一个TCP段。
端口:当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。
网络层
网络层:传送到设备的真正实现者,传输层是负责让其作为应用数据传输之间的媒介,帮助应用到应用的通信,实际传输功能交给网络层。
网络层协议:IP协议等
IP协议
作用:IP协议会将传输层的报文作为数据部分,再加上IP包头组装成IP报文,如果IP报文大小超过MTU,就会再次分片,得到的一个即将发送的IP报文。
对于数据从一个设备传送到另一台设备,世界上的设备有很多,又该如何找到对方呢。因此IP地址会给设备进行编号。
我们一般用IP地址给设备进行编号,对于IPV4协议,IP地址共32位,分成了四段,每段都是8位。
IP地址:网络号和主机号
网络号:负责标识该 IP 地址是属于哪个「子网」的
主机号:,负责标识该 IP 地址是属于哪个「子网」的
网络接口层
含义:生成了IP头部之后,在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。
核心作用
负责把 IP 数据包封装成帧,在物理网络上收发
屏蔽底层不同硬件(以太网、WiFi、PPP、4G)差异,向上只提供统一接口给 IP 层
完成帧封装、MAC 寻址、差错校验、比特流传输
键入网址到网页显示,期间发生了什么

HTTP超文本传输协议
解析URL
键入网址第一步就是解析URL。因此浏览器第一部工作就是对URL进行解析。
一条合格的URL应该包含如下元素:http+//+web服务器+/+目录名+/+.......+文件名
生产的HTTP请求信息
对URL进行解析之后,浏览器确定了Web服务器和文件名,接下来根据这些信息来生成HTTP请求消息。
Get请求(无请求体,参数拼成URL)
GET /api/user/list?page=1&size=10&keyword=test HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Accept: application/json,text/plain,*/*
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9;uid=10086
字段说明
请求行:
GET 资源地址?参数 HTTP/协议版本,GET 参数拼接在 URL 后请求头:
- Host:目标服务域名 + 端口(必填)
- User-Agent:客户端浏览器 / 设备标识
- Accept:客户端可接收的响应数据格式
- Cookie:携带会话凭证、登录令牌
POST请求(JSON格式请求)
POST /api/user/login HTTP/1.1
Host: api.xxx.com
Content-Type: application/json;charset=utf-8
Content-Length: 56
User-Agent: PostmanRuntime/7.37.0
Accept: */*
{"username":"admin","password":"123456","code":"888888"}
Content-Type:application/json:声明请求体是 JSON 数据Content-Length:下方请求体字节长度,服务器用于解析报文- 空行:请求头与请求体必须换行分隔,HTTP 规范强制要求
DNS域名解析
通过浏览器解析URL之后会生成HTTP消息,需要委托给操作系统将消息发送给Web服务器。
在发送之前,还需要查询服务器域名对应的IP地址 ,有一种服务专门保存了web服务器域名和IP的对应关系,他就是DNS服务器。在域名中,越靠右的位置表示其层次越高。
域名的层次关系:
• 根 DNS 服务器(.)
• 顶级域 DNS 服务器(.com)
• 权威 DNS 服务器(server.com)
域名的解析工作流程1.客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:"老大, 能告诉我 www.server.com 的 IP 地址吗?" 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:"www.server.com 这个域名归 .com 区域管理",我给你 .com 顶级域名服务器地址给你,你去问问它吧。"
本地 DNS 收到顶级域名服务器的地址后,发起请求问"老二, 你能告诉我 www.server.com 的 IP 地址吗?"
顶级域名服务器说:"我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到"。
本地 DNS 于是转向问权威 DNS 服务器:"老三,www.server.com对应的IP是啥呀?" server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程我画成了一个图。
协议栈
通过DNS解析到IP地址后,就可以把HTTP的传输工作交给协议栈。协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。

TCP
HTTP 是基于 TCP 协议传输的,所以在这我们先了解下 TCP 协议。

IP
TCP模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。

报文详解:
在 IP 协议里面需要有源地址 IP 和 目标地址 IP:
• 源地址IP,即是客户端输出的 IP 地址;
• 目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
因为 HTTP 是经过 TCP 传输的,所以在 IP 包头的协议号,要填写为 06(十六进制),表示协议为 TCP。
MAC
生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。

网卡
网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。因此,我们需要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。
负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。

最后网卡会将包转为电信号,通过网线发送出去。
