网略协议梳理(一)

为什么要学习网络协议?

协议三要素

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

  • 语法,就是这一段内容要符合一定的规则和格式。
  • 语义,就是这一段内容要代表某种意义。
  • 顺序,就是先干啥,后干啥

网络协议

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>

在浏览器里面输入 www.baidu.com.发生了什么(这是一个经典的面试题)

浏览器获取url之后通过DNS服务器或者HTTPSDNS服务器去查找域名对应的IP地址(一个IP可以对应多个域名)。

获取IP地址之后,浏览器开始生产http请求。对于普通的浏览请求,往往使用http协议,对于类似于购物这样的请求,往往需要进行加密传输(https较之于http多了一个ssl加密,在连接之前,会建立ssl通道)。

DNS\HTTP\HTTPS所在的层为应用层。经过应用层封装后,浏览器将封装好的包通过socket编程来发送给传输层

传输层有两个协议TCPUDP协议。TCP的面向连接的协议,更加安全,但是实时性稍逊于UDP协议。

在TCP头里面存放两个端口,一个是浏览器监听的端口,一个是服务器监听的端口。操作系统常通过端口来判断数据发送给哪一个进程。

传输层封装完毕之后,数据包会被传输给操作系统的网络层。网路程协议是IP协议。在IP协议中会有发送端的IP地址以及目的端的IP地址。

网络层通过IP地址确定数据包要被发送的目的端。如果目的IP地址和发送端的IP地址不属于同一网段,则要经过网关。在操作系统启动的时候,会被DHCP协议配置IP地址以及默认网关的IP地址——192.168.1.1

操作系统通过ARP协议获取网关的MAC地址,获取MAC地址之后数据包被加了一个MAC头。之后数据包被发送到数据链路层网卡将数据包发送出去。由于包里面有MAC地址,因此该数据包可以到达网关

网关收到数据包之后,会判断该数据包下一步应该被发送给谁。网关往往是一个路由器。用于查询下一步该往哪走的表是路由表。之后数据包经过一个又一个路由器,每经过一个路由器,各个路由器之间通过路由协议来确定数据包下一步该往哪走。常用的路由协议是OSPF协议和BGP协议。当数据包获取下一步的IP地址和MAC地址之后,就会被发送出去,直到走到目的IP地址。

到达最后一个路由器之后,通过ARP协议获取目标IP的MAC地址,通过该MAC地址,就找到了目标服务器。

目标服务器收到数据包之后,会先验证数据包的MAC地址,如果该MAC地址就是本机器的MAC地址,则将该数据包的MAC头取下来,发送给操作系统的网络层。在网络层会验证目标IP地址是否为本机IP地址,如果IP验证通过,则取下IP头查看数据包传输使用的协议,如果是TCP协议,则将数据包发送给传输层,即TCP层。

在TCP层,每个收到的包都会回复一个ACK,表明数据包被收到了。这些数据包会先存放在一个消息队列中,之后操作系统会根据数据包上的目标端口号将数据包交给监听该端口的进程。

进程获取数据之后会进行相应的处理,并将数据包要求的任务发送给相关进程进行处理。发送方式往往通过RPC调用,即远程过程调用。RPC框架有很多种,有基于http协议放在http的报文里的,也有直接封装在TCP报文里的。

放数据包要求的任务处理完成之后,就会回复一个http请求,这个新生成的包又会通过之前的方式回到发送端的浏览器中。

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

因为是个复杂的程度都要分层。比如复杂的电商会分数据库层、缓存层、compose层、controller层和介入层,每层都专注本层的工作。

ifconfig

linux系统中查看IP地址是命令。

ifconfig和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
  • scope。对于lo来说是host的,前面的IP地址表示本机,用于本机相互通信。对于eth0网卡,那一行写的IP地址是global的,表示可以对外通信
  • lo的全称是loopback,又称为回环接口,往往被分配到127.0.0.1这个地址上。该地址用于本机通信,经过内核处理后直接返回,不会再任何网络中出现。
  • ip地址上一行是MAC地址,是一个物理网卡地址,用十六进制,6byte表示。每个网卡的MAC地址都是独一无二的。MAC地址类似于身份证,在局域网内有定位机器的功能。
  • <BROADCAST,MULTICAST,UP,LOWER_UP>是net_devices flags,即网络设备标识
  • UP表示网卡处于启动状态
  • BROADCAST表示该网卡有广播地址,可以发送广播包
  • MULTICAST表示网卡可以发送多播包
  • LOWER_UP表示L1是启动的,即网卡是插着的。
  • MTU1500代表最大传输单位MTU是1500,这是以太网的默认值。MTU是MAC层的概念。MAC层有MAC头,以太网规定,连带MAC头加正文合起来的数据包不允许超过1500字节。正文里面有IP的头,TCP的头,http的头,如果放不下,就需要分片传输。
  •  qdisc pfifo_fast中,qdisc的全称是queueing disclipline,即排队规则,内核需要通过某个网络接口来发送数据包,他需要按照这个排队规则把数据包加入队列。
  • qdisc pfifo规则对于数据包不做任何处理,采用先入先出的方式通过队列。

ip地址分类

ip地址是网络世界的通讯地址,类似于我们的门牌号。IP地址被点分割成四部分,每部分8bit,因此IP地址一共32位(2的32次幂是四十多亿)。IP地址被分为五类:

D类地址是组播地址。使用这类地址,则组内的机器都能收到数据(同组可以是不同局域网的)。

由于上述划分方式很浪费,诞生了一共新的方法:

无类型域间选路(CIDR)

CIDR 将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。例如 10.100.122.2/24 中前24位是网络号,后8位是主机号。

伴随CIDR的是广播地址,10.100.122.255。如果发送数据的目标IP是这个地址,则所有 10.100.122 网段中的机器都会受到该数据,除非你把网线拔了(硬气)。另一个是子网掩码,255.255.255.0。

将子网掩码(255.255.255.0)和IP地址(10.100.122.2)进行按位与计算,得到网络号——10.100.122.0

一个容易被算错的CIDR题

求IP地址为 16.158.165.91/22 的第一地址、子网掩码、广播地址。

上来就答  16.158.165.1,那就错了。

注意 22 不是 8 的整数倍,意味着转换的时候 16.158 的部分不会动,他们占据前16位。中间的165变为2进制是 10100101,在这8位中,前6位是网络号,16.158.<101001>,,后两位是主机号,<01>.91。

因此

  • 第一地址——16.158.<101001>=16.158.164.1,
  • 子网掩码——255.255.<111111><00>.0=255.255.252.0
  • 广播地址——16.158.<101001><11.255=16.158.167.255

 

DHCP与PXE:IP是怎么来的,又是怎么没的?

如果给本机配置不属于本局域网的IP地址,会发生什么情况?

比如旁边机器是192.168.x.x,我将自己的IP地址配置成16.158.235.5,会出现什么情况?

不会出现任何情况,只是包发不出去。

一个数据包的IP地址是16.158.235.5,目标地址是192.168..1.6,但是发不出去,因为MAC地址没有填写。发送数据包时,linux系统会先判断发送端IP和目的端IP是否属于同一网段,如果属于同一网段,则操作系统会发送ARP请求来获取目标机器的MAC地址,如果不属于同一网段,则linux会企图将数据包发送给网关。如果此时你没有配置网关,那么这个包就发不出去了。

动态主机配置协议(DHCP,Dynamic Host Configuration Pro)

一台新机器加入到一个网络时,会发起DHCP Discover,即通过IP地址 0.0.0.0向IP地址255.255.255.255发送一个含有本机MAC地址的广播数据包(UDP),该包的格式如下:

如果该网段被配置了DHCP Server,则该服务会将他管理的一个IP地址分配给该机器,即DHCP Offer。同时DHCP Server会保留该IP地址,不会分配给其他机器。

DHCP Offer的格式如下(里面包含新分配的IP地址、子网掩码、网关和有效期):

如果有多个DHCP Server,则该机器会收到多个IP地址。机器会选择其中一个,并向网络中发送DHCP Request广播数据包,包中包含本机的MAC地址、确定使用的IP地址、提供该IP地址的DHCP Server的地址等。

在收到DHCP Server的确认之前,客户端使用的原IP地址依然是 0.0.0.0,目标IP地址依然是 255.255.255.255.

DHCP Server在收到DHCP Request之后,会广播回复给客户机一个DHCP ACK消息包,表明已经接受客户机的选择,并将分配给客户机的IP地址和其他配置信息都放入这个ACK广播包中。

IP 地址的收回和续租

客户机会在DHCP分配的IP地址有效期还剩50%的时候,想DHCP Server发送DHCP Request消息包来延长IP地址的使用有效时间。在收到服务器回复的DHCP ACK 之后,修改本机相应的TCP/IP参数,更新自己的配置。如此,需续租完成。

DHCP Server可以给你自动安装操作系统

预启动执行环境(PXE)

通过DHCP Server安装操作系统的过程与操作系统启动的过程有些类似:

  1. 首先,启动BIOSBIOS负责读取硬盘的MBR启动扇区,将GRUP启动起来,然后将权利交给GRUP。
  2. GRUP负责加载内核、加载作为根文件系统的initramfs文件。然后将权利给内核。
  3. 内核启动,初始化整个操作系统

安装操作系统的过程,插在了上面过程中的BIOS启动之后,因为没安装操作系统之前,没有扇区。因而此过程叫做预启动执行环境(Pre-boot Execution Environment),简称为PXE

PXE协议分析客户端和服务端,先将客户端放在BIOS中。当计算机启动时,BIOS把PXE客户端调入内存中。

首先,PXE客户端需要有自己的IP地址,因此PXR的客户端启动之后,需要发送DHCP请求,让DHCP Server给他分配一个地址。DHCP Server给PXE分配IP地址时的数据样例:

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配置了IP地址、子网掩码、网关地区和有效期等。

如果想使用PXE,需要配置next-server,指向PXE服务器的地址,还要配置初始启动文件filename。

解析 PXE 的工作过程

  1. 启动PXE客户端,通过DHCP协议向DHCP Server发送请求。
  2. DHCP Server返回IP地址、PXE服务器地址、启动文件pxelinux.0
  3. PXE初始化机器,通过TFTP协议,向TFTP服务器请求pxelinux.0文件
  4. PXE客户端收到文件之后,开始执行该文件。文件会指示PXE客户端向TFTP服务器请求配置信息pxelinux.cfg
  5. TFTP服务器会给PXE客户端一共配置文件,文件里会说明内核在哪、initramfs在哪。PXE后续会请求这些文件。
  6. 最后,启动linux内核。

猜你喜欢

转载自blog.csdn.net/qq_29996285/article/details/87943860