文章笔记主要引用:
阿秀的学习笔记 (interviewguide.cn)
小林coding (xiaolincoding.com)
实现主机与主机之间的通信,也叫点对点(end to end)通信。
MAC 的作用则是实现「直连」的两个设备之间通信,而 IP 则负责在「没有直连」的两个网络之间进行通信传输。
在网络中数据包传输中也是如此,源IP地址和目标IP地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化。
IP数据报的报头包含以下字段:
版本(Version):指定IP协议的版本,通常为IPv4或IPv6。
首部长度(Header Length):指定IP报头的长度,以32位字(4字节)为单位。
服务类型(Type of Service):用于指定数据报的服务质量要求,如优先级、延迟、吞吐量等。
总长度(Total Length):指定整个IP数据报的长度,包括报头和数据部分。
标识(Identification):用于唯一标识一个IP数据报,通常由发送方设置,接收方用于重组分片。
标志(Flags):包含3个标志位,分别是DF(Don't Fragment,不分片)、MF(More Fragments,更多分片)、和保留位。
分片偏移(Fragment Offset):用于指示当前分片相对于原始数据报的偏移量,以8字节为单位。
生存时间(Time to Live):指定数据报在网络中可以经过的最大路由器跳数,每经过一个路由器,该值减1,为0时数据报被丢弃。
协议(Protocol):指定IP数据报中承载的上层协议,如TCP、UDP、ICMP等。
头部校验和(Header Checksum):用于检验IP报头的完整性,接收方使用该字段来验证报头是否正确。
源IP地址(Source IP Address):指定发送方的IP地址。
目标IP地址(Destination IP Address):指定接收方的IP地址。
指定数据报在网络中可以经过的最大路由器跳数。每当数据报经过一个路由器时,该字段的值会减少1。当TTL的值为0时,路由器将丢弃该数据报并发送ICMP的时间超过消息给源主机。
TTL的主要目的是防止数据报在网络中无限循环,避免由于路由环路或其他问题导致的数据报无法正常到达目的地。通过限制数据报的最大跳数,TTL可以确保数据报在有限的时间内能够到达目标主机或被丢弃,以避免网络资源的浪费和延迟。
IPv4 地址由 32
位正整数来表示,IPv6由 128 位正整数来表示, IP 地址在计算机是以二进制的方式处理的。
而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4
组,每组以「.
」隔开,再将每组转换成十进制。
最大允许 43 亿台计算机连接到网络。实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。
ABCDE类
A、B、C 类主要分为两个部分,分别是网络号和主机号。最大主机个数:2^主机位数 - 2
-2原因:
广播地址可以分为本地广播和直接广播两种。
D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。多播用于将包发送给特定组内的所有主机。广播无法穿透路由,若想给其他网段发送同样的包,就可以使用可以穿透路由的多播。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
IP 分类的优缺点
优点
简单明了、选路(基于网络地址)简单。
缺点一
同一网络下没有地址层次,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性。
缺点二
A、B、C类有个尴尬处境,就是不能很好的与现实网络匹配。
这两个缺点,都可以在 CIDR
无分类地址解决。
有两种方式划分主机号和网络号,
a.b.c.d/x
前 x 位属于网络号, x 的范围是 0 ~ 32
,这就使得 IP 地址更加具有灵活性。
10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
还有一种理解就是,24为子网掩码,通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是划分子网。
协议 | 名称 | 作用 |
---|---|---|
IP | 网际协议 | IP协议不但定义了数据传输时的基本单元和格式,还定义了数据报的递交方法和路由选择 |
ICMP | Internet控制报文协议 | ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性,是ping和traceroute的工作协议 |
RIP | 路由信息协议 | 使用“跳数”(即metric)来衡量到达目标地址的路由距离 |
IGMP | Internet组管理协议 | 用于实现组播、广播等通信 |
ICMP
主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
主机 A
向主机 B
发送了数据包,由于某种原因,途中的路由器 2
未能发现主机 B
的存在,这时,路由器 2
就会向主机 A
发送一个 ICMP
目标不可达数据包,说明发往主机 B
的包未能成功。
IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间,
当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。
当局部DNS服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析。局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。比如说:baidu.com的服务器ip地址在192.168.4.5这里,你自己去查吧,本人比较忙,只能帮你到这里了。
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP (反向地址转换协议)协议正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。
通常这需要架设一台 RARP
服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:
最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。
ping是基于网络层的ICMP查询报文类型协议实现的。通过向对方发送一个ICMP回送请求报文,如果对方主机可达的话会收到该报文,并响应一个ICMP回送回答报文。
扩展:ICMP报文的介绍。ICMP报文分为两个种类:
3
0
1
2(
禁止 TCP 协议访问)
3(
禁止 TCP 协议访问)
4(
途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片)
4
当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息。
收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 IP 包的传输间隔,减少网络拥堵的情况。
5
如果路由器发现发送端主机使用了「不是最优」的路径发送数据,那么它会返回一个 ICMP 重定向消息给这个主机。 在这个消息中包含了最合适的路由信息和源数据。
11
TTL
(Time To Live
,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。ping
命令就是利用这个消息实现的。向特定主机发出回送请求报文,收到回送请求报文的主机响应回送回答报文。利用 ICMP 差错报文类型的应用叫做 traceroute
(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。
作用:
1、故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。
它的原理就是利用 IP 包的生存期限 从 1
开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。
比如,将 TTL 设置 为 1
,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。
接下来将 TTL 设置为 2
,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。
这样的过程,traceroute 就可以拿到了所有的路由器 IP。
2、故意设置不分片,从而确定路径的 MTU。
路径MTU发现。
因为有的时候我们并不知道路由器的 MTU
大小,以太网的数据链路上的 MTU
通常是 1500
字节,但是非以太网的 MTU
值就不一样了,所以我们要知道 MTU
的大小,从而控制发送的包大小。
首先在发送端主机发送 IP
数据报时,将 IP
包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。
发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU
值,以便能到达目标主机。
127.0.0.1
是回环地址。localhost
是域名,但默认等于 127.0.0.1
。ping
回环地址和 ping
本机地址,是一样的,发现目标IP是回环地址时,就会选择本地网卡,走的是 "假网卡",都会经过网络层和数据链路层等逻辑,最后在快要出网卡前狠狠拐了个弯, 将数据插入到一个链表后就软中断通知 ksoftirqd 来进行收数据的逻辑,压根就不出网络。所以断网了也能 ping
通回环地址。listen
的是 0.0.0.0
,那么此时用127.0.0.1
和本机地址都可以访问到服务。链路层的MTU:1500字节;IP数据报的首部为20字节;UDP数据报的首部8字节。普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好
进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值. 如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机 制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.
鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时. 最好将UDP的数据长度控件在548字节(576-8-20)以内