iwehdio的博客园:https://www.cnblogs.com/iwehdio/
学习自:
TCP/IP 协议簇
-
TCP/IP 协议说的不仅仅只是 TCP 和 IP 这两种协议,实际上,TCP/IP 指的是协议簇。简单来说就是一系列协议的综合。
-
TCP/IP 协议是我们接触最多的协议,OSI 模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在 TCP/IP 协议中,它们被简化为了四个层次:
- 通信链路层:
- 物理层:是 TCP/IP 的最底层是负责传输的硬件,这种硬件就相当于是以太网或电话线路等物理层的设备。
- 数据链路层:位于物理层和网络层中间,数据链路层定义了在单个链路上如何传输数据。
- 网络层:
- 网络层主要使用 IP协议,IP 协议基于 IP 地址转发分包数据。
- 虽然 IP 也是一种分组交换协议,但是 IP 却不具备重发机制。即使数据没有到达另一端也不会进行重发,所以 IP 属于非可靠性协议。
- ICMP:因为 IP 在数据包的发送过程中可能会出现异常,当 IP 数据包因为异常而无法到达目标地址时,需要给发送端发送一个异常通知,ICMP 的主要功能就在于此了。
- 传输层:
- 传输层最主要的功能就是让应用层的应用程序之间完成通信和数据交换。
- 主要分为面向有连接的协议 TCP 和面向无连接的协议 UDP。
- TCP 是一种可靠的协议,它能够保证数据包的可靠性交付,TCP 能够正确处理传输过程中的丢包、传输顺序错乱等异常情况。此外,TCP 还提供拥塞控制用于缓解网络拥堵。
- UDP 是一种不可靠的协议,它无法保证数据的可靠交付,相比 TCP ,UDP 不会检查数据包是否到达、网络是否阻塞等情况,但是 UDP 的效率比较高。
- 应用层:
- 包括会话层和表示层,一般是服务端/客户端模型。
- 通信链路层:
数据包
-
数据包的结构:
- 每个分层中,都会对所发送的数据增加一个 首部,这个首部中包含了该层必要的信息。每一层都会对数据进行处理并在数据包中附上这一层的必要信息。
-
数据包发送历程:假设主机 A 和主机 B 进行通信,主机 A 想要向主机 B 发送一个数据包。
-
发送端处理:
- 应用层的处理:发送数据包,并对其进行字符编码、格式化等。
- 传输层的处理:
- TCP 会根据应用的指示,负责建立连接、发送数据和断开连接。
- TCP 会在应用数据层的前端附加一个 TCP 首部字段,TCP 首部包含了
源端口号
和目的端口号
,这两个端口号用于表明数据包是从哪个应用程序发出的,需要发送到哪个应用程序上; - TCP 首部还包含
序号
,用以表示该包中数据是发送端整个数据中第几个字节的序列号; - TCP 首部还包含
校验和
,用于判断数据是否损坏,随后将 TCP 头部附加在数据包的首部发送给 IP。
- 网络层处理:
- IP 协议将 TCP 传过来的 TCP 首部和数据结合,并在 TCP 首部的前端加上自己的 IP 首部。
- IP 首部包含目的和源地址,紧随在 IP 首部的还有用来判断后面是 TCP 还是 UDP 的信息。
- IP 包生成后,会由路由控制表判断应该发送至哪个主机,IP 修饰后的数据包继续向下发送给路由器或者网络接口的驱动程序,从而实现真正的数据传输。
- 通信链路层处理:
- 经由 IP 传过来的数据包,以太网会给数据附上以太网首部并进行发送处理。
- 以太网首部包含接收端的 MAC 地址、发送端的 MAC 地址以及标志以太网类型的以太网数据协议等。
-
接收端处理:
- 通信链路层处理:
- 目标主机收到数据包后,首先会从以太网的首部找到 MAC 地址判断是否是发给自己的数据包,如果不是发给自己的数据包则会丢弃该数据包。
- 如果收到的数据包是发送给自己的,就会查找以太网类型判断是哪种协议,如果是 IP 协议就会扔给 IP 协议进行处理,如果是 ARP 协议就会扔给 ARP 协议进行处理。如果协议类型是一种无法识别的协议,就会将该数据包直接丢弃。
- 网络层处理:
- IP 收到数据包后就会解析 IP 首部,判断 IP 首部中的 IP 地址是否和自己的 IP 地址匹配,如果匹配则接收数据并判断上一层协议是 TCP 还是 UDP;如果不匹配则直接丢弃。
- 在路由转发的过程中,有的时候 IP 地址并不是自己的,这个时候需要借助路由表协助处理。
- 传输层处理:
- TCP 处理过程中,首先会计算一下 校验和,判断数据是否被损坏。然后检查是否按照序号接收数据,最后检查端口号,确定具体是哪个应用程序。
- 数据被完整的识别后,会传递给由端口号识别的应用程序进行处理。
- 应用层处理:
- 通过解码等操作识别出数据的内容,然后把对应的数据存储在磁盘上,返回一个保存成功的消息给发送方,如果保存失败,则返回错误消息。
- 通信链路层处理:
-
总的来说,数据包经过每层后,该层协议都会在数据包附上包首部。
- 在数据包的发送过程中,各层依次对数据包添加了首部信息,每个首部都包含发送端和接收端地址以及上一层的协议类型。以
- 太网会使用 MAC 地址、IP 会使用 IP 地址、TCP/UDP 则会用端口号作为识别两端主机的地址。
IP
-
IP协议属于TCP/IP四层模型中的第三层,网络层。网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。
-
IP(网络层) 和 MAC (数据链路层)之间的区别和关系:
-
IP 的作用是主机之间通信中的,而 MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。
-
在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。
-
整个从起点到终点的过程就相当于网络层,充当远程定位的功能,行程的开始好比源 IP,行程的终点好比目的 IP 地址。
-
需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。
-
源IP地址和目标IP地址在传输过程中是不会变化的,只有源 MAC 地址和目标 MAC 一直在变化。
-
IP地址:
-
IP 地址(IPv4 地址)由 32 位二进制数来表示。而人类为了方便记忆采用了点分十进制的标记方式。
-
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
-
其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。
-
A、B、C 分类对应的地址范围、最大主机个数。
-
IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。主机号全为 1 ,指定某个网络下的所有主机,用于广播。主机号全为 0 ,指定某个网络。
-
-
广播地址:
- 用于在同一个链路中相互连接的主机之间发送数据包。
- 广播地址可以分为本地广播和直接广播两种。在本网络内广播的叫做本地广播。在不同网络之间的广播叫做直接广播。
- 由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。
-
多播:
- 多播用于将包发送给特定组内的所有主机。
- 由于广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播(组播)。
- 多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。
- 224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能局域网中,路由器是不会进行转发的。
- 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet 上。
- 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效。
-
IP分类的优点:
- 不管是路由器还是主机解析到一个 IP 地址时候,我们判断其 IP 地址的首位是否为 0,为 0 则为 A 类地址,那么就能很快的找出网络地址和主机地址。
-
IP分类的缺点:
- 同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性。
- 各类网络中包含的主机数量,不能很好的与现实网络匹配。
-
无分类地址CIDR:
- 这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号
- 表示形式
a.b.c.d/x
,其中/x
表示前 x 位属于网络号, x 的范围是 0 ~ 32,这就使得 IP 地址更加具有灵活性。
-
子网掩码:
- 另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。
- 将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
-
为什么要分离网络号和主机号?
- 因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机,
- 路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。
-
子网划分:
- 子网掩码还有一个作用,那就是划分子网。
- 子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址。
- 假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。
- C 类地址中前 24 位 是网络号,最后 8 位是主机号,根据子网掩码可知从 8 位主机号中借用 2 位作为子网号。
-
公有IP和私有IP:
- 私有 IP 地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。
- 公有IP是统一分配,全世界唯一的。
- 私有IP通过NAT转换,可以访问外界。
-
路由控制:
- IP地址的网络地址这一部分是用于进行路由控制。
- 路由控制表中记录着网络地址与下一步应该发送至路由器的地址,在主机和路由器上都会有各自的路由器控制表。
- 在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。
- 如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。
-
IP分片与重组:
- 每种数据链路的最大传输单元
MTU
都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。 - 最常见数据链路是以太网,它的 MTU 是
1500
字节。那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。 - 经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。
- 在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了
MSS
也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于MTU
的数据报文。
- 每种数据链路的最大传输单元
-
IPV6的好处:
- IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用啊。
- IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷,大大提高了传输的性能。
- IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大提升了安全性。
-
IPV6地址:
- IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。可用十六进制表示。
- 分为单播地址、组播地址和任播地址。
- 单播地址还分为:
- 在同一链路单播通信,不经过路由器,可以使用链路本地单播地址,IPv4 没有此类型。
- 在内网里单播通信,可以使用唯一本地地址,相当于 IPv4 的私有 IP。
- 在互联网通信,可以使用全局单播地址,相当于 IPv4 的公有 IP。
-
IPv6 相比 IPv4 的首部改进:
- 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
- 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
- 取消可选字段。 可选字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该可选字段使的 IPv6 的首部成为固定长度的 40 字节。
IP相关协议
-
DNS域名解析:
- DNS 可以将域名网址自动转换为具体的 IP 地址。
- 在域名中,越靠右的位置表示其层级越高。
- 对于
www.server.com
。根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com。 - 域名的层级关系类似一个树状结构:
- 根 DNS 服务器
- 顶级域 DNS 服务器(com)
- 权威 DNS 服务器(server.com)
-
域名解析流程:
- 浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts ,如果还是没有,就会 DNS 服务器进行查询。
- 客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也
就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。 - 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
- 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归.com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
- 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP
地址吗?” - 顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该
能问到” - 本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
- 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
-
ARP协议:
- 在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数
据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址。 - 由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议,求得下一跳的 MAC 地址。
- ARP请求与响应MAC地址:
- 主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
- 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中
的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回
给主机。
- 在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数
-
RARP协议:
- ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。
- 通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将
这个设备接入到网络。
-
DHCP 动态获取 IP 地址过程:
- DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号。
- 客户端首先发起 DHCP 发现报文(DHCP DISCOVER) 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播通信,其使用的广播目的地址是255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP 地址。DHCP 客户端将该IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
- DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP OFFER) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期。
- 客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文(DHCP REQUEST进行响应,回显配置的参数。
- 最后,服务端用 DHCP ACK 报文对 DHCP 请求报文进行响应,应答所要求的参数。
-
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的IP 地址。如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:
- 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。
- 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。
- 可以发现,DHCP 交互中,全程都是使用 UDP 广播通信。
-
DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址:DHCP 中继代理。
- DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
- 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给
DHCP 客户端 。
-
NAT 网络地址转换:
- 主机对外部通信时,把私有 IP 地址转换成公有 IP 地
址。 - 由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的。因此,可以把 IP 地址 + 端口号一起进行转换。用一个端口号指定一个私有IP。这种转换技术就叫网络地址与端口转换 NAPT。
- 于是,生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合。这种转换表在 NAT 路由器上自动生成。例如,在 TCP 的情况下,建立 TCP 连接首次握手时的 SYN 包一经发出,就会生成这个表。而后又随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。
- 主机对外部通信时,把私有 IP 地址转换成公有 IP 地
-
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
- 外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。
- 转换表的生成与转换操作都会产生性能开销。
- 通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。
-
解决问题的方法:
- 使用IPV6。
- 使用NAT内网穿透技术。是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目
对外通信,就不需要 NAT 设备来进行转换了。
-
ICMP 互联网控制报文协议:
- ICMP 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
- 在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。(比如路由器ARP请求主机B,但是主机B关机,则路由器会返回一个ICMP目标不可达)
-
ICMP 大致可以分为两大类:
- 一类是用于诊断的查询消息,也就是「查询报文类型」
- 另一类是通知出错原因的错误消息,也就是「差错报文类型」
-
IGMP 因特网组管理协议:
- IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间。
- IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发组播包到对应的主机了。
- IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常为 1,因为 IGMP 是工作在主机与连接的路由器之间。
-
IGMPv2为例的工作机制:
-
常规查询与响应:
-
离开组播组:
- 如果该网段内已经没有该组成员了,则不会响应查询。路由器不会再向这个网段转发该组播地址的数据包。
-
iwehdio的博客园:https://www.cnblogs.com/iwehdio/