本文为《趣谈网络协议》学习笔记,原文地址:趣谈网络协议_网络协议_网络编程-极客时间
例子:
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
网易考拉3周年主会场
分层模型:
接收请求流程:
发送请求流程:
特点:
linux查看ip地址指令:ifconfig/ ip addr
例子:
[root@VM-125-189-centos ~]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
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
2: eth1: mtu 1500 qdisc mq state UP qlen 1000
link/ether 52:54:00:8f:0d:2a brd ff:ff:ff:ff:ff:ff
inet 9.134.125.189/20 brd 9.134.127.255 scope global eth1
valid_lft forever preferred_lft forever
3: docker0: mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:64:a7:f5:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.1/24 brd 192.168.10.255 scope global docker0
valid_lft forever preferred_lft forever
IP地址分类:
各类型IP地址下机器数量:
组播地址(D类):使用这一类地址,属于某个组的机器都能收到。
例子中,eth1网络号有20位,可知子网掩码为 255.255.240(1111 0000).0,网络号为 9.134.112(0111 0000).0,广播地址为 9.134.127(0111 1111).255
d. 公有IP与私有IP
私有IP与公有IP区别:
MAC地址:网卡地址,16进制6byte表示,全局唯一
跨子网传输时不使用MAC地址定位的原因:MAC地址有一定的定位功能,不过范围过小。只有在子网下,才能通过ARP协议定位设备。一旦跨子网,MAC地址无法定位,需要使用IP地址
定义:排队规则,内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。
常用的排队规则:
linux网络包传输过程:
动态主机配置协议(DHCP):网络管理员配置一段共享IP地址,每一台新接入的机器通过DHCP协议,在这段共享IP中申请,使用完毕后自动归还
DHCP工作方式:
IP地址的收回与续租:
预启动执行环境PXE:用以远程安装操作系统,分为客户端和服务器端。
PXE工作方式:
集线器(Hub):工作在物理层,采用广播的模式,将接收到的每一个字节复制到其他端口上去
集线器需要解决的问题:数据包收发的地址的确定;冲突解决;发送时出现错误的解决。
链路层采用的解决策略:
1) 多个节点发送数据时,如何防止混乱(多路访问):
2) 数据包收发地址的确认
使用链路层地址(MAC地址)确定子网内目的与源地址。数据包在链路上广播,MAC层的网卡根据数据包的目的MAC地址判断数据包是否是发送给他的。若是,接受包,并获取IP头,若IP地址与本机一致,则继续获取TCP头,根据端口号转发数据包至本地进程
3) 发送出现错误时的校验
对于以太网,链路层的数据包最后是CRC(循环冗余校验)。通过XOR异或算法来计算整个包在传输时是否出现错误
ARP协议:通过IP地址,获取MAC地址的协议
ARP协议流程:
HUB设备问题:Hub是广播,无论某个接口是否需要,所有数据都会被发送。当接入的节点较多,就容易产生冲突。
交换机:可以将数据包的MAC头取下来,校验目的MAC地址,根据策略转发的设备。交换机属于二层设备
交换机学习每个口的节点的MAC地址流程:
环路问题:
机器1发送数据至机器2,交换机A将广播发送到局域网2;
1)交换机B右侧端口可以收到交换机A广播的数据,交换机B左侧也可以收到机器1发送的数据,因此交换机B无法确定机器1来自左侧还是右侧
2)机器1发送的数据,经过路径 A左 A右 B右 B左 A左 不断循环,占用网络资源
STP协议概念:
BPDU网桥协议数据单元:生成树协议定义的数据包,网桥通过BPDU来相互通信,并用BPDU相关机能来动态选择根桥和备份桥。在一个生成树环境中,桥不会立即开启转发功能,必须先选定一个桥作为根桥,然后建立一个指定路径。
BPDU中的重要参数:
BPDU比较次序:根ID > 根路径消耗 > 桥ID > 端口ID (值越小越好)
STP工作过程:
1) 每个交换机网络选举一个根桥。将网桥ID(即交换机)最小者作为根交换机
2) 每个非根桥选举一个根端口。根端口用于接收根交换机发送的BPDU,也可用来转发普通流量。
根端口选举条件:
3) 每个段选举一个指定端口。指定端口在每一个网段上选出一个指定端口DP。指定端口DP转发根交换机发来的BPDU,也用来转发普通流量
指定端口选举条件:
4) 阻塞非指定端口。剩余端口成为备用端口,将其阻塞
详细可参考:新手都能看明白的VLAN原理(上) - 知乎
问题:交换机比集线器智能一些,但避免不了广播问题。解决方法有两种,一种是物理隔离,一种是虚拟隔离(VLAN)。使用VLAN,一个交换机会连属于多个局域网的机器
交换机区分机器属于哪个局域网的方法:
ICMP协议的格式(互联网控制报文协议):ICMP报文是封装在IP包里面的,因为传输是,需要带上源地址和目的地址
ping:ping是查询报文,是一种主动请求,并且获得主动应答的ICMP协议。相对于ICMP,ping多了两个字段,一个是标识符,一个是序号。ping还会存放发送请求的时间值,计算往返时间
ping发送过程:
ping接收过程:
在规定时间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;若收到应答包,则说明可达,此时,源主机用当前时刻减去该数据包最初从源主机上发出的时刻,得到 ICMP 数据包的时间延迟
差错报文结构:IP+ICMP+出错的IP包的IP头和IP正文的前8个字节
ICMP差错报文例子:
Traceroute:
追踪去往目的地时沿途经过的路由器工作原理:
确定路径的 MTU工作原理:
MAC头结构:目标MAC地址;源MAC地址;协议类型
IP头结构:版本号(IPV4);服务类型 TOS;TTL;源IP地址;目标IP地址
IP包发送流程:
定义:在路由器上,配置一条一条规则
1) 转发网关
定义:不改变 目的IP 地址的网关
流程:
特点:
2) NAT 网关
定义:改变目的IP 地址的网关。在局域网内部使用内部地址,当内部节点要与外部网络进行通讯时,在网关处将内部地址替换成公用地址
转发网关的问题:局域网之间没有商量过,各定各的网段,有可能会出现IP 段冲突
流程:
特点:
3) NAPT
基础的NAT(只进行 IP 地址的转写)可以说是运行在第三层的,但这种NAT并没有缓解IP紧张的问题。NAPT则可以
对于 NAPT,应该区分传出(客户端)和传入(服务器)两种情况:
路由表:一个入口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量。这个转发信息库通常被称为路由表。
路由规则:一张路由表中会有多条路由规则。每一条规则至少包含这三项信息:目的网络、出口设备、下一跳网关
路由表配置:通过 route 命令和 ip route 命令都可以进行查询或者配置。例子:
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 地址配置路由外,还可以根据多个参数来配置路由,这就称为策略路由
例子1:
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:
假设:
根据拓扑图,可将路由配置为:
$ ip route list table main
60.190.27.189/30 dev eth3 proto kernel scope link src 60.190.27.190
// 如果去运营商二,就走 eth3
183.134.188.1 dev eth2 proto kernel scope link src 183.134.189.34
// 如果去运营商一,就走 eth2
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.1
// 如果访问内网,就走 eth1
127.0.0.0/8 dev lo scope link
default via 183.134.188.1 dev eth2
// 如果所有的规则都匹配不上,默认走运营商一,也即走快的网络
策略路由的使用(使得租户A只能通过运营商2访问公网):
1) 添加一个 Table
# echo 200 chao >> /etc/iproute2/rt_tables
// 添加chao表
2) 添加路由规则
# ip rule add from 192.168.1.101 table chao
// 租户A通过chao表路由
3) 在 chao 路由表中添加规则
# ip route add default via 60.190.27.189 dev eth3 table chao
// 路由规则匹配不上,默认走eth3(运营商2)
# ip route flush cache
应用场景:网络环境复杂并且多变,如果总是用静态路由,一旦网络结构发生变化,让网络管理员手工修改路由太复杂了,因而需要动态路由算法。
目的:为所有路由器找到并使用汇集树(此节点到所有其他节点的最优路径形成的树)
1) 距离矢量路由算法
基本思路:
特点:
2)链路状态路由算法
基本思路:当一个路由器启动的时候,首先是发现邻居,向邻居 say hello,邻居都回复。然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。因而,每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。
dijkstra算法实现:
package netLearn.Dijkstra;
import java.util.Arrays;
public class dijkstra {
public static final int MAX = Integer.MAX_VALUE;
public static void main(String[] args) {
int[][] data = {
{0, MAX, 10, MAX, 30, 100},
{MAX, 0, 5, MAX, MAX, MAX},
{MAX, MAX, 0, 50, MAX, MAX},
{MAX, MAX, MAX, 0, MAX, 10},
{MAX, MAX, MAX, 20, 0, 60},
{MAX, MAX, MAX, MAX, MAX, 0}
};
dijkstra dj = new dijkstra(data, 0);
dj.deal();
}
private int[] dis;
private int[] father;
private int[] flags;
private int[][] data;
private int begin;
public dijkstra(int[][] data, int begin) {
dis = new int[data.length];
father = new int[data.length];
flags = new int[data.length];
this.data = data;
this.begin = begin;
}
public void deal() {
for (int i = 0; i < dis.length; i++) {
dis[i] = MAX;
father[i] = -1;
flags[i] = 0;
}
dis[begin] = 0;
while (true) {
// 找出最小的且未标记的值作为开始
int minDis = MAX;
int nextNode = -1;
for (int i = 0; i < data.length; i++) {
if (flags[i] == 0 && dis[i] < minDis) {
minDis = dis[i];
nextNode = i;
}
}
if (nextNode == -1) {
break;
}
flags[nextNode] = 1;
// 从结点出发,更新表
int[] childs = data[nextNode];
for (int child = 0; child < childs.length; child++) {
if (data[nextNode][child] != MAX && child != nextNode) {
int cos = dis[nextNode] + data[nextNode][child];
if (cos < dis[child]) {
dis[child] = cos;
father[child] = nextNode;
}
}
}
}
System.out.println(Arrays.toString(dis));
System.out.println(Arrays.toString(father));
}
}
特点:
不像距离距离矢量路由协议那样,更新时发送整个路由表。链路状态路由协议只广播更新的或改变的网络拓扑,这使得更新信息更小,节省了带宽和 CPU 利用率。而且一旦一个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。
1) 基于链路状态路由算法的 OSPF
定义:开放式最短路径优先是一个基于链路状态路由协议,广泛应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议(Interior Gateway Protocol,简称 IGP)。
目标:OSPF重点是找到最短的路径。在一个组织内部,路径最短往往最优。有时候 OSPF 可以发现多个最短的路径,可以在这多个路径中进行负载均衡,这常常被称为等价路由。
2) 基于距离矢量路由算法的BGP
定义:外网的路由协议。我们称为外网路由协议(Border Gateway Protocol,简称 BGP)
自治系统 AS(Autonomous System)分类:
自治系统特点:每个自治系统都有边界路由器,通过它和外面的世界建立联系
BGP分类:
BGP协议核心算法:路径矢量路由协议。在 BGP 里面,除了下一跳 hop 之外,还包括了自治系统 AS 的路径,从而可以避免坏消息传得慢的问题