文章目录
网络协议基础01
网络协议分层
对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套通用的网络协议。
我们把网络协议按照它们各自的作用和职责由上往下分成五层。
- 应用层
- 传输层
- 网络层
- 数据链路层
- 物理层
应用层
最上层也就是我们能直接接触到的就是应用层,平时电脑或手机使用的应用软件都是在应用层实现。当两个不同设备的应用需要通信的时候,应用就把应用数据传给下一层,也就是传输层。
所以,应用层只需要专注于为用户提供应用功能,不用去关心数据是如何传输的。就类似于,我们寄快递的时候,只需要把包裹交给快递员,由他负责运输快递,我们不需要关心快递是如何被运输的。而且应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。
传输层
应用层的数据包会传给传输层,传输层则反过来为应用层提供网络支持。
在传输层会有两个传输协议,分别是 TCP 和 UDP。
- TCP 的全称叫传输层控制协议( Transmission Control Protocol ),大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。
- UDP 就相对很简单,简单到只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP 也可以实现可靠传输,把 TCP 的特性在应用层上实现就可以,不过要实现一个商用的可靠 UDP 传输协议,也不是一件简单的事情。
应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包。在TCP 协议中,我们把每个分块称为一个 TCP 段。
当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。
比如 80 端口通常是 Web 服务器用的, 22 端口通常是 SSH 远程登录服务器用的。而对于浏览器(客户端)中的每个标签栏都是一个独立的进程,操作系统会为这些进程分配临时的端口号。由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应
用。
网络层
实际应用场景中的网络环节是错综复杂的,中间有各种各样的线路和分叉路口,如果一个设备的数据要传输给另一个设备,就需要在各种各样的路径和节点进行选择。传输层的设计理念是简单、高效、专注,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层。
网络层最常使用的是 IP 协议,IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。
网络层负责将数据从一个设备传输到另一个设备,世界上那么多设备,又该如何找到对方呢?因此,网络层需要有区分设备的编号。
我们一般用 IP 地址给设备进行编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段,每段是 8 位。只有一个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不太现实。
因此,需要将 IP 地址分成两种意义:
- 一个是网络号,负责标识该 IP 地址是属于哪个子网的;
- 一个是主机号,负责标识同一子网下的不同主机;
在区分中需要配合子网掩码才能算出 IP 地址 的网络号和主机号。在寻址的过程中,先匹配到相同的网络号,才会去找对应的主机。
除了寻址能力, IP 协议还有另一个重要的能力就是路由。实际场景中,两台设备并不是用一条网线连接起来的,而是通过很多网关、路由器、交换机等众多网络设备连接起来的,那么就会形成很多条网络的路径,因此当数据包到达一个网络节点,就需要通过算法决定下一步走哪条路径。
所以,IP 协议的寻址作用是告诉我们去往下一个目的地该朝哪个方向走,路由则是根据「下一个目的地」选择路径。寻址更像在导航,路由更像在操作方向盘。
数据链路层
数据传输的实际场景中不仅可以在同一个网络中设备间进行传输,也可以跨网络进行传输。一旦数据需要跨网络传输,就需要有一个设备同时在两个网络当中,这个设备一般是路由器,而路由器可以通过路由表计算出下一个要去的 IP 地址。
数据链路层可以标识网络中的设备,让数据在一个链路中传输,它主要为网络层提供链路级别传输的服务。
每一台设备的网卡都会有一个 MAC 地址,它就是用来唯一标识设备的。路由器计算出了下个目的地的IP 地址,再通过 ARP 协议找到该目的地的 MAC 地址,这样就知道这个 IP 地址是哪个设备的了。
物理层
当数据准备要从设备发送到网络时,需要把数据包转换成电信号,让其可以在物理介质中传输,这一层就是物理层,它主要是为数据链路层提供二进制传输的服务。
IP
IP基本认识
IP的作用
IP在TCP/IP参考模型中处于第三层,也就是网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点通信。
IP与MAC的关系
IP 的作用是主机之间通信的,而 MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。所以需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。并且在网络中数据包传输中,源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标 MAC 一直在变化。
IP地址的基础知识
IP地址的定义
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。
IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。人们为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8位为组,共分为 4 组,每组以「 . 」隔开,再将每组转换成十进制。
IPv4二进制 | 11000000 | 10101000 | 00000001 | 00000001 |
---|---|---|---|---|
IPv4十进制 | 192 | 168 | 1 | 1 |
点分十进制 | 192. | 168. | 1. | 1 |
所以IP地址的最大值也就是
a
32
=
4294967296
a^{32}=4294967296
a32=4294967296
也就说,最大允许 43 亿台计算机连接到网络。实际上,IP 地址并不是根据主机台数来配置的,而是以网卡配置。像服务器、路由器等设备都是有 2 个以上的网卡,而每块网卡可以分配一个以上的IP地址,也就是说它们会有 2 个以上的 IP 地址。
IP地址分类
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
-
什么是 A、B、C 类地址?
对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。
-
A、B、C 分类地址最大主机个数是如何计算的呢?
最大主机个数要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数就为:
2 8 − 2 = 254 2^8-2=254 28−2=254
在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。- 主机号全为 1 指定某个网络下的所有主机,用于广播
- 主机号全为 0 指定某个网络
-
什么是 D、E 类地址?
D类和E类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E类是预留的分类,暂时未被使用。
-
IP 分类的优点
不管是路由器还是主机解析到一个 IP 地址时候,我们判断其 IP 地址的首位是否为0,为 0 则为 A 类地址;如果IP地址的首位为1,则判断第二位是否为0,为0则为B类地址;如果IP地址的第二位为1,则判断第三位是否为0,为0则为C类地址;如果IP地址的第三位为1,则判断第四位是否为0,为0则为D类地址;这样就能很快的找出网络地址和主机地址。
所以,这种分类地址的优点就是简单明了、选路(基于网络地址)简单。
公有IP与私有IP地址
在 A、B、C 分类地址上,实际上有分公有 IP 地址和 私有 IP 地址。
平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址
。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。
而公有 IP 地址
则是有组织统一分配的,并且公有 IP 地址基本上要在整个互联网范围内保持唯一。
IP地址与路由控制
IP地址的网络地址这一部分是用于进行路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
-
环回地址不会流向网络
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。
计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址,与该地址具有相同意义的是一个叫做 localhost 的主机名。
使用这个 IP 或主机名时,数据包不会流向网络。
IP协议相关技术
与IP 协议相关的重要且常见的技术有:
- DNS 域名解析
- ARP 与 RARP 协议
- DHCP 动态获取 IP 地址
- NAT 网络地址转换
- ICMP 互联网控制报文协议
DNS域名解析
我们在上网的时候,通常使用的方式域名,而不是 IP 地址,因为域名方便人们记忆。实现这一技术的就是 DNS 域名解析,DNS 可以将域名网址自动转换为具体的 IP地址。
-
域名的层级关系
DNS 中的域名都是用句点来分隔的,比如
www.baidu.com
,这里的句点代表了不同层次之间的界限。在域名中,越靠右的位置表示其层级越高。
根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com。
所以域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器
- 权威 DNS 服务器
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何DNS 服务器就都可以找到并访问根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。
-
域名解析的工作流程
浏览器会首先查看自己的缓存里有无,如果没有就向操作系统的缓存查询,还没有就会检查本机域名解析文件
hosts
,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:- 客户端首先会发出一个DNS请求,询
www.server.com
的IP,并发给本地DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)。 - 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到
www.server.com
,则它直接返回IP地址。如果没有,本地DNS会向更高层级的的根域名服务器查询。根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。 - 根DNS收到来自本地DNS的请求后,发现后置是.com,会返回
www.server.com
域名归属的.com顶级域名服务器地址。 - 本地DNS收到顶级域名服务器的地址后,发起请求查询
www.server.com
的IP地址。 - 顶级域名服务器接收到请求后会发送负责
www.server.com
区域的权威 DNS 服务器的地址。 - 本地DNS于是向权威DNS服务器发起请求查询
www.server.com
对应的IP地址。 - 权威DNS服务器查询后将对应的IP地址
X.X.X.X
返回给本地DNS。 - 本地DNS再将 IP 地址返回客户端,客户端和目标建立连接。
- 客户端首先会发出一个DNS请求,询
ARP与RARP协议
在传输一个IP数据报的时候,确定了源IP地址和目标IP地址后,就会通过主机「路由表」确定IP数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的MAC地址。
由于主机的路由表中可以找到下一条的 IP 地址,所以可以通过ARP协议,求得下一跳的MAC地址。
-
那么ARP又是如何知道对方MAC地址的呢?
简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
- 主机会通过广播发送ARP请求,这个包中包含了想要知道的MAC地址的主机IP地址。
- 当同个链路中的所有设备收到ARP请求时,会去拆开ARP请求包里的内容,如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个设备就将自己的MAC地址塞入ARP响应包返回给主机。
操作系统通常会把第一次通过ARP获取的MAC地址缓存起来,以便下次直接从缓存中找到对应IP地址的MAC地址。
不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
-
RARP 协议
ARP协议是已知IP地址求MAC地址,而RARP协议正好相反。它是已知 MAC 地址求 IP 地址。
通常这需要架设一台RARP服务器,在这个服务器上注册设备的MAC地址及其IP地址。然后再将这个设备接入到网络,接着:
- 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址是什么」的请求信息。
- RARP服务器接到这个消息后返回「MAC地址为XXXX的设备,IP地址为XXXX」的信息给这个设备。
DHCP动态获取IP地址
DHCP在生活中我们是很常见的了,PC通常都是通过DHCP动态获取IP地址,大大省去了配IP信息繁琐的过程。
DHCP工作流程:
- 客户端首先发起DHCP发现报文的IP数据报,由于客户端没有IP地址,也不知道DHCP服务器的地址,所以使用的是UDP广播通
信,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。 - DHCP服务器收到DHCP发现报文时,用DHCP提供报文向客户端做出响应。该报文仍然使用IP广播地址 255.255.255.255,该报文信息携带服务器提供可租约的IP地址、子网掩码、默认网关、DNS服务器以及IP地址租用期。
- 客户端收到一个或多个服务器的DHCP提供报文后,从中选择一个服务器,并向选中的服务器发送DHCP请求报文进行响应,回显配置的参数。
- 最后,服务端用DHCP ACK报文对DHCP请求报文进行响应,应答所要求的参数。
一旦客户端收到DHCP ACK后,交互便完成了,并且客户端能够在租用期内使用DHCP服务器分配的IP地址。
如果租约的DHCP IP地址快期后,客户端会向服务器发送DHCP请求报文:
- 服务器如果同意继续租用,则用DHCP ACK报文进行应答,客户端就会延长租期。
- 服务器如果不同意继续租用,则用DHCP NACK报文,客户端就要停止使用租约的IP地址。
可以发现,DHCP交互中,全程都是使用UDP广播通信。
为了解决当DHCP服务器和客户端不在同一个局域网内时路由器无法转发广播包的问题,就出现了DHCP中继代理。有了DHCP中继代理以后,对不同网段的IP地址分配也可以由一个DHCP服务器统一进行管理。
- DHCP客户端会向DHCP中继代理发送DHCP请求包,而DHCP中继代理在收到这个广播包以后,再以单播的形式发给DHCP服务器。
- 服务器端收到该包以后再向DHCP中继代理返回应答,并由DHCP中继代理将此包转发给DHCP客户端 。
因此,DHCP服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。
NAT网络地址转换
IPv4 的地址是非常紧缺的,在上文中我们也提到可以通过无分类地址来减缓IPv4地址耗尽的速度,但是IPv4 地址仍有被耗尽的危险。于是科学家提出了一个种网络地址转换NAT的方法,再次缓解了IPv4地址耗尽的问题。
简单的来说NAT就是在同个公司、家庭、教室内的主机对外部通信时,把私有IP地址转换成公有IP地址。
由于绝大多数的网络应用都是使用传输层协议TCP或UDP来传输数据的。因此,可以把IP地址 + 端口号一起进行转换。这样就可以只用一个共有IP地址,这种转换技术就叫网络地址与端口转换NAPT。
ICMP互联网控制报文协议
ICMP功能都有什么?
- 确认IP包是否成功送达目标地址
- 报告发送过程中IP包被废弃的原因和改善网络设置等。
在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将由ICMP负责通知。
ICMP又大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」