菜鸟笔记
提升您的技术认知

网络编程笔记

《unix网络编程》五种I/O模型《unix网络编程》select、shutdown函数《unix网络编程》套接字选项《unix网络编程》守护进程和inetd超级服务器《UNIX网络编程》epoll 的accept , read, writeLinux 套接字编程中的 5 个隐患《unix网络编程》tcp服务器的几种常见状况分析《unix网络编程》epoll函数《unix网络编程》wait/waitpid处理僵死进程(SIGCHLD信号)《unix网络编程》socket是什么《UNIX网络编程》epoll的ET/LT模式注意点IO复用与并发编程Reactor和Proactor模型基于TCP的客户端、服务器端socket编程网络编程调试水平触发和边缘触发五种IO模型brpc长连接问题I/O多路复用之 selectI/O多路复用之 pollI/O多路复用之 epollselect,poll,epoll之间的优点和缺点总结大端模式和小端模式的区别大端模式和小端模式详解大端模式和小端模式netperf大小端的介绍判断机器的大小端Linux epoll模型正向代理与反向代理DNS的工作原理常用计算机网络端口号brpc编译运行Connection reset by peer的解决办法TCP粘包问题分析和解决Thrift之服务模型和序列化机制Epoll原理解析TCP、UDP数据包大小的限制socket,tcp,http三者之间的区别和原理Epoll模型讲解epoll原理详解及epoll反应堆模型非阻塞socket调用connect, epoll和select检查连接情况示例tcp为什么要三次握手Socket 编程详解udp如何实现可靠性传输?网络基础面试整理你真的了解IP地址吗?什么是RPC最详细的 I/O 多路复用解析

你真的了解IP地址吗?

阅读 : 38

IP协议

基本认识

IP 在 TCP/IP 参考模型中处于第三层,也就是网络层

网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。

IP(网络层) 和 MAC (数据链路层)之间的区别和关系。

MAC 地址的作用是实现「直连」的两个设备之间通信。

IP 地址的作用是在「没有直连」的两个网络之间进行通信传输。

可以用我们旅行来做类比

旅行的起点和终点 是源IP地址和目的IP地址,旅行行程的起始地址和目的地址始终都不会改变的,所以源IP地址和目标IP地址在传输过程中是不会变化的。

旅行之间的各个景点是 MAC 地址,一个景点即是上一个 MAC的目的 地址,也是下一个景点的源MAC地址,所以源 MAC 地址和目标 MAC 一直在变化。

IP地址(IPv4 地址)由32位的二进制来表示,采用点分十进制的标记方法,即 32位IP地址,每8个一组,共分为4组,每组以.隔开并转换成十进制来表示。

IPV4理论上允许2^32 = 43亿台计算机连接网络。

但实际上 IP地址并不是根据主机台数来配置的,而是根据网卡。

而如服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

分类地址

上图中黄色部分为分类号,用以区分 IP 地址类别。

IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。

每一类都分为网络号和主机号两部分,由于主机号位数不同,所以范围也不同。

为什么要分离网络号和主机号?

因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。

如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。

A、B、C 分类地址最大主机个数是如何计算的呢?

最大主机个数,就是要看主机号的位数.

如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:2^8 - 2= 254

A类最大,容纳主机数 16777214台

B类居中,容纳主机数 65534

C类最少,容纳主机数 254

D类、E类没有网络号和主机号,D类用来多播,E类待用

减 2 的原因是在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址。

  • 主机号全为 1 指定某个网络下的所有主机,用于广播。

    • 在不同网络之间的广播叫做直接广播。
    • 在本网络内广播的叫做本地广播
  • 主机号全为 0 指定某个网络

多播地址

多播用于将包发送给特定组内的所有主机。

比如老师说:“最后一排的同学,上来做这道数学题。”

老师指定的是最后一排的同学,也就是多播的含义了。

优缺点

优点:能快速的找出网络地址和主机地址,简单明了、选路(基于网络地址)简单。

缺点:不能很好的与现实网络匹配,最大主机数量分配的比较极端,少的太少多的太多

无分类地址

这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,前面是网络号,后面是主机号

划分方式

表示形式 a.b.c.d/x,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32,这就使得 IP 地址更加具有灵活性。

比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。

还有另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。

将子网掩码和 IP 地址按位计算 & 运算,就可得到网络号。

子网掩码

子网掩码不仅能划分出网络号和主机号,还有划分子网的作用。

子网划分实际上是将主机地址分为两个部分:子网网络地址和子网主机地址

假设对 C 类地址进行子网划分。

网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。

子网掩码尾部 的 192 的二进制表示为 11000000

所以根据子网掩码可知从 8 位主机号中借用 2 位作为子网号

由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11,

IP 分片与重组

每种数据链路的最大传输单元 MTU 都是不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。

每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。

当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。

假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。

在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS 也就是在 TCP 层进行分片不由 IP 层分片,那么对于 UDP 我们尽量不要发送一个大于 MTU 的数据报文

IPv6基本认识

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。

IPv6 的地址是 128 位的,分配的地址数量甚至可以保证地球上的每粒沙子都能被分配到一个 IP 地址。

IPv6 除了有更多的地址之外,还有

更好的扩展性:IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是便捷到即插即用

更好的安全性:IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能

有更好的传输性能:IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,简化了首部结构,减轻了路由器负荷。

IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。

IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。

IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。

IPv6 的地址主要有以下类型地址:

  • 单播地址,用于一对一的通信
  • 组播地址,用于一对多的通信
  • 任播地址,用于通信最近的节点,最近的节点是由路由协议决定
  • 没有广播地址

IPv4 首部与 IPv6 首部

  • 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
  • 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
  • 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节。

IP协议相关技术

DNS

DNS 域名解析:可以将域名网址自动转换为具体的 IP 地址。

域名的层级关系

DNS 中的域名用句号隔开。如www.server.com,用句号来划分不同层次。

在域名中,从左到右域名层级依次递增。

根域在最顶层,下一层的com 是顶级域,再下面是权威 server.com

域名的层级关系类似一个树状结构:

  • 根 DNS 服务器
  • 顶级域 DNS 服务器(com)
  • 权威 DNS 服务器(server.com)

根域的DNS服务器信息保存在互联网中所有的DNS服务器中。

这样客户端只有能够找到任意一台DNS服务器都可以找到并访问根域 DNS 服务器,然后一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器

域名解析的工作流程

浏览器首先查看自己缓存里面有没有 ,如果没有就询问操作系统的缓存,还没有就检查本机域名解析文件host,如果还是没有,就会向 DNS 服务器 请求查询。

  1. 客户端首先会发出一个 DNS 请求,询问 www.server.com对应的IP,并发给本地的DNS 服务器,即客户端TCP、IP设置中填写的 DNS 服务器地址。
  2. 本地域名服务器收到客户端的请求后,如果在缓存里的表格里 找到此域名,则会直接返回对应的 IP 地址。如果没有,本地DNS服务器会询问 他的根域名服务器 www.server.com对应的IP,根域名服务器是最高层次的,它不直接用于域名解析,但能知名一条道路
  3. 根DNS收到本地 DNS 的请求后,检测到后置是 .com ,于是将 .com 顶级域名发送给本地 DNS 服务器
  4. 本地 DNS 收到顶级域名服务器后,又向顶级域名服务器发起询问
  5. 顶级域名服务器查询之后,将负责www.server.com 区域的权威 DNS 服务器的地址发给 本地DNS
  6. 本地DNS最后向权威 DNS 服务器发起询问。
  7. 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS
  8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接

ARP

MAC 地址是以太网的 MAC 子层使用的地址

IP 地址是TCP/IP 体系结构网际层所使用的地址

ARP 协议属于 TCP/IP 体系结构的网际层,其作用是将已知设备所分配到的 IP 地址通过ARP协议获得设备的 MAC 地址。

如何从IP地址找出其对应的MAC地址?

ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。

  • 在发送ARP 请求之前,源主机会先在自己的ARP高速缓存表中查找目的主机的IP 地址所对应的 MAC 地址,如果没有找到。
  • 目的主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。
  • 当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。

操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。

不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。

RARP

RARP是逆向地址解析协议即已知 MAC地址求 IP 地址。

例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。

通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:

  • 该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。
  • RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。

最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。

DHCP

在DHCP出现之前之前,如果要正常访问Web服务器,需要该主机手动配置网络的相关配置信息。而手工配置的工作量大,且容易出错。

动态主机配置协议 DHCP 机制允许一台计算机加入新的网络和获取 IP 地址,而不用手工配置。

DHCP 工作方式

  • DHCP 使用客户-服务器方式,采用请求/应答方式工作。
  • DHCP 基于 UDP 工作(DHCP报文在运输层会被封装成为UDP用户数据报),DHCP 服务器运行在 67 号端口, DHCP客户运行在 68 号端口。

DHCP交互过程

  1. DHCP客户端将广播发送DHCP发现报文(DHCP DISCOVER)

    • 事务ID
    • DHCP客户端的MAC地址

    封装该报文的IP数据报的源IP地址为0.0.0.0,这是因为主机目前还未分配到IP地址,因此使用该地址代替。

    目的IP地址为广播地址255.255.255.255,之所以广播发送,是因为主机现在并不知道网络中有哪几个DHCP服务器。它们的IP地址各是什么

  2. DHCP服务端将广播发送DHCP提供报文(DHCP OFFER)

    • 事务ID: DHCP 客户端会与之前DHCP发现报文的事务ID做对比,来判断该DHCP提供报文是否是自己的
    • 配置信息:服务器提供可租约的 IP 地址 子网掩码 IP地址租期 默认网关 DNS服务器

    源IP地址:发送DHCP提供报文的DHCP服务器的IP

    目的地址:因为目的主机还没分配到IP,所以使用广播地址

  3. DHCP客户端将广播发送DHCP请求报文(DHCP REQUEST)

    • 事务ID

    • 回显配置的参数。

      • DHCP客户端的MAC地址

      • 接收的租约中的IP地址

      • 提供此租约的DHCP服务器端的IP地址

  4. DHCP服务端将发送DHCP ACK 报文进行响应

    • 应答所要求的参数。

一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。

如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:

  • 服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。
  • 服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。

可以发现,DHCP 交互中,全程都是使用 UDP 广播通信

可能你会有一些疑问。

DHCP中继代理

如果在交互过程中用的是广播。那 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?

所以,为了解决这一问题,就出现了 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理。

  • DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。
  • 服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。

因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。

NAT

ICMP

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议

架构IP网络时需要特别注意两点:

  • 确认网络是否正常工作
  • 遇到异常时进行问题诊断

ICMP的主要功能包括:

  • 确认IP包是否成功送达目标地址
  • 通知在发送过程当中IP包被废弃的具体原因
  • 改善网络设置等

有了这些功能以后,就可以获得网络是否正常,设置是否有误以及设备有何异常等信息,从而便于进行网络上的问题诊断

IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知

ICMP 类型

  • 一类是用于诊断的查询消息,也就是「查询报文类型
  • 另一类是通知出错原因的错误消息,也就是「差错报文类型