HTTP
- 对 URL 进行解析之后,浏览器确定了
Web 服务器和文件名
,接下来就是根据这些信息来生成 HTTP 请求消息了。
http://www.server.com/dir1/file1.html
'http:访问数据的协议'
'www.server.com:服务器'
'dir1:目录名'
'file1.html:文件名'
生产 HTTP 请求信息
DNS
- 查询服务器域名对应的 IP 地址。比如 www.server.com(域名),这里的句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高。
- 所以域名的层级关系类似一个树状结构:
- 根 DNS 服务器(.)
- 顶级域 DNS 服务器(.com)
- 权威 DNS 服务器(server.com)
- 根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
域名解析的工作流程
- 客户端首先会发出一个 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 地址返回客户端,客户端和目标建立连接。
每次解析域名都要经过那么多的步骤呢?
- 浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。
五层协议
-
通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。
-
应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
-
协议栈的下面一半是用 IP 协议控制网络包收发操作, IP 中还包括 ICMP 协议和 ARP 协议。
- ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
- ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。
-
IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。
TCP
HTTP 是基于 TCP 协议传输的。
- 源端口号和目标端口号主要表明发送给哪一个应用上的
序号
:这个是为了解决包乱序的问题。确认号
:目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决丢包的问题。状态位
:例如 SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接等。TCP 是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。窗口大小
:TCP 要做流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发送的太快,也别发的太慢。拥塞控制
:对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即控制发送的速度。
TCP 传输数据之前,要先三次握手建立连接
三次握手目的是保证双方都有发送和接收的能力。
- TCP 的连接状态查看,在 Linux 可以通过
netstat -napt
命令查看。- route -n 命令查看当前系统的路由表。
- arp -a 命令来查看 ARP 缓存的内容。
流程
- 客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态。
- 然后客户端主动发起连接 SYN,之后处于 SYN-SENT 状态。
- 服务端收到发起的连接,返回 SYN,并且 ACK 客户端的 SYN,之后处于 SYN-RCVD 状态。
- 客户端收到服务端发送的 SYN 和 ACK 之后,发送对 SYN 确认的 ACK,之后处于 ESTABLISHED 状态,因>为它一发一收成功了。
- 服务端收到 ACK 的 ACK 之后,处于 ESTABLISHED 状态,因为它也一发一收了。
TCP 分割数据
- MTU:一个网络包的最大长度,以太网中一般为 1500 字节。
- MSS:除去 IP 和 TCP 头部之后,一个网络包所能容纳的 TCP 数据的最大长度。
IP
- IP 协议里面需要有源地址 IP 和 目标地址 IP:
- 源地址IP,即是客户端输出的 IP 地址;
- 目标地址,即通过 DNS 域名解析得到的 Web 服务器 IP。
- 当客户端有多个网卡时,就会有多个IP地址,此时需要通过
路由表
规则,来判断哪一个网卡作为源地址的IP
- 目标IP与子网掩码与操作获取网络号,然后查路由表
- 首先先和第一条目的子网掩码(Genmask)进行 与运算,得到结果为 192.168.10.0,但是第一个条目的 Destination 是 192.168.3.0,两者不一致所以匹配失败。
- Web 服务器的目标地址是 10.100.20.100,那么依然依照上面的路由表规则判断,判断后的结果是和第三条目匹配。
IP报文生成
MAC
- 在 MAC 包头里需要
发送方 MAC 地址
和接收方目标 MAC 地址
,用于两点之间的传输。还有协议类型
- 一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:
- 0800 : IP 协议
- 0806 : ARP 协议
- 源MAC获取:网卡生产时写入到 ROM 里的
- 目标MAC获取:ARP协议通过广播的形式获取
- 后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用,不过缓存的时间就几分钟。
生成MAC地址
网卡(物理层)
- 网络包只是存放在内存中的一串二进制数字信息,需要将数字信息转换为电信号,才能在网线上传输
- 负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序。
- 网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
- 起始帧分界符是一个用来表示包起始位置的标记
- 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏
交换机
- 电信号到达网线接口,交换机里的模块进行接收,将交换机里的模块将电信号转换为数字信号。
- 然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区(
这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。
) - 不同点:
- 计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,
交换机的端口不具有 MAC 地址。
- 计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,
交换机作用
- 交换机使用MAC地址来实现数据包的转发。交换机维护一个MAC地址表,记录每个设备的MAC地址和它所连的端口,当收到一个数据包时,交换机会查找MAC地址表,将数据包转发到目标设备所在的端口。因此,交换机在数据链路层使用MAC地址来实现局域网内设备之间的通信。
- 交换机的 MAC 地址表主要包含两个信息:
- 一个是设备的 MAC 地址,
- 另一个是该设备连接在交换机的哪个端口上。
当 MAC 地址表找不到指定的 MAC 地址会怎么样?
- 交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
会不会出现网络拥塞?
- 只有相应的接收者才接收包,而其他设备则会忽略这个包。
- 而且发送了包之后目标设备会作出响应,只要返回了响应包,交换机就可以将它的地址写入 MAC 地址表,下次也就不需要把包发到所有端口了。
路由器
- 路由器和交换机原理类似,也是通过查表判断包转发的目标。
- 路由器和交换机区别。
- 因为路由器是基于 IP 设计的,俗称三层网络设备,
路由器的各个端口都具有 MAC 地址和 IP 地址;
- 而交换机是基于以太网设计的,俗称二层网络设备,
交换机的端口不具有 MAC 地址。
- 因为路由器是基于 IP 设计的,俗称三层网络设备,
流程
路由器工作原理
- 当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。
路由器的包接收操作
- 电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。
- 如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
查询路由表确定输出端口
- 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。
- 通过路由表查询转发的目标
例子:- 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送一个包
- 每个条目的子网掩码和 192.168.1.100 IP 做 & 与运算后得到结果是 192.168.1.0 ,这与第二条目的目标地址 192.168.1.0 匹配,该第二条目记录就会被作为转发目标。
- 实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」
路由器的发送操作
- 根据路由表的网关列判断对方的地址。
- 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
- 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点。
- 知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。
发送出去的网络包会通过交换机到达下一个路由器。
由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。
源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。