Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

精读趣谈网络协议 #93

Closed
FrankKai opened this issue Aug 28, 2018 · 11 comments
Closed

精读趣谈网络协议 #93

FrankKai opened this issue Aug 28, 2018 · 11 comments

Comments

@FrankKai
Copy link
Owner

在极客时间上订阅了刘超老师的《趣谈网络协议》专栏,在这个issue中,我将按照专栏文章章节,摘取自己认为比较重要的网络协议知识点,并且写一些自己的看法。

@FrankKai
Copy link
Owner Author

FrankKai commented Aug 31, 2018

第1讲:为什么要学习网络协议?

语言也是一种协议

只有通过这种协议,计算机才知道我们想让它做什么。

计算机语言协议三要素

  • 语法
  • 语义
  • 顺序

网络协议的意义

只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。

网关和MAC地址的作用?

网关是一个路由器,通过路由表,知道到某个IP怎么走。
通过网卡的MAC地址,可以唯一定位目标服务器,也可以唯一定位客户端电脑。

目标服务器被找到后做什么操作?

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

大佬们经常说的ACK是什么?

在TCP层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。
如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。
这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

image

Tomcat与协议之间的关系

什么时候Tomcat与协议间建立联系

网络包到达TCP层之后,TCP头中有目标端口号,通过这个端口号,可以找到电商网站监听此端口号的进程,而这个监听者,就可能是Tomcat

Tomcat 的职责-HTTP请求统筹处理者
  • 告诉订单进程,登记商品,买多少
  • 告诉库存进程,库存减少多少
  • 告诉支付进程,应该付多少钱
Tomcat如何告诉相关进程
  • RPC调用,也就是远程过程调用
  • RPC调用时告诉相关进程时,不需要关心网络互连(涉及RPC协议)问题,会有RPC框架统一处理
  • RPC框架很多种,放HTTP报文,放TCP报文等等

从底层到上层涉及的网络协议

image

网络协议基本功扎实可以涉及的领域

云计算,容器,微服务等。例如Docker,kubernetes,microServies等等。

@FrankKai
Copy link
Owner Author

FrankKai commented Aug 31, 2018

第2讲:网络分层的真实含义是什么?

二层设备、三层设备、四层LB和七层LB中层

不恰当的网络分层比喻

为什么网络要分层呀?因为不同的层次之间有不同的沟通方式,这个叫作协议。例如,一家公司也是分“层次”的,分总经理、经理、组长、员工。总经理之间有他们的沟通方式,经理和经理之间也有沟通方式,同理组长和员工。

几个协议之间的联系的问题

  • 经理与经理间握手时,员工在做什么?对应TCP建立连接的三次握手协议,TCP在进行3次握手的时候,IP层与MAC层对应有什么操作?
  • 原始地址 A 到目标地址 D,中间经过两个中转站 A->B->C->D,A知道自己的下一个中转站是B,那A发出来的包,应该把B的IP地址放在哪里?
  • 二层设备处理的通常是 MAC 层的东西。二层设备处理的包里,有没有 HTTP 层的内容呢?

一个综合的网络协议的问题

  • 从我们的电脑,通过SSH登录到公有云主机里面,都需要经历哪些过程?
  • 打开一个电商网站,需要经历哪些过程?

网络为什么要分层?

  • 因为,是个复杂的程序都要分层
  • 复杂的程序都要分层,这是程序设计的要求

如何理解计算机网络中的概念

  • 想象网络包是一段Buffer,或者一块内存,是有格式的
  • 想象自己是一个处理网络包的程序,可以跑在电脑,服务器,交换机以及路由器上
  • 想象自己有很多网口,从某个口拿进一个网络包,用自己的程序处理一下,再从另外一个网口发出去

复杂的电商如何分层

  • 数据库层
  • 缓存层
  • Compose层
  • Controller层
  • 接入层

浏览一次网页涉及的协议

image

二层MAC层添加MAC地址

send_layer2(buffer),这个函数里面要加一下 MAC 的头,记录下 MAC 地址,得到的就是本机器的 MAC 地址和目标的 MAC 地址或者网关MAC。

网口什么时候回拿网络包

  • 当一个网络包从一个网口经过时,我会根据MAC地址判断要不要拿进来处理一把。
  • 有的网口配置了混杂模式,凡是经过的,全部拿进来处理。
  • 将网络包拿进网口后,会进行一层一层的拆包处理。

网络包什么时候可以从网口发出去?

加了HTTP头和内容,TCP的头,IP的头以及MAC头之后,称为一个完整的Buffer之后,才能从网口发出去。

揭秘层与层之间的关系

  • 所有不能表示出层层封装含义的比喻,都是不恰当的
  • 员工之间沟通,需要带上总经理,因为员工沟通需要将组长揣兜里,组长已经将经理揣了兜里,而经理已经默认将总经理揣在了兜里。(员工(组长(经理(总经理))))
  • 只要是网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

TCP3次握手的时候,IP层和MAC层在做什么呢?

TCP每发送一个消息,都会带着IP层和MAC层。因为TCP每发送一个消息,IP层和MAC层的所有机制都要运行一遍。对于TCP协议来说,三次握手也好,重试也好,只要想发出去包,就要有IP层和MAC层,不然是发不出去的。

二层设备、三层设备是什么

  • 一个HTTP协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里面HTTP、TCP、IP、MAC都有。
  • 二层设备指的就是,只把MAC头摘下来,看看到底是丢弃、转发,还是自己留着
  • 三层设备指的就是,把MAC头拿下来,再把IP头拿下来,看看到底是丢弃、转发,还是自己留着。

一个非常形象协议分层的比喻

云学:通信协议就像没有天桥的双子楼,要从A座的24层到达B座24层就得先下楼梯再上楼梯,其他协议也是如此,比如4G

@FrankKai FrankKai changed the title 精度趣谈网络协议 精读趣谈网络协议 Sep 2, 2018
@FrankKai
Copy link
Owner Author

FrankKai commented Sep 2, 2018

第3讲| ifconfig:最熟悉又陌生的命令行

与ifconfig相同的在linux系统上查看ip地址的命令是什么?

ip addr

root@test:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff
    inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fec7:7975/64 scope link 
       valid_lft forever preferred_lft forever

1. LOOPBACK,UP,LOWER_UP,BROADCAST,MULTICAST什么意思?
这个叫做net_device flags,是网络设备的状态标识。

net_device flag 含义
LOOPBACK lo全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
UP 网卡处于启动状态
LOWER_UP L1是启动的,也就是网线是插着的
BROADCAST 表示网卡有广播地址,可以发送广播包
MULTICAST 网卡可以发送多播包

2. mtu 65536和mtu 1500是什么意思?
MTU是二层MAC层的概念,MAC层有MAC头,以太网规定连MAC头带正文合起来,不允许超过1500个字节。正文中包括三层的IP头,四层的TCP头以及五层的HTTP头。如果放不下,就需要用分片来传输。

3. qdisc noqueue、qdisc pfifo_fast是什么意思?
qdisc的全称是queueing discipline,中文叫排队规则。内核如何需要通过网络接口发送数据包,它都需要按照为这个接口配置的qdisc(排队规则)把数据包加入队列。
最简单的qdisc是pfifo,不对进入的数据包做任何处理,数据包采用先入先出方式通过队列。
pfifo_fast稍微复杂一些,它的队列包括三个波段(band),每个波段中先入先出。band0优先级最高。在波段中,包也有优先级,数据包是按照TOS(Type of Service)分配的,TOS是三层IP头里面的一个字段,代表数据包的优先级。
队列在云计算的网络中,会有很多用户共享一个网络出口的情况,这个时候如何排队,每个队列有多粗,队列处理速度如何提升,都是非常有趣的。

4. 公有IP地址和私有IP地址
image
我们继续看上面的表格。表格最右列是私有 IP 地址段。平时我们看到的数据中心里,办公室、家里或学校的 IP 地址,一般都是私有 IP 地址段。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址段和我学校的可以是一样的。
这就像每个小区有自己的楼编号和门牌号,你们小区可以叫 6 栋,我们小区也叫 6 栋,没有任何问题。但是一旦出了小区,就需要使用公有 IP 地址。就像人民路 888 号,是国家统一分配的,不能两个小区都叫人民路 888 号。
公有 IP 地址有个组织统一分配,你需要去买。如果你搭建一个网站,给你学校的人使用,让你们学校的 IT 人员给你一个 IP 地址就行。但是假如你要做一个类似网易 163 这样的网站,就需要有公有 IP 地址,这样全世界的人才能访问。
表格中的 192.168.0.x 是最常用的私有 IP 地址。你家里有 Wi-Fi,对应就会有一个 IP 地址。一般你家里地上网设备不会超过 256 个,所以 /24 基本就够了。有时候我们也能见到 /16 的 CIDR,这两种是最常见的,也是最容易理解的。
不需要将十进制转换为二进制 32 位,就能明显看出 192.168.0 是网络号,后面是主机号。而整个网络里面的第一个地址 192.168.0.1,往往就是你这个私有网络的出口地址。例如,你家里的电脑连接 Wi-Fi,Wi-Fi 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是广播地址。一旦发送这个地址,整个 192.168.0 网络里面的所有机器都能收到。

5. CIDR是什么?
由于32位的IP地址不够用,所以讲将32位IP地址一分为二,前面是网络号,后面是主机号。
伴随着CIDR的,还有广播地址10.100.122.255,所有10.100.122网络里面的机器都可以收到。子网掩码255.255.255.0。
为什么10.100.122网络里的所有机器都可以收到呢?网络号,子网掩码与IP地址进行AND运算得到。255转成二进制都是1,1与任何数与运算都为1,0与任何数与运算都为0,因此得到网络号。

6. inet 127.0.0.1/8 scope host lo、inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0什么意思?
inet 127.0.0.1/8 scope host lo
127.0.0.1这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。127.0.0.1/8是一种CIDR的地址表示形式,/8表示前8位是网络号,后24位是主机号。scope host lo的意思是,对于lo这张网卡来说,当前网卡的scope是host,也就是说这张网卡仅仅可以供本机相互通信。
inet 10.100.122.2/24 brd 10.100.122.255 scope global eth0
也是CIDR,对于eth0这张网卡来说,是global,说明这张网卡是可以对外的,可以接收来自各个地方的包。10.100.122.2/24,意思是前24位是网络号,8位是主机号,也就是10.100.122.x,这里的x代表主机号,2的8次方等于256,我们的机器从10.100.122.2一直到10.100.122.254,可以有253台,这里的机器获得的都是私有IP地址。
为什么10.100.122.0,10.100.122.1,10.100.122.255不能作为我们的机器?

  • 10.100.122.0是默认网关
  • 10.100.122.1作为私有网络的出口地址,例如wifi路由器的出口地址就是192.168.0.1,用来与外界进行通信。
  • 10.100.122.255是广播地址,10.100.122网络里的所有机器都通过这个地址进行通信。

我们这里的10.100.122.2也是私有网络的出口地址,可以与通过10.100.122.0与外界机器进行通信,也可以通过10.100.122.255与局域网内机器进行通信。

实验

公有ip查询:https://www.ip.cn/
私有ip查询:ifconfig

我的机器

公有ip:

您现在的 IP:115.204.91.5
所在地理位置:浙江省杭州市 电信
GeoIP: Hangzhou, Zhejiang, China

私有ip:

192.168.0.46
同事机器

公有ip:

您现在的 IP:115.204.91.5
所在地理位置:浙江省杭州市 电信
GeoIP: Hangzhou, Zhejiang, China

私有ip:

192.168.0.58

7. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00和link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff是什么?

这个是MAC地址,是一个网卡的物理地址,用16进制,6个byte表示。
MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址。
一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。而有门牌号码属性的 IP 地址,才是有远程定位功能的。
MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。
MAC地址不能定位吗?
MAC地址有一定定位功能,只不过范围有限,当根据IP定位到一定范围时,再根据MAC地址,才能找到精确的一台机器,如果没根据IP进入到这个区域,只根据MAC地址找是无效的。
MAC地址的通信范围比较小,仅仅局限在一个子网里面。
192.168.0.2/24访问192.168.0.3/24 ✔️
192.168.0.2/24访问192.168.1.2/24 ❌因为跨越了子网,不仅需要MAC地址,还需要IP地址起作用。

8.macOS怎么有这么多网卡?

en0是私有ip有线网卡,en1是私有ip无线网卡。

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
	ether 78:7b:8a:d7:76:1e 
	inet6 fe80::1073:cbb2:b1a8:1efa%en0 prefixlen 64 secured scopeid 0x6 
	inet 192.168.0.46 netmask 0xffffff00 broadcast 192.168.0.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect (1000baseT <full-duplex,flow-control>)
	status: active
en1: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
	ether 14:20:5e:00:b3:8c 
	inet6 fe80::105c:2fa7:999b:50bf%en1 prefixlen 64 secured scopeid 0x7 
	inet 169.254.214.195 netmask 0xffff0000 broadcast 169.254.255.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active

总结

  • IP是地址,有定位功能;MAC是身份证,无定位功能
  • CIDR可以用来判断是不是子网中的机器
  • IP分为公有IP和私有IP

思考题

  • 你知道 net-tools 和 iproute2 的“历史”故事吗?
    net-tools起源于BSD,自2001年起,Linux社区已经对其停止维护,而iproute2旨在取代net-tools,并提供了一些新功能。一些Linux发行版已经停止支持net-tools,只支持iproute2。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。net-tools中工具的名字比较杂乱,而iproute2则相对整齐和直观,基本是ip命令加后面的子命令。虽然取代意图很明显,但是这么多年过去了,net-tool依然还在被广泛使用,最好还是两套命令都掌握吧。

@FrankKai
Copy link
Owner Author

FrankKai commented Sep 10, 2018

第4讲 | DHCP与PXE: IP是怎么来的,又是怎么没的?

如何配置IP地址?

使用net-tools:
$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eh1 up
使用iproute2:
$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1

假设自己的机器想配置成192.168.1.46,结果配置成了10.23.42.1。
现在从192.168.1.46去ping 192.168.1.6。
配置错了会有什么影响? 发不出去包。
为什么发不出去包? Linux系统需要判断,只要网络上的包,都是完整的,可以有下层没上层,但是绝对不可以没有上层没下层。有源IP地址10.23.42.1,也有目标IP地址192.168.1.6,但是由于MAC层没填,所以发不出去。

源MAC地址可以获取,目标MAC地址呢?
是192.168.1.6的MAC地址吗?不是。Linux会判断是否在一个网段,只有在一个网段,才会发送ARP请求,从而获取到MAC地址。
Linux发现目标机器和自己不在一个网段怎么办?
Linux默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发到网关。
若是跨网段发包,会怎么发呢?

  • 配置了网关的话,Linux会获取网关MAC地址,再把包发出去。
  • 没配置的话,发不出去。
  • 配置成目标IP网关?如果将网关配置为 192.168.1.6 呢?不可能,Linux 不会让你配置成功的,因为网关要和当前的网络至少一个网卡是同一个网段的,10.23.42.1 的网关不可能是 192.168.1.6。

由于这是一个跨网段调用,源IP和目标IP虽然正确,但是目标MAC地址是网关的MAC地址对不上号,因此发不成功。

IP: 10.23.42.1->192.168.1.6
MAC: 10.23.42.1本地MAC->10.23.42.1网关MAC(并不是预期的192.168.1.6的本地MAC)

所以,如果需要手动配置一台机器的网络IP,需要问清楚网管正确的IP地址。一般来说是在配置文件中,其中包括:CIDR、子网掩码、广播地址和网关地址。

动态主机配置协议(DHCP)

这是一个不用IT人员配置电脑IP的技术,大大解放配置IP的生产力。

  • 网关配置一段共享的IP地址
  • 新接入机器通过DHCP协议,自动申请IP并配置
  • 机器断开,将申请的IP还回去,之后供新接入的机器使用

数据中心与公司私网的区别?

  • 数据中心相当于自己买房装修,IP地址配置好,基本不会变。
  • 公司私网相当于租房,因为不用自己装修,DHCP会帮我们配置IP,用完退租即可。

解析DHCP的工作方式

  • DHCP Discover,只知道自己的MAC地址,沟通全靠吼
    • 新来的机器用0.0.0.0发广播包,目的IP是255.255.255.255
    • 这个广播包封装在UDP,UDP封装在BOOTP里。DHCP是BOOTP的plus版,抓包分析时,还是BOOTP的协议。
    • Boot request,我有MAC地址,求一个IP!
      image
  • DHCP Offer, DHCP Server为新来的机器分配一个IP地址,还会包括子网掩码、网关以及IP地址租用期等信息。DHCP Server,由网管配置,管理着IP。Server通过MAC给机器分配IP。
    image
    只有一个DHCP Server吗,若是有多个DHCP Server呢?
    若是有多个DHCP Server,那么新机器会接收到多个IP地址。它会选择其中的一个Offer,并给向网络发送一个DHCP Request广播包,其中包含客户端MAC地址,接受的租约中的IP地址,提供此租约的DHCP服务器地址,此时其他没被接收的DHCP Server会撤销为新机器提供的IP地址,以便提供给下一个IP租用请求者。
    image
    在什么位置接受IP呢? 在BOOTP里面,接受某个DHCP Server的分配的IP。
    DHCP会有回复广播包给到新机器吗? 在DHCP Server接收到客户机的DHCP Request后,会广播返回给客户机一个DHCP ACK消息包,表明已经接收,并且将IP地址的合法租用信息及其他配置信息放入广播包,欢迎加入。
    image

总结一下:

  • DHCP Discover 新机器带着MAC地址吼了一个Boot request,谁给我分配一个IP啊?
  • DHCP Offer
    • Offer收割 DHCP Server1表示愿意为新机器发Offer,DHCP Server2也表示愿意为机器发Offer,通过Boot reply的方式,此处的Offer指的是IP地址
    • Offer选择 新机器看到自己可以选择这么多Offer IP,受宠若惊,他会选择其中一个Offer,此时再次通过Boot request发出自己想要接受的IP
    • Offer确认 被选中的DHCP Server,会在Boot reply中返回一个DHCP ACK,表明接受了新机器的选择,从今往后这个IP就归你使用,当然是在一定的租约范围内

其实一台机器加入到一个新的网络,然后DHCP Server为其分配IP地址的过程,非常类似于一个大牛求职者求职的过程,当这个大牛有换个坑的意向时,各种猎头会来联系他,瞬间他就会拥有很多面试,并且选择感兴趣的几家去面试,不出意外的话,在这之后,他会收获到很多Offer,在经过一番认真思考过后,他会选择其中一家的Offer,并且告诉其他公司"有机会再一起合作"。

IP地址的收回和续租

IP续租前和租房子一样,需要提前告诉DHCP Server。
客户机在什么时候发起续租申请? 在租期过去50%的时候,向DHCP Server发送DHCP request,DHCP Server返回DHCP ACK消息包,其中包含新租期和其他TCP/IP参数,更新配置,IP租用更新完成。

闻所未闻:网络管理员不仅能自动分配IP地址,还能帮我们安装操作系统!

预启动执行环境(PXE)

  • BIOS与操作系统的关系?BIOS是一个特别特别小的小系统,用来启动硬盘GRUB,GRUB加载内核、加载inittramfs文件,内核初始化操作系统。数据中心的网管通常会在BIOS安装PEX客户端,这样计算机启动时,BIOS把PXE客户端放入内存,就可以连接上服务端进行操作了。
  • 为什么叫PXE?安装系统之前,启动扇区都没有,因此这个过程叫做预启动执行环境。(Pre-boot Execution Enviroment),PXE。
  • PXE客户端如何知道PEX服务器?PXE协议分为客户端和服务器端,客户端最初没有操作系统,因此只能将操作系统放在BIOS里面。DHCP Server为客户端分配IP,但是不知道服务器IP。浏览器访问资源,主动告诉IP地址;微服务间相互调用,配置中说明。
  • DHCP协议在云计算中有用吗?DHCP协议可以给客户推荐PXE,从而安装操作系统,在云计算领域大有用处。

PXE客户端若想知道PEX服务器端的IP地址,需要在DHCP Server中指明:

ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0
{
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option time-offset -18000;
default-lease-time 21600;
max-lease-time 43200;
range dynamic-bootp 192.168.1.240 192.168.1.250;
filename "pxelinux.0";
next-server 192.168.1.180;
}

PXE客户端访问PXE服务器端的额外配置:

next-server:指向PXE服务器的地址
 filename:初始启动文件

@FrankKai
Copy link
Owner Author

FrankKai commented Sep 14, 2018

第5讲 | 从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?

2台机器在物理层组一个LAN(局域网)即可,有3台机器的时候,该怎么组网呢?

  • 这个包时发给谁的?应该谁接收?
  • 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
  • 发送时出现了错误,怎么办?

这些问题都是二层,即数据链路层,MAC(Medium Access Control,媒体访问控制)层解决的问题。

MAC层控制的是什么?

控制谁先发,谁后发的问题,防止发生混乱。专业名称叫多路访问。

大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?

多路访问的几种实现方式

  • 信道划分 多个车道,每个车一个车道。
  • 轮流协议 单双号限行,今天单号,明天双号。
  • 随机接入协议 先出门,堵了就回去,错过高峰出门。以太网就是这种方式

发给谁?谁接收?

image

  • MAC地址
  • 网络包格式(网络包组成)
  • 网络包类型(IP类型,TCP,UDP,HTTP等)

明明是数据链路层,为什么叫MAC层?

这时需要用到一个物理地址,叫做链路层地址,但是因为第二层主要解决媒体接入控制,因此也这个地址也叫MAC地址,这也是第二层叫MAC层的主要原因。

一次目标机器接收数据包会发生什么?

1.目标机器MAC网卡发现数据包,接收MAC包
2.打开IP包,发现IP是自己
3.打开TCP包,发现端口也是自己,80
4.nginx监听80,nginx返回网页
ARP协议也解决了"发给谁,谁接收"的问题。

发送时出现了错误,怎么办?

CRC,循环冗余检测。

私有局域网通信非常重要的ARP协议

已知:源IP地址,源MAC地址,目标IP地址
未知:目标MAC地址
假设192.168.0.23与192.168.0.46通信,23发送一个广播包,46谁来回答。

  • 1.查看本地ARP表
  • 2.广播ARP请求
  • 3.ARP应答
  • 4.缓存IP-MAC映射(避免频繁ARP请求,因为IP会变化,所以ARP MAC地址缓存有过期时间)
    image

知道目标MAC地址是否就是连接了某个口的电脑的MAC地址呢?

交换机(可以将MAC头拿下来,检查一下目标MAC地址,根据策略转发的设备)

MAC1给MAC2发包时交换机工作流程

  • MAC1将包发送到交换机
  • 交换机记住MAC1,以便以后发送包
  • 交换机将包转发给除MAC1外的所有机器

一段时间之后,交换机会准确记住所有机器的MAC地址,基本不用广播,精确转发网络包。但是因为机器IP会变,因此交换机的转发表有过期时间,这与IP-MAC映射表类似。

@FrankKai
Copy link
Owner Author

FrankKai commented Sep 15, 2018

第6讲 | 交换机与VLAN:办公室太复杂,我要回学校

拓扑结构是怎么形成的?

一般来说,公司里会有很多机器,每台机器对应一个网口,少则几十台,多则几百台,上千上万台,此时一个交换机就不够用了,需要多台交换机,交换机之间连接起来,就形成了一个复杂的拓扑结构

一个跨局域网的ARP请求

image
一个完整的ARP请求过程:
机器1在LAN1广播->交换机A转发消息到LAN2->交换机B在LAN3广播->机器4收到广播消息并返回MAC地址
笔记:交换机在开始时不知道任何拓扑信息,因此接到消息都是以广播的形式发送。

经过一次ARP请求之后,交换机A和B会记住机器一所属的局域网,当机器2访问机器1的时候,交换机A不会再把消息广播到LAN2和LAN3。当机器3给机器1发送ARP请求的时候,交换机B由于知道机器1在LAN1,所以不会在LAN3进行广播,交换机A会在LAN1中广播。

STP协议中难以理解的概念

计算机网络中的生产树算法,叫做STP,全称Spanning Tree Protocol。

  • Root Bridge,根交换机,树根。
  • Designated Bridges,指定交换机,树枝,转发交换机间信息。
  • Bridge Protocol Data Units(BPDU),网桥协议数据单元。"相互比较实力"的协议。
  • Priority Vector,优先级向量。实力值越小越牛,一组ID数目[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID],层层比较下去。

如何解决环路问题?

STP 协议,将有环路的图变成没有环路的树,解决网络包迷路问题。

如何解决广播问题和安全问题?

物理隔离,独立的交换机。
虚拟隔离,VLAN,虚拟局域网,二层上加VLAN ID。

@FrankKai
Copy link
Owner Author

FrankKai commented Nov 2, 2018

第7讲 | ICMP 与ping:投石问路的侦察兵

  • 网络不通第一反应是ping,那么ping是如何工作的?

网络不通第一反应是ping,那么ping是如何工作的?

  • ping是通过ICMP协议工作的。ICMP全称为Internet Control Message Protocol,互联网控制信息协议。
  • ICMP封装在IP包,轻装上阵的侦察兵,源地址和目标地址。
  • ICMP报文不同类型,不同代码。主动请求代码8,主动应答代码0。
  • ping是查询报文,是一种主动请求,并且获得主动应答的ICMP协议。
  • ping的主动请求,叫做ICMP ECHO REQUEST;主动回复,叫做ICMP ECHO REPLY。
  • ping比原生ICMP协议,多了标识符区分目的,多了编号说明网络状况,多了时间,计算往返时间。

差错报文类型

  • 终点不可达为3。
    • 网络不可达,代码为0。
    • 主机不可达,代码为1。
    • 协议不可达,代码为2。
    • 端口不可达,代码为3。
    • 分片不可达,代码为4。
  • 源抑制为4。
    • 源站抑制,让源站放慢发送速度。
  • 超时为11。
    • 时间超时,网络包在自己的生存时间内,还是没到目标主机。
  • 重定向为5。
    • 路由重定向。挑出更快的网络包到达方式。

分析ping的工作原理

image

  • 类型字段和顺序号,发送一个数据包,顺序号加1,网络包插入发送时间计算RTT。
  • 发起请求的机器发送请求包,被ping的机器返回应答包。

遇到网络不通的情况怎么办?

  • 脑海中必须要有清晰的网络拓扑图,清楚知道从源主机到目标主机间经过了哪些设备,逐个ping中间的这些设备或者机器。
  • 关键点通过tcpdump -i eth0 icmp查看包的到达情况。
  • ping不通不代表网络不通,需要用telnet和其他协议测试网路是否畅通。

Traceroute

  • Traceroute可以故意设置特殊的TTL,追踪去往目的地时沿途经过的路由器。
  • 故意设置部分片,从而确定路径的MTU。

报文

  • ping主动探查
  • Traceroute异常报告

ping实验

可以直接ping一个域名,通过本地的hosts文件进行DNS映射。

ping通

192.168.0.144 -> 192.168.0.111

ping 192.168.0.111
PING 192.168.0.111 (192.168.0.111): 56 data bytes
64 bytes from 192.168.0.111: icmp_seq=0 ttl=64 time=0.565 ms
64 bytes from 192.168.0.111: icmp_seq=1 ttl=64 time=0.599 ms
64 bytes from 192.168.0.111: icmp_seq=2 ttl=64 time=0.567 ms
64 bytes from 192.168.0.111: icmp_seq=3 ttl=64 time=0.581 ms
64 bytes from 192.168.0.111: icmp_seq=4 ttl=64 time=0.587 ms
64 bytes from 192.168.0.111: icmp_seq=5 ttl=64 time=0.557 ms
64 bytes from 192.168.0.111: icmp_seq=6 ttl=64 time=0.566 ms
^C
--- 192.168.0.111 ping statistics ---
7 packets transmitted, 7 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.530/0.604/0.877/0.094 ms

1.发送了7个icmp主动探查包,全部接收到。
2.ttl=64代表什么?time to live,IPv4协议下,TTL是20的第9个八位字节。在IPv6标头中,它是40的第8个八位字节,建议的初始TTL值为64。
3.time是什么意思?应答包到达时间 - 探查包发出时间,min,avg,max,stddev(标准差)。

ping不通

192.168.0.144 -> 192.168.0.146

ping 192.168.0.146
PING 192.168.0.146 (192.168.0.146): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
Request timeout for icmp_seq 5
Request timeout for icmp_seq 6
^C
--- 192.168.0.146 ping statistics ---
7 packets transmitted, 0 packets received, 100.0% packet loss

0~6就是ping主动探查ICMP报文的顺序号,发送了8个ICMP请求网络包,没有一个到达,100丢包率。

监听icmp

192.168.0.144对网卡en0开启监听,tcpdump -i en0 icmp
crm.test.weidiango.com(192.168.0.146)发起ping请求,ping 192.168.0.144

tcpdump -i en0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:56:00.779712 IP crm.test.weidiango.com > 192.168.0.144: ICMP echo request, id 1, seq 1, length 40
14:56:00.779808 IP 192.168.0.144 > crm.test.weidiango.com: ICMP echo reply, id 1, seq 1, length 40
14:56:01.782639 IP crm.test.weidiango.com > 192.168.0.144: ICMP echo request, id 1, seq 2, length 40
14:56:01.782712 IP 192.168.0.144 > crm.test.weidiango.com: ICMP echo reply, id 1, seq 2, length 40
14:56:02.790405 IP crm.test.weidiango.com > 192.168.0.144: ICMP echo request, id 1, seq 3, length 40
14:56:02.790463 IP 192.168.0.144 > crm.test.weidiango.com: ICMP echo reply, id 1, seq 3, length 40
14:56:03.798310 IP crm.test.weidiango.com > 192.168.0.144: ICMP echo request, id 1, seq 4, length 40
14:56:03.798367 IP 192.168.0.144 > crm.test.weidiango.com: ICMP echo reply, id 1, seq 4, length 40
8 packets captured
6554 packets received by filter
0 packets dropped by kernel
ping 192.168.0.144
64 bytes from 192.168.0.144: icmp_seq=0 ttl=64 time=0.565 ms
64 bytes from 192.168.0.144: icmp_seq=1 ttl=64 time=0.599 ms
64 bytes from 192.168.0.144: icmp_seq=2 ttl=64 time=0.567 ms
64 bytes from 192.168.0.144: icmp_seq=3 ttl=64 time=0.581 ms
...

知识点:

  • 探查包确实发出的是ICMP echo request,应答包发出的ICMP echo reply。
  • ICMP echo request与ICMP echo reply的顺序号一一对应。
  • 捕获到8个icmp包,6554个包被过滤。

有没有一种简单粗暴的不用工具查看网络包的命令?

tcpdump -i en0 <protocol>

这里的协议可以是udp, tcp, icmp, ip, arp, vlan, stp等等,但不能是https, http, rpc等等。
当不填协议类型时,将会监听到所有的当前网卡的网络包。

@FrankKai
Copy link
Owner Author

FrankKai commented Nov 2, 2018

第8讲 | 世界那么大,我想出网关:欧洲十国游与玄奘西行

  • 你知道MAC头和IP头的细节吗?
    image

Gateway知识点

  • 若两台机器不在同一网段,那么就需要默认网关,Gateway。
  • Gateway的地址总是和源ip地址在一个网段的,例如源ip为192.168.1.144,那么Gateway的地址要么是192.168.1.1,要么是192.168.1.2。此时网段为192.168.1.0/24。
  • 网关往往是一个路由器,是一个三层转发的设备。
  • 服务器做网关,有多个网卡,有一个网卡和源IP同网段。
  • 路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。
  • 静态路由,路由器上,逐条匹配规则。
  • 不改变IP地址:转发网关;改变IP地址:NAT网关。
    IP头和MAC头哪些变,哪些不变?
  • 欧洲十国游 源和目的IP不变,像是欧洲各国间旅游,一个签证即可。下一跳指IP头转换为MAC头。
  • 玄奘西行 NAT Network Address Translation,NAT。MAC和IP头都会变。
    image

家里的网络和邻居的网络不能互访吗?

不能,虽然都是192.168.1.x,都被家用路由器NAT成了运营商的地址了。

私网IP和公网IP哪个贵?

当然是公网IP贵,这个可以被很多人访问到。但是私网IP仅仅被办公室或者实验室里的人访问到。所以办公室一般只要一到两个出口IP地址。

如何查看自己的出口IP地址?

https://www.whatismyip.com/

总结

  • 离开局域网就要经历网关
  • 路由器是三层设备,一层MAC,一层IP,一层内容,关键在于下一跳
  • IP不变,不换护照额欧洲十国游;IP变,换护照的玄奘西行。MAC始终会变。

@FrankKai
Copy link
Owner Author

FrankKai commented Nov 8, 2018

第9讲 | 路由协议:西出网关无故人,敢问路在何方

通过目的IP地址配置路由

  • 目的网络:包想去哪儿?
  • 出口设备:包从哪个口出去?
  • 下一跳网关:下一个路由器的地址。

ip route add 10.176.48.0/20 via 10.173.32.1 dev eth0
就说明要去 10.176.48.0/20 这个目标网络,要从 eth0 端口出去,经过 10.173.32.1。

配置策略路由

除IP地址外,根据入口设备、TOS等选择路由表。

ip rule add from 192.168.1.0/24 table 10 
ip rule add from 192.168.2.0/24 table 20

从 192.168.1.10/24 这个网段来的,使用 table 10 中的路由表,而从 192.168.2.0/24 网段来的,使用 table20 的路由表。

还可以按走多路由:

ip route add default scope global nexthop via 100.100.100.1 weight 1 nexthop via 200.200.200.1 weight 2

下一跳可以是两个地方,100.100.100.1和200.200.200.1,权重分别是1和2.

房东太良心,拉了两个运营商的宽带,因此家里的路由器也换成了可以接2个外网的路由器,一个网速快,一个网速慢。(租房的小伙伴们,如果房东再跟你说家里网速慢没法解决,你可以用处这一招,电信,移动,联通统统接进来。当然,最好是自己买房。)
image

$ ip route list table main 
60.190.27.189/30 dev eth3  proto kernel  scope link  src 60.190.27.190
183.134.188.1 dev eth2  proto kernel  scope link  src 183.134.189.34
192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.1
127.0.0.0/8 dev lo  scope link
default via 183.134.188.1 dev eth2

路由器规则:

  • 如果去运营商二,就走 eth3;
  • 如果去运营商一呢,就走 eth2;
  • 如果访问内网,就走 eth1;
  • 如果所有的规则都匹配不上,默认走运营商一,也即走快的网络。

若有用户仅仅上个网页,网费便宜一点,怎么办?
1.添加新路由表

# echo 200 chao >> /etc/iproute2/rt_tables

2.添加规则,让新来的路由表都走新路由表

# ip rule add from 192.168.1.101 table chao
# ip rule ls
0:    from all lookup local 
32765:    from 10.0.0.10 lookup chao
32766:    from all lookup main 
32767:    from all lookup default

3.默认路由走慢的

# ip route add default via 60.190.27.189 dev eth3 table chao
# ip route flush cache

动态路由算法

最短路径的两种算法:

  • Bellman-Ford算法
  • Dijkstra算法

1.距离矢量路由算法

distance vector routing,基于Bellman-Ford算法。
关键信息:目标路由器,到目标路由器的距离。

问题1:好消息传的快,坏消息传的慢(hhhhhhhhh,这个图也太逗了。
image
问题2:每次发送,都要发送整个全局路由表
早期路由协议RIP就是这个算法,适用于小于15跳的小型网络。

所以距离矢量路由算法的最大问题是:限制了网络的规模。

2.链路状态路由算法

link state routing,基于Dijkstra算法。
这种算法采用的是广播的方式,类似事件发布订阅的方式。
算法基本思路是:路由器启动,发现邻居,然后echo,邻居回复,计算出距离,然后将当前路由与邻居间的链路状态包广播出去,发送到整个路由器的每个路由器。这样每个路由器都对整个网络的宏状态有很清晰的认识,利用这个图,再使用Dijkstra算法,找出两点间最短路径。

这种算法与异步思想契合,更新只要发送广播更新的或者改变的拓扑,非常节省带宽和CPU利用率。

动态路由协议

1.基于链路状态路由算法的OSFP(内)
  • 内网路由协议
  • OSFP(Open Shortest Path First,开放式最短路径优先),多用于数据中心内部,因此称为内部网关协议(Interior Gateway Protocol,简称IGP)。
  • 等价路由指的是,OSFP在发现的多个最短路径中,进行负载均衡LVS,做到高吞吐量的接入层设计。
2.基于距离矢量路由算法的BGP(外)
  • 外网路由协议
  • BGP(Border Gateway Protocol)
  • 每个数据中心都有自己的Policy,不能全从我家走
  • 自治系统AS(Autonomous System)
    • Stub AS:对外仅有一个连接,不传其他AS的包。例如,个人或者小公司网络。
    • Multihomed AS:多个连接连到其他AS,但是大多数拒绝帮其他的AS传输包。例如,大公司的网络。
    • Transit AS:多个连接连到其他AS,帮助其他的AS传输包。例如,主干网。
  • BGP分为2类:eBGP(AS间广播)和iBGP(内部路由找到最好的路由器)。
  • BGP协议算法是路径矢量路由协议(path-vector Protocol),distance vector protocol的升级版。

总结:

  • 静态路由可以配置如控制转发策略的复杂策略路由。
  • 动态路由算法:距离矢量(BGP)和链路状态(OSFP)。

@wolfking0815
Copy link

能分享下pdf文档么? 我在英国 国内的网站下载动不动就要金币之类的 感觉不靠谱。。。

@tglxm
Copy link

tglxm commented Jun 7, 2022

老师的GitHub是哪个呀?他说写了一个实验教程放到GitHub上,但是我没找到

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants