网络通信协议笔记
本文最后更新于:17 天前
《圣经》中有一个通天塔的故事,大致是说,上帝为了阻止人类联合起来,就让人类说不同的语言。人类没法儿沟通,达不成“协议”,通天塔的计划就失败了
但是千年以后,有一种叫“程序猿”的物种,敲着一种这个群体通用的语言,连接着全世界所有的人,打造这互联网世界的通天塔。如今的世界,正是因为互联网,才连接在一起。
只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。
1.1 当我们输入URL 发生了什么?
首先我们在浏览器里面输入https://www.budongshu.cn 这是一个URL
,浏览器不知道它要去的具体地点,也不知道如何访问,于是去DNS
(相当于地址薄)中去查找,经过查找后,会得到一个IP
地址,相当于是互联网的门牌号
我们知道了目标地址,浏览器就会打包它的请求,普通的浏览器请求一般是使用http
协议,但是对于现在来讲比如购物的请求,是需要加密的,会使用https
协议,无论什么协议,最后都会里面写清楚你要买什么 和买多少
DNS,HTTP,HTTPS 所在的层是我们称为: 应用层。经过应用层封装后,浏览器会将应用层包交给下一层去完成
通过socket 编程来实现,我们就到了下一层是传输层
传输层包括俩个协议,一个是tcp一个是udp,那么对于购物支付来讲,肯定是会使用tcp协议,所谓的面相连接就是,tcp会保证这个包能够到达目的地,如果不能够到达,就会重新发送,直至到达
tcp协议里面会有俩个端口 ,一个是浏览器监听的随机端口,一个是我要访问的目的地址服务器端监听的端口,
我们服务器端的操作系统会通过内核来判断,它得到的包应该是属于那个进程
传输层封装完毕后,浏览器会将包交给操作系统的网络层。网络层的协议是 IP 协议。在 IP 协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址,也即电商网站所在服务器的 IP 地址。
操作系统知道目标ip后,就会进行判断,这个ip地址是在本地,还是外地呢,从ip地址就可以看出来(ip地址每一段都有规划的,所以可以看出来),它不属于本地,应该在遥远的地方
我们去远方就需要,比如要去海外就要去海关,我们去远方就要去 网关
, 操作系统再启动的时候,会被DHCP协议配置分配一个随机IP地址以及默认的网关的IP地址10.1.1.1。
那么操作系统如何将IP地址发送给网关呢? 在本地通信基本靠吼,于是操作系统大吼一声,谁是网关10.1.1.1啊?
有人回答,他就是,他在本地地址村东头
- 本地地址:
MAC地址
- 大吼一声:
ARP协议
于是操作系统将 IP 包交给了下一层,也就是 MAC 层。网卡再将包发出去。由于这个包里面是有 MAC 地址的,因而它能够到达网关。
网关收到包之后,会根据自己的知识,判断下一步应该怎么走。网关往往是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表。
路由器相当于怎么讲呢?比如如果我们国家是一个大的局域网,那么连接俩个国家的通信就是路由器,而在我们国家内部,就可以使用本地的地址MAC进行通信(也就是通过交换机)
一旦我们出国了,手里拿着源ip和目标IP,应该怎么走,这种沟通的协议称为路由协议,常用的有 OSPF 和 BGP。
当我们网络包到达下一个国家的时候,还是要使用国家内部MAC地址 ,通过下一个国家的MAC地址,找个下一个国家,然后在问下一步怎么走,一直走到最后一个国家。
最后一个国家知道这个网络包要去的地方,于是对着这个国家本地地址大吼一声,谁是目标IP?目标服务器就会回复一个MAC地址,网络包过关后,通过这个MAC地址就能找到目标服务器。
目标服务器发现MAC地址对上了,你找的是我,然后去下MAC头,发送给操作系统的网络层,发现IP也对上了,就取下IP头,IP头里面封装的是TCP协议,然后交给传输层,即TCP层
在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。
如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次
。对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。
当网络包平安到达 TCP 层之后,TCP 头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个 Tomcat,将这个包发给电商网站。
电商网站的进程得到 HTTP 请求的内容,知道了要买东西,买多少。往往一个电商网站最初接待请求的这个 Tomcat 只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。
然后通过系统调用通知进程,当接待员发现相应的部门都处理完毕,就回复一个 HTTPS 的包,告知下单成功。这个 HTTPS 的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功
1.2 分层模型
1.3 MAC地址知识补充
网卡MAC码是由全球惟一的一个固定组织来分配的,未经认证和授权的厂家无权生产网卡。每块网卡都有一个固定的卡号,并且任何正规厂家生产的网卡上都直接标明了卡号,一般为一组12位的16进制数。其中前6位代表网卡的生产厂商。后面的位数是设备号。当然在操作系统级别改Mac地址又是一种说法
1.4 网络为什么要分层
复杂的程序都需要分层,比如我们架构网站前端 后端 缓存 中间件 数据库 存储
,我们通过分层使每一层各司其职
明确自己的职责,这样也不会混乱,还很清晰明了
1.5 层与层之间的关系
1.5.1 打个比喻来说明层与层之间的关系
通信协议就像没有天桥的双子楼,要从A座的24层到达B座24层就得先下楼梯再上楼梯,其他协议也是如此,比如4G
很像你去找你女朋友。 你=>穿内衣=>穿衣服=>坐车=>转车到地方=>脱衣服=>脱内衣=>见女朋友
1.5.2 第一个问题,TCP在三次握手的时候,IP层和MAC层在做什么?
当然使TCP发送每一个消息,都会带着IP层和MAC层,因为TCP每次发送一个消息,IP层和MAC层的所有机制
都要运行一遍。其实IP层和MAC层也为此忙活好久。
这里要记住一点:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
所以,对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然是发不出去的。
1.5.3 第二个问题,知道IP地址就直接发消息,要MAC地址干啥?
- IP是三层协议,必须封装在二层协议(比如以太网协议)中,MAC工作在二层,然后二层协议再通过硬件设备把网络包发出去,所以需要MAC地址(二层地址)。
- IP,Internet Protocol,网络互联协议,它设计出来是为了互联不同的网络的,他的作用是在不同网络之间做寻址。
- 所以没有MAC地址消息是发不出去的。
1.6 IP地址
IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码
比如10.1.1.1 就是一个 IP 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit,所以 IP 地址总共是 32 位。这样产生的 IP 地址的数量很快就不够用了。因为当时设计 IP 地址的时候,哪知道今天会有这么多的计算机啊!因为不够用,于是就有了 IPv6,也就是上面输出结果里面 inet6 fe80::f816:3eff:fec7:7975/64。这个有 128 位,现在看来是够了,但是未来的事情谁知道呢?
1.6.1 ip地址被分为五类
网络号: 用于识别主机所在的网络
主机号: 用于识别该网络中的主机
IP地址分为五类,各类可容纳的地址数目不同。
A类保留给政府机构
B类分配给中等规模的公司
C类分配给任何需要的人
D类用于组播
E类用于实验
A、B、C三类IP地址的特征:当将IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110
在网络地址中,至少在当时设计的时候,对于 A、B、 C 类主要分两部分,前面一部分是网络号,后面一部分是主机号
这里面有个尴尬的事情,就是 C 类地址能包含的最大主机数量实在太少了,只有 254 个。当时设计的时候恐怕没想到,现在估计一个网吧都不够用吧。而 B 类地址能包含的最大主机数量又太多了。6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
1.6.2 无类型域间选路(CIDR)
10.100.122.2/24,这个 IP 地址中有一个斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号
网络地址: 子网范围内的第一个地址
广播地址: 子网范围内最后一个地址
网络号: 将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
主机号: 32 减去 网络号 = 主机号
1.6.3 私有地址
公有 IP 地址有个组织统一分配,你需要去买。如果你搭建一个网站,给你学校的人使用,让你们学校的 IT 人员给你一个 IP 地址就行。但是假如你要做一个类似网易 163 这样的网站,就需要有公有 IP 地址,这样全世界的人才能访问。
1.6.4 CIDR 子网划分
子网划分(subnetting)的优点:
1.减少网络流量
2.提高网络性能
3.简化管理
4.易于扩大地理范围
2^9 = 512
2^8 = 256
2^7 = 128
2^6 = 64
2^5 = 32
2^3 = 8
2^0 = 1
首先,我们看一个考试中常见的题型:一个主机的IP地址是202.112.14.137,掩码是255.255.255.224,要求计算这个主机所在网络的网络地址和广播地址。
常规办法是把这个主机地址和子网掩码都换算成二进制数,两者进行逻辑与运算后即可得到网络地址。其实大家只要仔细想想,可以得到另一个方法:255.255.255.224的掩码所容纳的IP地址有256-224=32个(包括网络地址和广播地址)
那么具有这种掩码的网络地址一定是32的倍数。而网络地址是子网IP地址的开始,广播地址是结束,可使用的主机地址在这个范围内,因此略小于137而又是32的倍数的只有128,所以得出网络地址是202.112.14.128。而广播地址就是下一个网络的网络地址减1。而下一个32的倍数是160,因此可以得到广播地址为202.112.14.159。
lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现
1.6.5 MAC地址
在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为 MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。
MAC 地址是一个很容易让人“误解”的地址。因为 MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。很多人看到这里就会想,既然这样,整个互联网的通信,全部用 MAC 地址好了,只要知道了对方的 MAC 地址,就可以把信息传过去。这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的 IP 地址,才是有远程定位功能的。
所以MAC通信是有范围的,一般使局限在一个局域网里面,同局域网是可以通过MAC来通信的,一旦跨子网
那么MAC地址就需要IP来帮忙了。
1.6.6 网络设备的状态标识
UP 表示网卡处于启动的状态;
BROADCAST 表示这个网卡有广播地址,可以发送广播包;
MULTICAST 表示网卡可以发送多播包;
LOWER_UP 表示 L1 是启动的,也即网线插着呢
MTU1500 是指什么意思呢?是哪一层的概念呢?最大传输单元 MTU 为 1500,这是以太网的默认值。
我们讲过网络包是层层封装的。MTU 是二层 MAC 层的概念。MAC 层有 MAC 的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。正文里面有 IP 的头、TCP 的头、HTTP 的头。如果放不下,就需要分片来传输。
qdisc pfifo_fast
qdisc全称: queueing discipline 中文叫做排队队列,内核如果需要通过某个网络接口发送数据包,它都需要按照
为这个接口配置的 qdisc(排队规则)把数据报加入队列
pfifo
最简单的qdiso使 pfifo 他不对进入的数据做人任何的处理,数据报采用先入先出的方式通过队列,pfifo_fast 稍微复杂一点,他的队列包括三个波段(band),在每个波段里面,使用先进先出的规则
三个波段(band)的优先级也不相同。band 0 的优先级最高,band 2 的最低。如果 band 0 里面有数据包,系统就不会处理 band 1 里面的数据包,band 1 和 band 2 之间也是一样。
数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。
1.7 动态主机配置协议(DHCP)
动态主机配置协议(Dynamic Host Configuration Protocol),简称 DHCP。
1.7.1 解析dhcp工作方式
当一台机器需要通过自己MAC地址,发送一个广播包,目的IP地址255.255.255.255
广播包封装了 UDP,UDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版,但是如果你去抓包的话,很可能看到的名称还是 BOOTP 协议。
1.7.2 如果有多个DHCP server服务器
它会选择其中一个 DHCP Offer,一般是最先到达的那个,并且会向网络发送一个 DHCP Request 广播数据包,包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等,并告诉所有 DHCP Server 它将接受哪一台服务器提供的 IP 地址,告诉其他 DHCP 服务器,谢谢你们的接纳,并请求撤销它们提供的 IP 地址,以便提供给下一个 IP 租用请求者。
1.7.3 IP 地址的收回和续租
客户机会在租期过去 50% 的时候,直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包,会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数,更新自己的配置。这样,IP 租用更新就完成了。
1.7.4 预启动执行环境(PXE)
我们可以通过pxe来实现自动批量安装系统,这事儿其实仔细一想,还是挺有难度的。安装操作系统,应该有个光盘吧。数据中心里不能用光盘吧,想了一个办法就是,可以将光盘里面要安装的操作系统放在一个服务器上,让客户端去下载。但是客户端放在哪里呢?它怎么知道去哪个服务器上下载呢?客户端总得安装在一个操作系统上呀,可是这个客户端本来就是用来安装操作系统的呀?
其实,这个过程和操作系统启动的过程有点儿像。首先,启动 BIOS。这是一个特别小的小系统,只能干特别小的一件事情。其实就是读取硬盘的 MBR 启动扇区,将 GRUB 启动起来;然后将权力交给 GRUB,GRUB 加载内核、加载作为根文件系统的 initramfs 文件;然后将权力交给内核;最后内核启动,初始化整个操作系统
我们需要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"; #需要下载的启动文件filename
next-server 192.168.1.180; #指向pxe服务器的地址
}
pxe 工作执行流程
注意: 安装完成后,将提示重新引导计算机。在重新引导的过程中将BIOS修改回从硬盘启动就可以了。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!