1、浏览器解析URL,生成发送给web服务器的请求信息
2、根据域名(地址)查询IP,DNS
DNS服务器保存了IP和域名的对应关系,分别是:
- 根DNS服务器
- 顶级域DNS服务器(com)
- 权威DNS服务器(server.com)
其中根DNS服务器保存在任何DNS服务器上,换言之,每个DNS服务器都知道根DNS服务器的IP。
DNS解析流程:
- 客户端发送DNS请求给本地DNS服务器,询问域名的IP是什么?本地DNS服务器如果有缓存,则返回。
- 本地DNS服务器没有缓存该域名,则向根DNS服务器询问,根DNS服务器不会响应是哪个IP,会指示去哪个DNS服务器可能找得到你想要的IP
- 本地DNS收到根DNS服务器的指示后,发起请求到顶级域DNS服务器询问域名的IP,顶级域DNS服务器继续指示去哪个DNS服务器可能找得到你想要的IP
- 本地DNS收到顶级域DNS服务器的指示后,发起请求到权威DNS服务器,权威DNS服务告诉域名的IP到本地DNS服务器
- 本地DNS服务器返回IP给客户端
流程总的来说就是,问儿子要东西,但是不知道找哪个儿子,都知道爷爷的电话,先问爷爷,爷爷告诉问哪个爸爸,爸爸告诉问哪个儿子。
3、知道域名的IP后,就开始7层网络协议的层层委派
HTTP→TCP、UDP→IP(ICMP、ARP)再到网卡驱动,再到硬件传输
ICMP:internet controll message protocol
它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ARP:address resolution protocol
主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
4、生成TCP报文
传输控制协议,需要填写以下主要信息
- 源端口号和目标端口号,目的:知道发给哪个应用
- 包的序号,目的:解决TCP拆分HTTP数据的包乱序问题
- 确认号,目的:确认发送的包,对方是否收到,没收到需要重发,解决丢包问题
- 窗口大小,目的:做流量控制,根据网络情况适当调节,不快不慢的发送
TCP三次握手
目的:保证双方都有收发数据的能力
TCP三次握手流程:
- 开始,客户端和服务端都是CLOSED状态,服务端开始监听,变成LISTEN状态
- 客户端主动发起SYN,状态变更CLOSED→SYN-SENT
- 服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,状态变更LISTEN→SYN-RCVD
- 客户端收到服务端的SYN和ACK后,对服务端的ACK进行ACK,状态变更为ESTABLISHED,此时,客户端完成了自己发送、收取数据能力的验证!
- 服务端收到自己ACK客户端的SYN的,来自客户端的ACK消息,状态变更为ESTABLISHED,此时,服务端完成了自己接收,发送数据能力的验证!
查看TCP连接状态:
TCP数据分割
http携带数据如果过长,TCP会对其进行切割。依据MSS和MTU
MSS:Maximum Segment Size
最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)
MTU:Maximum Transmission Unit
最大传输单元,用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小,一般以太网中为1500字节
MTU=MSS+TCP头+IP头
5、生成HTTP报文
超文本传输协议,需要填写以下主要信息
- 源地址IP,客户端物理机IP
- 目标地址IP,通过DNS解析得来
- 协议号,一般是TCP,06(十六进制)
多网卡的物理机,客户端选择哪个网卡发送数据?
linux可以通过:
查询当前系统的路由表
so?多网卡的物理机,客户端选择哪个网卡发送数据?
- 目标IP和子网掩码做与运算,选择IP网络号一致的
- 如果都匹配不上,选择子网掩码为0.0.0.0的默认网关
6、添加MAC头
MAC包,头里面需要添加以下重要信息:
- 发送方MAC地址
- 接收方目标MAC地址
发送方可以获取到网卡生产时写入的ROM的MAC地址
接收方需要采用ARP协议,通过广播的方式获取MAC地址,并缓存
Linux通过
查询缓存的地址
最后形成了:MAC头+IP头+TCP头+HTTP报文
7、网卡
网卡从IP模块获取包后,复制到缓冲区,会给数据加上报头和起始帧分界符,末尾加上用于检验错误的FCS(Frame Check Sequence)帧校验序列
起始帧分界符用于标记包开始
FCS用于校验包传输过程中是否损坏
最后形成了:报头和起始帧分界符+MAC头+IP头+TCP头+HTTP报文+FCS
网卡将数字信号转换为电信号,真正实现在网线上发送数据
8、交换机
交换机接收电脑网卡发来的电信号,转换成数字信号,校验是否有问题,没有问题就放入缓冲区。
交换机有MAC地址和端口的映射表
根据MAC头的MAC地址,将信号发送到相应的端口
9、路由器
路由器基于IP设计(三层网络设备),交换机基于以太网设计(二层网络设备)
路由器的每个端口都有MAC地址和IP地址,可以作为以太网的发送方和接收方。
路由器收包操作
- 电信号转数字信号
- 根据包末尾的FCS进行错误校验
- 校验通过检查MAC头的接收方MAC地址是不是自己,不是就丢弃,是就放到缓存区
路由确认从哪个端口发送?
匹配过程和网卡选择一样
- 目标IP和子网掩码做与运算,选择IP网络号一致的
- 如果都匹配不上,选择子网掩码为0.0.0.0的默认路由
路由器发包操作
- 根据路由表的网关列判断对方地址,如果网关是IP,表示还没发到目的地;如果是空,表示已经发送到目的地
- 通过ARP协议根据IP地址查询MAC地址,把结果记录为接收方的MAC地址
发送出去的网络包会通过交换机抵达下一个路由器,经过层层路由,最终抵达目的地。
10、服务器反解析
反解析过程:
- 拆包查看MAC头,是否与服务器自己的MAC地址符合
- 查看IP头,比较IP地址是否符合,得知底层协议是TCP
- 查看TCP头,看序列号是不是乱的,如果没问题就返回ACK,不是就丢弃
- 查看TCP头的端口号,和正在监听该端口的服务器进程匹配,最后包被发送给监听该端口的HTTP进程
- HTTP进程发现数据包的目的是要请求一个页面,于是把网页封装到HTTP报文里
- 服务器重复客户端的包装数据的过程,反向发送数据给客户端。