当前位置:网站首页>趣谈网络协议

趣谈网络协议

2022-04-23 13:58:00 阿月浑子2021

极客时间-轻松学习,高效学习-极客邦

目录

一、为什么要学习网络协议

1、为什么要学习网络协议

2、要学习的网络协议

二、ip addr

三、DHCP与PXE

1、DHCP

2、PXE

四、从物理层到MAC层

1、物理层

2、数据链路层

五、交换机与VLAN

六、ICMP与ping

1、查询报文类型

2、差错报文类型:


一、为什么要学习网络协议

协议的三要素:语法、语义、顺序

1、为什么要学习网络协议

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

【以网上下单为例】

在浏览器里输入一个电商网址,浏览器会通过DNS或更为精确的HTTPDNS查找具体IP。

找到目标地址后,浏览器就开始打包它的请求。对于普通的浏览请求,往往使用HTTP协议,但对于购物的请求,往往需要进行加密传输,因而会使用HTTPS协议

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

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

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

操作系统启动的时候,会被DHCP协议配置IP地址,以及默认网关的IP地址192.168.1.1,拿到目标IP地址后,操作系统通过ARP协议找到默认网关的MAC地址,于是,将IP包交给下一层,也就是MAC层,网卡再讲包发出去,使其到达网关。

网关和网关之间沟通的协议成为路由协议,常用的有OSPF和BGP。

得益于网关之间的沟通,网络包可以从一个网关拿到下一个网关的MAC地址,直到找到目标服务器。

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

在这一层,对于收到的包,都有一个回复的包说明收到了(仅仅是TCP层的一个说明,不是下单请求的结果)。

如果过了一段时间,发送端未收到回复,发送端的TCP层就会重新发送这个包(重新发送指TCP端的重试,并非浏览器将下单这个动作重新请求一遍,除非是TCP出了问题,如连接断了)。

网络包平安到达TCP层之后,TCP头中有目标端口号,通过端口号,可以找到电商网站的进程正在监视的端口号。

电商网址的进程得到HTTP请求的内容,会通过RPC调用(远程过程调用)来告诉相关的进程应该做什么事。

相关进程都处理好后,就回复一个HTTPS的包,告知下单成果,这个包最终进入发送端浏览器,显示支付成功。

2、要学习的网络协议

应用层:DHCP  HTTP  HTTPS  RTMP  P2P  DNS  GTP RPC

传输层:UDP  TCP

网络层:ICMP  IP  OSPF  BGP  IPSec  GRE

链路层:ARP  VLAN  STP

物理层:网络跳线

二、ip addr

IP地址是一个网卡在网络世界的通讯地址

MAC地址是一个网卡的物理地址,它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可用不用担心冲突。MAC地址的通信范围局限在一个子网里面。

IP地址在设计时低估了未来网络的发展,32位地址远远不够使用(于是有了IPv6(128位))

本就不够用的32位IP地址还被分成5类,其中B类地址能包含的最大主机数量有6w+,一般企业基本达不到这个规模,闲置地址造浪费,而C类地址能包含的最大主机数量又太少,只有254个。于是产生了一个折中的法子叫作无类型域间选路。

无类型域间选路(CIDR):将32位IP地址一分为二,前面是网络号,后面是主机号。如:10.100.122.2/24,表示32位中,前24位是网络号,后8位是主机号。

CIDR可以用来判断一个IP地址是不是本地地址。

伴随着CIDR存在的一个是广播地址,10.100.122.255,如果发送这个地址,所有10.100.122网络里面的机器都可以收到。另一个是子网掩码,255.255.255.0。

将子网掩码和IP地址进行AND计算,可以得到网络号。

D类是组播地址,使用这一类地址,组内成员机器都可以接受到信息

linux中 执行 ip addr得到的返回信息:

 

 scope:对于 eth0 这张网卡来讲, global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信。
 
lo :全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现。
 
< BROADCAST,MULTICAST,UP,LOWER_UP > :是net_device flags,网络设备的状态标识。
UP 表示网卡处于启动的状态;
BROADCAST 表示这个网卡有广播地址,可以发送广播包;
MULTICAST 表示网卡可以发送多播包;
LOWER_UP 表示 L1 是启动的,也即网线插着呢。
 
MTU1500 :指最大传输单元 MTU 为 1500,是以太网的默认值。
MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。
 
qdisc :queueing discipline 排队规则。内核如果需要通过某个网络接口发送数据包,就需要按照为这个接口配置的qdics把数据包加入队列。最简单的 qdisc 是 prifo ,它不对数据包做任何处理,数据包采用先入先出的方式通过队列。prifo_first 的队列包括三个波段(band),数据包按照服务类型(Type of Service,TOS)被分配到不同波段,三个波段优先级不同,波段内部先进先出。

三、DHCP与PXE

1、DHCP

DHCP(Dynamic Host Configuration Protocol):动态主机配置协议。

工作方式:

当一台机器新加入一个配置了DHCP Sever网络的时候,首先会进行 DHCP Discover,即使用IP地址0.0.0.0发送一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。DHCP是BOOTP的增强版,但如果抓包的话,很可能看到的名称还是BOOTP协议。

在这个广播包里,新来的机器进行Boot request。

DHCP Sever就会分配给它一个IP地址,这个过程称为DHCP Offer。同时,DHCP Sever会保留此IP地址,不再为其它机器分配。此时,DHCP Sever也使用广播地址作为目的地址,因为,当下请求分配IP的新机器还没有自己的IP,除此之外,服务器还发送的子网掩码、网关、和IP地址的使用期限等信息。

如果有多次DHCP Sever,这台新机器就会收到多个DHCP Offer,它会选择其中一个作为自己的IP地址,一般是最先到达的那个,并向网络发送一个DHCP Request 广播数据包,包含客户端的MAC地址、接受的IP地址、提供IP地址的DHCP服务器地址等,并告诉所有的DHCP Sever它将接受哪一台服务器提供的IP地址,同时请求其余DHCP Sever撤回它们提供的IP。

客户机会在IP使用期限过去50%的时候,直接向为其提供IP地址的DHCP Sever发送DHCP request消息包。接到服务器回应的DHCP ACK包后,根据包中所提供的新的使用期限以及其他已经更新的TCP/IP参数,更新自己的配置,这样,IP使用期限就更新完成了。

2、PXE

网络管理员不仅能自动分配IP,还能安装操作系统

这个过程和操作系统启动的过程相似。

【附:操作系统启动过程】首先,启动BIOS,BIOS是一个特别小的小系统,只能做特别小的一件事,就是读取硬盘的MBR启动扇区,将GRUB启动起来,然后将权力交给GRUB,GRUB加载内核、加载作为根文件系统的initramfs文件,然后将权力交给内核,最后内核启动,初始化整个操作系统。

安装操作系统的过程,只能插在启动BIOS之前,因为没安装系统之前,连启动扇区都没有。因而,这个过程叫作预启动执行环境(Pre-boot Execution Environment),简称PXE

PXE协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在BIOS里面,当计算机启动时,BIOS将PXE客户端调入内存中,就可以连接服务端做一些操作了。

PXE的客户端启动起来后,会发送一个HDCP请求,让DHCP Sever为它分配一个IP地址。如果想使用PXE,除了IP地址,还需要配置next-sever,指向PXE服务器的地址,另外需要配置初始启动文件filename。这样,PXE客户端就知道PXE服务器在哪里了,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。

知道了这些后,PXE客户端就可以开始下载了,下载的时候使用的是TFTP协议,所以在PXE服务器上,往往还需要一个TFTP服务器,将PXE客户端要下载的文件传给它。

PXE客户端收到文件后,开始执行文件。这个文件会指示PXE客户端,向TFTP服务器请求计算机的配置信息pxelinux.cfg。TFTP服务器会给PXE客户端一个配置文件,里面会说内核在哪里、initramfs在哪里。PXE客户端会请求这些文件。

最后,启动Linux内核。

四、从物理层到MAC层

1、物理层

没有路由器的时候,两台电脑如何配置局域网(LAN)呢?

可以借助一根电脑连电脑的网线(以前交叉接线,水晶头用1-3、2-6交叉接法做交叉线。水晶头的第1、2和第3、6脚,分别起着收、发信号的作用,1-3、2-6交换位置。现在网卡自适应直连线了)网线一头插在一台电脑的网卡上,一头插在另一台电脑的网卡上,就能够在物理层面实现一端发送的信号,另一端可以收到的功能了。

当然,除了网线要交叉,还要配置这两台电脑的IP地址、子网掩码和默认网关。要想两台电脑能够通信,这三项必须配置成一个网络。

那么,如何将三台网络连在一起呢?除了交换机,还有一个叫Hub的东西,也就是集线器。这种设备有多个口,可以将多台电脑连接起来。但是,和交换机不同,集线器没有大脑,它完全在物理层工作,它会将自己收到的每一个人字节,都复制到其他端口上去。

这,是第一层物理层的联通方案。

2、数据链路层

Hub采用的是广播的模式,需要解决几个问题:

  1. 包是发给谁的?
  2. 多台机器同时发包会不会产生混乱?有没有先后规则
  3. 发送时出现错误该如何解决?

这几个问题都是数据链路层,也就是MAC层要解决的。

MAC的全称是Medium Access Control,即媒体访问控制,控制的是在往媒体上发数据的时候,谁先发,谁后发,防止发生混乱。解决的是第二个问题,问题中的规则叫多路访问。

解决方式:信道划分、轮流协议、随机接入协议

解决第一个问题,需要用到一个物理地址,叫作链路层地址,也叫MAC地址。

对于以太网,第二层的最开始,就是目标的MAC地址和源地址。

 

接下来是类型。大部分的类型是IP数据包,然后IP里面包含TCP、UDP以及HTTP等,这都是里层封装的事情。

有了目标MAC地址,数据包在链路上广播,MAC的网卡才能知道这个包是给它的。

MAC的网卡把包收起来,然后打开IP包,发现IP地址也是自己的,再打开TCP包,发现端口是自己,也就是nginx监听的80,于是将请求提交给nginx。

nginx返回一个网页。然后将网页发给需要发回请求的机器。然后层次封装,最后到MAC层。来时的源MAC地址,返回时变成目标地址,回到请求的机器。

对于以太网,第二层的最后面是CRC,也就是循环冗余检测。通过XOR异或的算法,来计算整个包是否在发送的过程出现错误,主要解决第三个问题。

还有一个问题,如果源机器不知道目标机器的MAC地址,该怎么办呢?

这就需要ARP协议,也就是已知IP地址,求MAC地址的协议

在一个局域网里面,发送一个广播包询问。

为了避免每次都用ARP请求,机器本地会进行ARP缓存。当然,机器会上线下线IP可能会变,所以ARP的MAC地址缓存过一段时间就会过期。

【附:RARP协议】没有硬盘的机器即无盘工作站,无法持久化IP地址带本地,但有网卡,所以可以用RARP协议来获取IP地址。RARP还可以应用于局域网管理员想指定机器IP(与机器绑定,不可变),又不想每台机器去设置静态IP的情况,能通过在RARP服务器上配置MAC和IP对于的ARP表,,不过获取每台机器的MAC地址也挺麻烦的。现在用BOOTTP和DHCP的更多了。

靠Hub组网的方式,一旦机器数目增多,就会出现问题。因为Hub是广播的,不管某个接口是否需要,所有的Bit都会被发送回去,然后让主机来判断是否需要,如此操作会造成很多浪费,且容易产生冲突。

哪种机器可以记住一台电脑的MAC地址,如果目标机器的MAC不是这台电脑的,就不向它转发呢?显然是能把MAC头拿下来,检查目标MAC地址,然后根据策略转发的二层设备交换机呀!

交换机怎么知道每个口的电脑的MAC地址呢?通过学习!

一台MAC1电脑将一个包发给MAC2电脑,当这个包第一次到达交换机的时候,交换机也不知道MAC2的电脑在哪个口,只能将包转发给除了来的那个口之外的所有口,同时,交换机会记住MAC1来自的口,以后有包的目的地址是MAC1时,直接发送到这个口就可以了。

当交换机工作一段时间后,就有了整个网络的一个结构了,这个时候,基本就不需要广播。当然,每个机器的IP地址会变,所在的口也会变,因而,转发表——也就是交换机的学习结果,也是有一个过期时间的。

五、交换机与VLAN

多台交换机连接在一起,就形成了拓扑结构。而拓扑结构过于复杂时,网线绕来绕去,不可避免会出现一些意外,其中最常见的就是环路问题(两个交换机将两个局域网同时连接起来)。

出现环路时,两个包转来转去,路就会堵,怎么破除环路呢?

在数据结构中,有一个方法叫最小生成树。有环的我们常称为图,将图中的环破了,就成了树。在计算机网络中,生成树的算法叫STP(Spanning Tree Protocol)。

STP协议中的一些概念:

Root Bridge:根交换机。

Designated Bridges:指定交换机。其他交换机通过指定交换机到达根交换机。

Bridge Protocol Data Units(BPDU):网桥协议数据单元。只有根交换机可以发,其他交换机只能传达根交换机的指示。

Priority Vector: 优先级向量。一组ID数目:Root Bridge ID,Root Path Cost(与根路由器的距离),Bridge ID,Port ID。值越小,优先级越高。

交换机数目过多会面临隔离问题,可以通过VLAN形成虚拟局域网。使用VLAN,一个交换机上会连属于多个局域网的机器。只需要在原来的二层的头上加上一个TAG,TAG里存放一个12位的VLAN ID,就可以区分机器是属于哪个局域网了。

如果我们买的交换机是支持VLAN的,当这个交换机把二层的头取下来,就能够识别这个VLAN ID,这样,只有相同VLAN的包,才会互相转发。这样,广播问题和安全问题就能解决了。

可以给设置交换机每个口所属的VLAN。

支持VLAN的交换机,有一种口叫Trunk口,它可以转发属于任何VLAN的口,交换机之间可以通过这种口互相连接。

六、ICMP与ping

ICMP全称Internet Control Message Protocol,互联网控制报文协议

网络包在复杂的网络环境中传输时,常常会遇到各种问题。当遇到问题的时候,要传出消息来,报告情况,才可以调整传输策略。

ICMP报文本身非常简单,是封装在IP包里面的。因为传输指令的时候肯定需要源地址和目标地址。

ICMP报文有很多类型,不同类型有不同的代码。最常用的类型是主动请求8,主动请求的应答为0

1、查询报文类型

常用的ping就是查询报文,是一种主动请求,并且主动获得应答的ICMP协议。ping发出的包也符合ICMP协议格式,只不过它在后面增加了自己的格式。

对ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST,同理,主动请求的回复,称为ICMP ECHO REPLY,比起原生的ICMP,这里面多了标识符和序号两个字段。在选项数据中,ping还会存放发送请求的时间值,来计算往返时间,说明路程长短。

ping:查询报文类型的使用

ping执行命令的时候,源主机首先会构建一个ICMP请求数据包,ICMP数据包内包含多个字段,最重要的两个,一个是类型字段,对于请求数据包而言该字段为8;另一个是顺序号,主要用于区分连续ping的时候发出的多个数据包。每发出一个数据包,顺序号会自动加1。为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间。

然后,由ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层。IP层将以192.168.1.2作为目的地址,本机IP地址作为源地址,加上一些其他控制信息,构建一个IP数据包。

接下来,需要加入MAC头。如果在本节ARP映射表中查找出IP地址192.168.1.2所对应的MAC地址,就可以直接使用;如果没有,则需要发送ARP协议查询MAC地址,获得MAC地址后,由数据链路层构建一个数据帧,目的地址是IP层传过来的MAC地址,源地址则是本机的MAC地址;还要附加一些控制信息,依据以太网的介质访问规则,将它们传送出去。

主机B收到这个数据帧后,先检查它的目的MAC地址,并和本机的MAC地址对比,符合就接收,不符合则丢弃。接收后检查该数据帧将IP数据包从帧中提取出来,交给本机的IP层。同样,IP层检查后,将有用的信息提取后交给ICMP协议。

主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。

在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 应答包,则说明目标主机可达。此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

如果跨网段的的话,还会涉及网关的转发、路由器的转发等。

如果在自己的可控范围内,当遇到网络不通的问题时,除了直接ping目标的IP地址之外,还应该有一个清晰的网络拓扑图。要清楚地知道一个网络包从源地址到目标地址都需要经过哪些设备,然后逐个ping中间的设备或机器。可能的话,在这些关键点,通过tcpdump -i eth0 icmp,查看包有没有到达某个点,回复的包到达了哪个点,可以更加容易推断出错的位置。

如果不再我们的控制范围内,很多中间设备都是禁止ping的,但是ping不通不代表网络不通,这个时候就要使用telnet,通过其他协议来测试网络是否畅通。

2、差错报文类型:

由异常情况发起的报告对应ICMP的差错报文类型

3终点不可达。其中网络不可达代码为0,主机不可达1,协议不可达2,端口不可达3,需要分片但设置了不分片4

4源抑制。即让源站放慢发送速度。

11超时。超过网络包的生存时间。

5重定向,让下次发给另一个路由器

差错报文的结构相对复杂一些,除了前面还是IP,ICMP的前8字节不变,后面则跟上出错的IP包的IP头和IP正文 的前8个字节。

不产生差错报文的情形:

  1. 对于携带ICMP差错报文的数据报,不再产生ICMP差错报文。如果主机A发送了一个ICMP的数据报文给主机B,数据在传输过程中经过其中一个路由器出现错误,由于该路由器已经接收到一个ICMP数据报文,所以不会再产生一个ICMP差错报文。
  2. 对于分片的数据报,如果不是第一个分片,则不产生ICMP差错报文 。对于主机A发送了一个分片的数据,如果路由设备或主机接收到的分片数据不是第一个分片数据,不会产生ICMP差错报文。
  3. 对于具有多播地址的数据报,不产生ICMP差错报文 。如果一个ip地址是一个广播地址的话,不会产生ICMP差错报文。
  4. 对于具有特殊地址如(127.0.0.0或0.0.0.0)的数据报,不产生ICMP差错报文。

Traceroute:差错报文类型的使用

Traceroute会使用ICMP规则,故意制造一些能够产生错误的场景。

Traceroute的第一个作用就是故意设置特殊的TTL(Time To Live生存时间值,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量),来追踪去往目的地时沿途经过的路由器。Traceroute的参数指向某个目的IP地址,它会发送一个UDP的数据包,故意将TTL设为1,这样,碰到第一个路由器后就会返回一个ICMP包,也就是网络差错包,类型是时间超时。

【附:关于Traceeoute发UDP,出错返回ICMP的原因:正常情况下,协议栈走到UDP,就会正常返回UDP,但是主机不可达是网络层(未到UDP,传输层),只会回ICMP(网络层),报文分片同理】

接下来,将TTL设置为2、3……如此反复,知道到达目标主机。这样,Traceroute就拿到了所有的路由器IP。当然,有的路由器不会回这个ICMP,这也是Traceroute一个公网的地址,看不到中间路由的原因。

怎么知道UDP有没有到达目的主机呢?Traceroute程序会发送一份UDP数据包给目的主机,但它会选择一个不可能的值作为UDP端口号(大于30000),当该数据包到达时,将使目的主机的UDP模块产生一份“端口不可达”错误ICMP报文。如果数据没有到达,则可能是超时。

Traceroute还有一个作用就是故意设置不分片,从而确定路径的MTU。要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度刚好与出口MTU相等。如果中间遇到窄的关口会被卡住,会发送ICMP网络差错包,类型为“需要进行分片但设置了不分片位”。每次收到ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

版权声明
本文为[阿月浑子2021]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_56814032/article/details/124360615