Shell Shell
Home
Shell
Linux
Network
Git
Blog (opens new window)
GitHub (opens new window)
Home
Shell
Linux
Network
Git
Blog (opens new window)
GitHub (opens new window)
  • 趣谈网络协议

    • 目录
    • 为什么要学习网络协议
      • 协议三要素
      • 我们常用的网络协议有哪些?
      • 小结
    • 网络分层的真实含义是什么
    • ifconfig 最熟悉又陌生的命令行
    • DHCP 与 PXE IP 是怎么来的, 又是怎么没的
    • 从物理层到 MAC 层:如何在宿舍里自己组网玩联机游戏?
    • 交换机与 VLAN:办公室太复杂, 我要回学校
    • ICMP 与 ping:投石问路的侦察兵
    • 世界这么大, 我想出网关:欧洲十国游与玄奘西行
    • 路由协议:西出网关无故人, 敢问路在何方
    • UDP 协议:因性善而简单, 难免碰到“城会玩”
  • 孕期超声检查时间表
  • network
  • 趣谈网络协议
JaimeZeng
2022-03-14

为什么要学习网络协议

public class HelloWorld {
  public static void main(String[] args){
    System.out.println("Hello World!");
  }
}
1
2
3
4
5

上面这段代码就是一种协议,是人类和计算机沟通的协议,只有通过这种协议,计算机才知道我们想让它做什么。

# 协议三要素

上面源代码机器不能直接执行,需要交给编译器进行 compile(源文件 → 词法分析 → 语法分析 → 语义分析 → 代码生成 → 目标文件)转换为机器代码才行。

img

计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。

协议的三要素

  • 语法,就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号等。
  • 语义,就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本一般来说就没有意义。
  • 顺序,就是先干啥,后干啥。例如,可以先加上某个数值,然后再减去某个数值。

会了计算机语言,你就能够教给一台计算机完成你的工作了。

但是,要想打造互联网世界的通天塔,只教给一台机器做什么是不够的,你需要学会教给一大片机器做什么。这就需要网络协议。只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。

例如,浏览一个网页,浏览器会收到一段来自 HTTP 协议的“东西”,格式就像下面这样:

HTTP/1.1 200 OK Date: Tue, 27 Mar 2018 16:50:26 GMT Content-Type: text/html;charset=UTF-8 Content-Language: zh-CN

<!DOCTYPE html>
<html>
  <head>
    <base href="https://pages.kaola.com/" />
    <meta charset="utf-8" />
    <title>网易考拉3周年主会场</title>
  </head>
</html>
1
2
3
4
5
6
7
8
9
10

首先,符合语法,也就是说,只有按照上面那个格式来,浏览器才认。例如,上来是状态,然后是首部,然后是内容。

第二,符合语义,就是要按照约定的意思来。例如,状态 200,表述的意思是网页成功返回。如果不成功,就是我们常见的“404”。

第三,符合顺序,你一点浏览器,就是发送出一个 HTTP 请求,然后才有上面那一串 HTTP 返回的东西。

浏览器显然按照协议商定好的做了,最后一个五彩缤纷的页面就出现在你面前了。

# 我们常用的网络协议有哪些?

在浏览器地址栏输入 https://www.kaola.com ,浏览器不知道具体的地点,不知道应该如何访问。于是,它打开地址簿去查找。可以使用一般的地址簿协议 DNS 去查找,还可以使用另一种更加精准的地址簿查找协议 HTTPDNS。

无论用哪一种方法查找,最终都会得到这个地址:106.114.138.24。这个是 IP 地址,是互联网世界的“门牌号”。

知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用 HTTP 协议;但是对于购物的请求,往往需要进行加密传输,因而会使用 HTTPS 协议。无论是什么协议,里面都会写明“你要买什么和买多少”。

img

DNS、HTTP、HTTPS 所在的层我们称为应用层。经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过 socket 编程来实现。下一层是传输层。传输层有两种协议,一种是无连接的协议 UDP,一种是面向连接的协议 TCP。对于支付来讲,往往使用 TCP 协议。所谓的面向连接就是,TCP 会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达。

TCP 协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程。

img

传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址,也即电商网站所在服务器的 IP 地址。

img

操作系统既然知道了目标 IP 地址,就开始想如何根据这个门牌号找到目标机器。操作系统往往会判断,这个目标 IP 地址是本地人,还是外地人。如果是本地人,从门牌号就能看出来,但是显然电商网站不在本地,而在遥远的地方。

操作系统知道要离开本地去远方。虽然不知道远方在何处,但是可以这样类比一下:如果去国外要去海关,那么去外地就要去网关。而操作系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关的 IP 地址 192.168.1.1。

操作系统如何将 IP 地址发给网关呢?在本地通信基本靠吼,于是操作系统大吼一声,谁是 192.168.1.1 啊?网关会回答它,我就是,我的本地地址在村东头。这个本地地址就是 MAC 地址,而大吼的那一声是 ARP 协议。

img

于是操作系统将 IP 包交给了下一层,也就是 MAC 层。网卡再将包发出去。由于这个包里面是有 MAC 地址的,因而它能够到达网关。

网关收到包之后,会根据自己的知识,判断下一步应该怎么走。网关往往是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表。

路由器有点像玄奘西行路过的一个个国家的一个个城关。每个城关都连着两个国家,每个国家相当于一个局域网,在每个国家内部,都可以使用本地的地址 MAC 进行通信。

一旦跨越城关,就需要拿出 IP 头来,里面写着贫僧来自东土大唐(就是源 IP 地址),欲往西天拜佛求经(指的是目标 IP 地址)。路过宝地,借宿一晚,明日启程,请问接下来该怎么走啊?

img

城关往往是知道这些“知识”的,因为城关和临近的城关也会经常沟通。到哪里应该怎么走,这种沟通的协议称为路由协议,常用的有 OSPF 和 BGP。

img

城关与城关之间是一个国家,当网络包知道了下一步去哪个城关,还是要使用国家内部的 MAC 地址,通过下一个城关的 MAC 地址,找到下一个城关,然后再问下一步的路怎么走,一直到走出最后一个城关。

最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标 IP 啊?目标服务器就会回复一个 MAC 地址。网络包过关后,通过这个 MAC 地址就能找到目标服务器。

目标服务器发现 MAC 地址对上了,取下 MAC 头来,发送给操作系统的网络层。发现 IP 也对上了,就取下 IP 头。IP 头里会写上一层封装的是 TCP 协议,然后将其交给传输层,即 TCP 层。

在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。

因为一旦出了国门,西行路上千难万险,如果在这个过程中,网络包走丢了,例如进了大沙漠,或者被强盗抢劫杀害怎么办呢?因而到了要报个平安。

如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。**这个重试绝非你的浏览器重新将下单这个动作重新请求一次。**对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

当网络包平安到达 TCP 层之后,TCP 头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个 Tomcat,将这个包发给电商网站。

img

电商网站的进程得到 HTTP 请求的内容,知道了要买东西,买多少。往往一个电商网站最初接待请求的这个 Tomcat 只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

如何告诉相关的进程呢?往往通过 RPC 调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由 RPC 框架统一处理。RPC 框架有很多种,有基于 HTTP 协议放在 HTTP 的报文里面的,有直接封装在 TCP 报文里面的。

当接待员发现相应的部门都处理完毕,就回复一个 HTTPS 的包,告知下单成功。这个 HTTPS 的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功。

# 小结

img

当网络包到达一个城关的时候,可以通过路由表得到下一个城关的 IP 地址,直接通过 IP 地址找就可以了,为什么还要通过本地的 MAC 地址呢?

  1. 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

  2. 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。

  3. 网络协议的分层和网络实体的分级管理是对应的。数据包在内网中主要依靠 MAC 地址投递。首先,IP 地址必须在有三层设备时才有用 ,而很多内网只有交换机,工作在 2 层的交换机是不能识别 IP 地址的。其次局域网内 IP 地址是动态分配的,假如我是 192.168.2.100,如果我下线了,可能 IP 就分配给了另一台电脑。IP 和设备并不总是对应的,这对通信就产生了问题,但是 MAC 地址不同,MAC 地址和设备是一一对应且全球唯一的。所以局域网使用 MAC 地址通信没有问题。

    • MAC 地址是唯一的,为什么可以修改 MAC 地址:MAC 地址全球唯一,它是固化在网卡里的。网卡毕竟是个硬件,需要软件支持,既操作系统识别。重点来了,操作系统识别出来的 MAC 地址是可以更改的,它只不过是一个字符串。我们常说的修改 MAC 指的是修改电脑中记录的既注册表中的记录。

    • 有了 MAC 地址为什么还需要 IP 地址:MAC 地址本身的缺陷:因为 MAC 地址是硬件提供商写在网卡中的,MAC 地址虽然唯一但是不能表明用户在整个互联网中的位置,除非维护一个超级大 MAC 地址对应表,那寻址效率肯定爆炸。但是 IP 地址解决了这个问题,因为 IP 地址是网络提供商给你的,所以你在哪里整个网络都是知道的。

      早期的以太网只有交换机,没有路由器,以太网内通过 MAC 地址通信。后来才有了互联网,为了兼容原本的模式,采用了 IP+MAC 地址通信的方式。为啥不推到了重来呢?看看 IPv6 的处境你就知道了。所以是先有 MAC 地址后有的 IP,IP 的提出主要还是因为 MAC 地址本身的缺陷。

    • IP 地址 和 MAC 地址的关系:

      • IP 和设备并不总是对应的。局域网内 IP 地址是动态分配的,如果我下线了分给我的 IP 地址就会分配给另一台电脑,通信就产生了问题
      • MAC 地址和设备是一一对应的且全球唯一。所以局域网使用 MAC 地址通信没有问题
      • IP 是地址,有定位功能;MAC 是身份证,无定位功能
  4. 在网络包里,有源 IP 地址和目标 IP 地址、源 MAC 地址和目标 MAC 地址。从路由表中取得下一跳的 IP 地址后,应该把这个地址放在哪里呢?如果放在目标 IP 地址里面,到了城关,谁知道最终的目标在哪里呢?所以要用 MAC 地址。

    所谓的下一跳,看起来是 IP 地址,其实是要通过 ARP 在目标 IP 的网段内广播,然后等它回复得到 MAC 地址,将下一跳的 MAC 地址放在目标 MAC 地址里面。

目录
网络分层的真实含义是什么

← 目录 网络分层的真实含义是什么→

Theme by Vdoing | Copyright © 2020-2022 JaimeZeng | ❤️ | CC BY-NC-SA 4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式