TCP/IP高频考点之一个数据包的流浪日记

576 阅读41分钟

往期推荐

TCP/IP 开胃菜 之 HTTP

面试反客为主 TCP

4 网络层 IP

数据包的传输主要经过应用层传输层网络层链路层。承接应用层HTTP传输层TCP讲解,应用层数据被传输层包裹后接下来就需要被网络层包裹了,网络层的核心任务就是实现主机与主机之间的通信。讲解IP层之前需铺垫众多基础知识。

4.1 IP 基础知识

4.1.1 IP 定义

现实生活人能找到人是因为知道彼此的详细地址,在网络中要通讯就要知道对方的 IP 地址,IPv4 是由32位二进制数据来表示的,每4位算一组并换算成10进制数据,组与组之间通过 . 分割。\

IPv4

4.1.2 IP 分类

为了便于寻址和层次化的构造网络,IP地址被分为A、B、C、D、E 五类。\

IP分类\

A、B、C三类 IP 中是有 网络号 跟 主机号共同组成的,我们常说的 IP地址 = 网络地址 + 主机地址。A、B、C三类 IP 都有若干位固定值表示不同类型,并且网络号全为 0 的情况下网络不可用,网络地址的主机位全部变成1被提前标记为是广播地址,全部被标记为0表示是主机地址,即是这个网络中的所有主机的地址。

广播地址

  1. Broadcast Address 广播地址 指同时向该局域网上所有的主机发送报文,如136.78.255.255就是B类地址中的一个广播地址,你将信息送到此地址,就是将信息送给网络号为136.78的所有主机。
  2. 在本网络内广播的叫做本地广播,这个广播地址发出的 IP 包会被 路由器 屏蔽。
  3. 在不同网络之间的广播叫做直接广播

主机地址

在一个网络段中主机号全为 0 代表这个网络段本身,称之为网络号 。这个地址是不可以分配给主机的。

多播

  1. D 类网段中的多播用于将包发送给特定组内的所有主机。
  2. 主机之间一对一的通讯模式叫单播,主机之间一对所”的通讯模式叫广播,主机之间一对一组的通讯模式叫多播
4.1.3 子网掩码

Subnet Mask 又叫网络掩码地址掩码,子网掩码只有一个作用,就是将某个IP地址划分成网络地址主机地址

  1. 子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。
  2. 子网掩码的主机号部分全部为0,非主机号部分全部为 1。
  3. 子网掩码不能单独存在,它必须结合IP地址一起使用。
  4. 通过子网掩码,就可以判断两个IP在不在一个局域网内部。
  5. 子网掩码可以看出有多少位是网络号,有多少位是主机号。

用子网掩码可以得到网络地址跟主机地址。

  1. 将ip地址与子网掩码转换成二进制。
  2. 将二进制形式的ip地址与子网掩码做’与’运算,将答案化为十进制便得到网络地址。
  3. 将二进制形式的子网掩码取
  4. 将取后的子网掩码与ip地址做运算,将答案化为十进制便得到主机地址。

子网掩码一般分为两类,第一类是系统自带的:

  1. A类地址子网掩码是 255.0.0.0。
  2. B类地址子网掩码是 255.255.0.0。
  3. C类地址子网掩码是 255.255.255.0。

第二类就是自定义子网掩码,将一个网络划分为几个子网,需要每一段使用不同的网络号或子网号,实际上我们可以认为是将主机号分为两个部分:子网号、子网主机号。形式如下:

未做子网划分的ip地址:网络号+主机号
做子网划分后的ip地址:网络号+子网号+子网主机号

也就是说ip地址在化分子网后,以前的主机号位置的一部分给了子网号,余下的是子网主机号。

4.1.4 无分类地址

IP分类划分的优点

  1. 简单明了、根据前面几位固定值即可判断。

IP分类划分的缺点

  1. 生活中你会发现 C 类地址包含最大主机数有点少,而B类又有点大,分配IP无法很好的跟现实网络需求匹配。
  2. 相同的一个网络下是没有地址层次的,比如公司用了B类地址,而你的生产、测试、开发三个环节要划分不同的地址层次。这无法实现。

既然IP分类会导致有这么多不便,人们后面提出了无分类地址的方案,该方案会将32 比特的 IP 地址划分为两部分,前面是网络号,后面是主机号。

比如 10.100.34.33/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。此时具有如下信息:

  1. 子网掩码:255.255.255.0
  2. 网络号:10.100.34.0
  3. 可用地址范围:10.100.34.0 ~ 10.100.34.255
  4. 广播地址:10.100.34.255
4.1.5 私网IP、公网IP

内网跟外网

私网IP:一般是在局域网内使用,不同局域网可能有相同的私网IP地址。在电脑想访问外网上网时,必须使用公网,私网是不被允许的。
公网IP:公网IP世界只有一个,访问互联网需要公网IP作为身份的标识,公网 IP 是由 Inter NIC因特网信息中心负责。这些 IP 地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。

4.2 IP层 +  MAC层 基础信息

4.2.1 ARP、RARP

经过TCP处理数据后,接下来就会通过主机的路由表或路由器的路由表来确定 IP 数据包下一跳到哪儿。这里需注意,数据传输的最底层是链路层,链路层是根据MAC地址传输的,所以问题变成了如何通过目标IP获得下一跳的MAC地址。

Address Resolution Protocol 协议是地址解析协议,ARP是通过解析IP地址得到 MAC 地址,ARP协议的主要工作就是建立、查询、更新、删除ARP表项。

ARP 协议引入了 ARP 缓存表的概念,每台主机或路由器在维护着一个ARP缓存表,这个表包含IP地址到MAC地址的映射关系,表中记录了对,称之为ARP表项,ARP表项里的数据一般都是含有TTL属性的,默认10分钟。可通过arp -a查看服务器ARP缓存表信息。

ARP 的工作流程

  1. 主机会通过广播发送 ARP 请求包,该包中包含了想要知道的 MAC 地址的主机 IP 地址。
  2. 同一局域网内的所有主机都会接收到这个请求,如果目标IP地址与接收到ARP请求的主机自身IP地址吻合就会返回一个ARP应答,告诉目标MAC地址,接着把数据传送过去。
  3. 如果目标IP跟起始IP不在同一局域网内, 会跳跃到路由器,先查询路由表,找到目标MAC则返回,找不到则路由器会接着往下跳,每跳一次就会请求MAC地址,然后将数据发送到目标MAC地址的主机上。就这样通过跳一跳的方式最终把数据发送到目标机器。
  4. 操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。
  5. 同时你会发现在整个数据传输期间,源 IP 和目标 IP 始终是不变的,一直变化的是 MAC 地址,因为链路层需要 MAC 地址在以太网内进行两个设备之间的包传输

RARP的功能正好跟ARP相反,它是已知 MAC 地址求 IP 地址。比如打印机等小设备会通过MAC 获得IP地址,RARP的工作流程大致如下:

  1. 主机发送一个本地的RARP广播,能够到达局域网上的所有设备,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。
  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
  3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用。如果不存在,RARP服务器对此不做任何的响应。
  4. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯,如果一直没有收到RARP服务器的响应信息,表示初始化失败。
4.2.1 网卡 MAC

ARP要找MAC,而MAC是在网卡上的。Network Interface Card 网卡工作在链路层组件,是局域网中连接计算机和传输介质的接口,网线插到网卡上,网卡插在电脑的主板上。起到连接你上网的作用。

网卡上的重要组成单元MAC, Media Access Control 地址是6字节数据烧录在网卡上的,MAC地址跟人的身份证号一样具有全球唯一性。网卡上面还装有处理器和存储器,包括RAM和ROM,网卡具有如下作用:

  1. 数据的封装跟解封。
  2. 链路管理,自动处理错误帧数据。
  3. 编码与译码,数据加工发到网络,接受网络数据解析。

IP层拿到MAC地址后,接下来需要网卡将数字信号转换为电信号,网卡一般通过网卡驱动程序工作。这里大致说下网卡工作流程:

  1. 网卡从IP层拿到数据后会复制数据到网卡缓存区。

  2. 在数据头部添加报头跟起始帧分界符用来表示包的起始位置,尾部添加用于检测包是否有损坏的帧校验序列。\

    物理层数据帧

  3. 最后网卡将最终的电信号发出。

4.2.3 IP 跟 MAC 关系

数据传输真实流程

  1. 主机H1网络层数据报通过ARP协议将数据交给数据链路层的MAC1,然后数据被封装成帧发送到MAC2,
  2. 路由器R1通过MAC2收到MAC帧后,向网络层传输并且解封去掉MAC帧的首部,获得干净数据,然后再通过MAC2发送到MAC3,
  3. 路由器R2通过MAC3收到MAC帧后,向网络层传输并且解封去掉MAC帧的首部,获得干净数据,然后再通过MAC3发送到MAC4,
  4. 然后目标路由器收到信息包后不断拆解,最终把数据发送到H2。
  5. 发送时数据从高层下到底层然后才到通信链路上传输,使用IP地址的IP数据报一旦交给数据链路层就加上MAC地址封装成MAC帧,在实际的传送过程中,使用的源地址和目的地址都是MAC地址。

有人可能问既然MAC有唯一性,为什么不直接用MAC要用IP呢?Mac地址种类繁多,海量分布。IP地址就像是门牌号,Mac地址就像身份证号。如果只知道身份证号就只能在全世界查找,如果知道 IP地址,那就跟知道了这个人在世界上详细地址一样,逐层追踪即可,查找起来会快很多。

IP层屏蔽了下层很复杂的细节,让用户在抽象的网络层上讨论问题,让用户使用统一的、抽象的 IP 地址研究主机和主机或主机和路由器之间的通信。通俗一点来说就是有了IP地址,就只通过路由器找到目的主机,屏蔽了下层网络的异构型,由MAC地址完成下层的实际转发。

4.2.4 网关、猫

网关作用


网关

  1. 从一个房间走到另一个房间,必然要经过一扇门。同样从一个网络向另一个网络发送信息,也必须经过一道关口,网关顾名思义 是一个网络连接到另一个网络的关口,也就是网络关卡。
  2. 网关 Gateway 这个概念是逻辑层面的,网关一个大概念,不具体特指一类产品,只要连接两个不同的网络的设备都可以叫网关,可以是局域网也可以是广域网。
  3. 网关实质上是一个网络通向其他网络的IP地址,不同网段通过网关通信。

调制解调器

  • 是一种计算机硬件 ,俗称,它的作用是将电脑想要发送的信息数字信号转换成网线中的电流脉冲模拟信号从而使信息在网线中传输。一般在早期通过电话线上完时候需要用到猫, 最大速度一般不超过56kps,现在几乎很少使用了。

调制调解器

4.2.5 交换机、集线器

数据经过网卡操作到达交换机Switch,交换机工作在 MAC 层,也被为二层网络设备。

  1. 作用:交换机是用来连接多个终端(电脑、手机、打印机),然后帮各个终端来转发数据的,适合局域网内互联。

  2. 原理:交换机的转发原理是记录下每个终端的 MAC 地址,以及这个 MAC 地址对应哪个接口。然后信息来的时候查表导航即可。这里需注意交换机是没有MAC地址的。\

    MAC


    如果查找MAC地址表发现找不到所需信息,此时交换机会以广播的形式把包转发到除源端口外的所有端口上,然后目标端口会自动接收数据,非目标自动屏蔽垃圾数据。这里需注意有个特殊的MAC跟IP地址属于广播地址。以下两个属于广播地址:

  1. MAC =  FF:FF:FF:FF:FF:FF
  2. IP = 255.255.255.255

集线器 hub

  1. 一个口收到的信号,原封不动的发送给所有其他的口,由其他的口上的设备自己决定是否接收信号。有点类似广播,但是比广播更纯粹。
4.2.6 路由器

数据经过交换机如果发现要访问的IP不在局域网内就要找路由器了,路由器 Router 一般特指能够实现路由寻找和转发的特定类产品,路由器很显然能够实现网关的功能。一般说来,路由器作为不同网络之间互相连接的枢纽,路由器系统构成了基于TCP/IP 的国际互联网络Internet 的主体脉络,也可以说,路由器构成了Internet的骨架。

路由器根据接收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据包,路由器一般提供如下功能:

  1. 网络互连:实现不同网络互相通信。
  2. 路径选择:为经过路由器的每个数据帧寻找一条最佳传输路径进行传输。
  3. 数据处理:提供分组过滤转发、优先级、防火墙等功能。
  4. 网络管理:提供配置管理、性能管理、流量控制等功能。

路由器做了2个普通交换机做不了的事:

  1. 不同网段互连:每个主机有自己的ip地址,ip地址又是分网段的,要实现不同网段的互连,必须用到路由器。各地的玩家,ip地址一定是不同网段的。
  2. 网络地址转换:主机在企业内部或者网吧内部,使用的都是私网ip地址,私网ip地址无法进入互联网,想进入互联网,必须转成公网ip。ip地址的转换也是由路由器来做的。

路由器是基于IP设计的,俗称三层网络设备,路由器的每个端口都有MAC地址跟IP地址,路由器会检查数据帧目标地址字段中的数据链路标识。如果它包含了路由器接口标识符或广播标识符,那么路由器将从帧中剥离出数据包并传递给网络层。

当路由器收到电信号后也会转化为数字信号然后进行FCS校验,如果发现发送方的MAC地址是给自己的则接受该帧,否则丢失该帧。

根据目标IP及Routing Table 路由表决定信息如何转发。路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路径表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。Linux服务器一般用 route -n  查询系统当前路由表。

路由规则

  1. desc IP 逐个跟路由表中每行的Netmask按位与运算,获的目标IP,看跟哪一行的Destination相等。
  2. 找到目标行,利用Gateway及对应网卡Iface进行。
  1. Gateway 不为空:说明仍然需要利用Gateway继续上面的路由传输。
  2. Gateway 为空 :说明找到 IP 包头里的目标地址了,到达终点。
  3. 进行ARP请求,先从路由缓存尝试转换,然后再发送ARP请求。进行头部MAC地址的替换。
  4. 进行数字信号到电信号的转换,然后将数据发出。
  5. 经过交换机到达下个路由器,周而复始,直到到达目标地址。

最后一行Destination和Netmask都是 0.0.0.0,表示是默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行。并且后续就把包发给Gateway。

4.2.7 DHCP

Dynamic Host Configuration Protocol 动态主机配置协议是一个局域网的网络协议,这是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,不用用户自己去设置 IP地址子网掩码,然后客户机能够利用这个IP上网。\

UDP获取IP流程


简单说下DHCP交互流程

  1. 因为客户端没有IP地址,所以全程使用UDP广播的形式发送 DHCP Discover包。
  2. 服务器收到后会返回 DHCP Offer包,比如IP地址、子网掩码、默认网关、IP地址租期等。
  3. 客户端从众多回复信息中选一个进行配置,向选中的服务器发送 DHCP Request包请求分配IP。
  4. 服务器收到Request包后,用DHCP ACK 报文对请求报文进行响应,应答所要求的参数。
  5. 这里需注意UDP广播只在局域网,那难道一个局域网就要有个 DHCP服务器吗?系统为此引入了DHCP中继代理,对不同网段的IP地址分配也可以由一个 DHCP 服务器统一进行管理。

DHCP 通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

4.2.8 NAT

NAT


私网IP的服务器想要上网的时候需要转换成公网IP才能跟外界通讯,而   Network Address Translation 网络地址转换 就是负责干这事的。但需注意 NAT只是实现了IP转换,所以还是没有解决IPv4扩容的问题。NAPT 可以实现 IP 地址 + 端口一起进行转换。这就可以实现不同电脑公用一个公网IP,这种转换技术叫 网络地址与端口转换 。

这个转换用到的是 NAPT 路由器的转换表,现在路由器上一般会自动生成跟维护这个表。

缺点

  1. 通信过程中NAT路由器重启,则TCP连接要重置。
  2. NAT表的生产跟转换都需生成跟维护的。
  3. 公网的IP无法主动跟NAT内部服务器建立连接,因为NAPT表没记录。

解决方法

  1. NAT穿透技术:该技术可以让网络程序主动发现自己位于NAT设备上,主动获得NAT设备公网IP,然后建立NAPT表。
  2. 上IPv6:128位二进制绝对够地球上的终端使用。
4.2.9 ICMP

Internet Control Message Protocol互联网控制报文协议 。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。日常你 ping 网络通不通底层基础就是ICMP。

ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。\

ICMP


ICMP 一般分为两类:

  1. 查询报文类型:用于诊断的查询消息。
  2. 差错报文类型:通知出错原因的错误消息。

IPv4 中 ICMP 仅作为一个辅助作用支持 IPv4。也就是说,在 IPv4 时期,即使没有 ICMP,仍然可以实现 IP 通信。然而,在 IPv6 中,ICMP 的作用被扩大,如果没有 ICMPv6,IPv6 就无法进行正常通信。

4.3 IP层解析

4.3.1 IP 头含义

其实经过上面IP层跟链路层必备知识的讲解,大家再看数据从TCP到IP层就简单多了,这里我们以IPv4大致说下网络层核心IP头字段的含义。\

IP头部

  1. 版本号:4位 version 指定IP协议的版本。对IPv4来说,其值是4。其他IPv4协议的扩展版本(如SIP协议和PIP协议),则具有不同的版本号(它们的头部结构也和图2-1不同)。
  2. 头部长度:4位 header length 标识该IP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以IP头部最长是60字节。
  3. 服务类型:8位 Type Of Service,包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延 时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登录程序需要的是 最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。
  4. 总长度:16位 total length 是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535(2^16-1)字节。但由于MTU的限制,长度超过 MTU 的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。接下来的3个字段则描述了如何实现分片。
  5. 标识:16位 identification 唯一地标识主机发送的每一个数据报。其初始值由系统随机生成;每发送一个数据报,其值就加1。该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
  6. 标志字段:3位的第一位保留。第二位(Don’t Fragment,DF)表示禁止分片。如果设置了这个位,IP模块将不对数据报进行分片。在这种情况下,如果IP数据报长度超过MTU的话,IP模块将丢弃该数据报并返回一个ICMP差错报文。第三位(More Fragment,MF)表示更多分片。除了数据报的最后一个分片外,其他分片都要把它置1。
  7. 分片偏移:13位 fragmentation offset 是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移3位(乘8)后得到的。由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍(这样才能保证后面的IP分片拥有一个合适的偏移值)。
  8. 生存时间:8位 Time To Live 是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减 1。当TTL值减为 0 时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
  9. 协议:8位 protocol 用来区分上层协议,我们在第1章讨论过。/etc/protocols文件定义了所有上层协议对应的protocol 字段的数值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一个子集。
  10. 头部校验和:16位 header checksum 由发送端填充,接收端对其使用CRC算法以检验IP数据报头部(注意,仅检验头部)在传输过程中是否损坏。
  11. 源端IP地址和目的端IP地址:32位 用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。
  12. 选项字段:option 是可变长的可选信息。这部分最多包含40字节,因为IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。可用的IP选项包括
  1. 记录路由:record route 告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们就可以跟踪数据报的传递路径。
  2. 时间戳:timestamp 告诉每个路由器都将数据报被转发的时间(或时间与IP地址对)填入IP头部的选项部分,这样就可以测量途经路由之间数据报传输的时间。
  3. 松散源路由选择:loose source routing 指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。
  4. 严格源路由选择:strict source routing 和松散源路由选择类似,不过数据报只能经过被指定的路由器。
4.3.2  IPv6

IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是在 2011 年 IPv4 地址就已经被分配完了。于是又提出了IPv6, IPv6 的地址是 128 位, IPv6 相比于 IPv4 能带来更好的网络体验。

IPv6地址长度是128位,每16位算一组,组跟组之间用 :分割,如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 ::隔开。但是一个 IP 地址中只允许出现一次两个连续的冒号。\

IPv6首部

  1. 版本:和IPv4 一样,由4比特构成。IPv6其版本号为6,因此在这个字段上的值为6。
  2. 通信量类:相当于IPv4的TOS(Type Of Service)字段,也由8比特构成。有TOS在IPv4中几乎没有什么建树,未能成为卓有成效的技术,本来计划在IPv6中删掉这个字段,不过出于今后研究的考虑还是保留了该字段。
  3. 流标号:由20比特构成,准备用于服务质量控制。
  4. 有效荷载长度:有效荷载长度是指包的数据部分。IPv4的TL(Total Length)是指包含首部在内的所有长度。然而IPv6中的这个Playload Length不包括首部,只表示数据部分的长度。
  5. 下一个首部:相当于IPv4中的协议字段。由8比特构成。通常表示IP的上一层协议是TCP或UDP。不过在有IPv6扩展首部的情况下,该字段表示后面第一个扩展首部的协议类。
  6. 数限制:由8比特构成。与IPv4中的TTL意思相同。为了强调可通过路由器个数这个概念,才将名字改为Hop Limit。数据每经过一次路由器就减1,减到0则丢弃数据。
  7. 源地址:由128比特构成,表示发送端IP地址。
  8. 目标地址:由128比特构成,表示接收端IP地址。
  9. IPv6扩展首部:IPv6的首部长度对固定,无法将可选项将入其中,可通过扩展首部对功能进行了有效扩展。扩展首部通常介于IPv6首部与TCP/UDP首部中间。在IPv4中可选项长度固定为40字节,IPv6的扩展首部可以是任意长度。扩展首部当中还可以包含扩展首部协议以及下一个扩展首部字段。

IPv6改进

  1. 取消了首部校验字段:因为在传输层跟链路层都有校验。
  2. 取消可选字段,IPv6首部固定40字节。
  3. 取消了分片跟重组;IPv4时数据按帧传输,中间会经过拆分跟组合,而IPv6版本只允许在源主机跟目标主机拆分重组,中间不允许了,对传播速度进行了提速。

按理来说IPv6那么牛应该马上投入使用替换IPv4,但是因为 IPv4 和 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,还需要网络运营商对现有的设备进行升级,所以目前 IPv6 普及率比较慢。

5 链路层 MAC

其实上面已经讲解到很多关于链路层的设备了,比如网卡、路由器等等。\

MAC层

  1. 接收方的MAC地址:全球唯一,6字节。
  2. 发送方的MAC地址:全球唯一,6字节。
  3. 协议类型:2个字节,大部分的类型是 IP 数据包,然后 IP 里面包含 TCP、UDP,以及 HTTP 等,类型0800 = IP 数据报,类型0806 = ARP请求跟应答。
  4. 真正的数据层:一般 46~1500 字节。
  5. CRC校验:循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误。
  6. 这里重要说一遍,上图中从上到下是以此包含的关系!

5.1 链路层主要功能

5.1.1 并发性解决

链路层主要解决的就是当出现并发的时候,如何解决先后顺序跟 数据混乱问题。

  1. 分多个车道。每个车一个车道,这在计算机网络里叫作信道划分
  2. 今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议
  3. 不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。我们叫作随机接入协议著名的以太网用的就是这个方式。
5.1.2 数据发送稳健性

这个包是发给谁的?谁应该接收?发送时出错咋办?这里的解决办法是用一个物理地址,叫作链路层地址,也常被称作 MAC 地址。\

MAC层简图

5.2 链路层服务

数据链路层最基本的服务是将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层,为达到这一目的,数据链路层必须具备一系列相应的功能:

  1. 将数据封装为frame帧,帧是数据链路层的传送单位。
  2. 控制帧的传输,包括处理传输差错,调节发送速率与接收方相匹配。
  3. 在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。

上述这些功能具体表现在以下几个方面。

5.3 封装成帧

为向网络层提供服务,数据链路层必须使用物理层提供的服务。而物理层是以比特流进行传输的,这时数据链路层为了能实现数据有效的差错控制,就采用了一种的数据块进行传输。在一段数据的前后分别添加首部尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。\

帧首跟帧尾将数据封装成帧

采用帧传输方式的好处是在发现有数据传送错误时,只需将有差错的帧再次传送,而不需要将全部数据的比特流进行重传,这就在传送效率上将大大提高。

帧同步需解决问题

  1. 如何识别帧的开始与结束,这需要特殊的帧首部跟帧尾部来分割。
  2. 重传的数据帧识别,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成已传帧的重传帧呢?这就要靠数据链路层的各种帧同步技术来识别了。帧同步技术既可使接收方能从以上并不是完全有序的比特流中准确地区分出每一帧的开始和结束,同时还可识别重传帧。

5.4 透明传输

由于帧的开始和结束的标记是使用专门指明的控制字符,因此传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。

当传送的帧使用从键盘上输入文本文件组成的帧时,其数据部分显然不会出现像SOH或EOT这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输

非透明传输


问题是如果你传输的不是从键盘输入的,是二进制代码的计算机程序或图像,如果是中间存在EOT则会导致错误。解决办法就是在数据部分如果碰到了 EOTSOH 就添加个 ESC转移字符。

填充ESC后帧

5.5 差错检测

底层数据传输时候出现差错,主要分为两大类:

  1. 比特差错:就是比特在传输过程中可能会产生差错,即1可能会变成0,0可能会变成1。
  2. 帧丢失、帧重复、帧失序:比如发送的是123,接收到了13、1223、132这样的顺序包。

数据传输过程中的衡量指标就是误码率Bit Error Rate:就是在一段时间内,传输错误的比特占所传输比特总数的比率。

实际的通信链路并非理想的,它不可能使误码率下降到零。所以为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种检测措施,目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的检测技术。

6 数据传输的故事

HTTP讲解+ TCP讲解 + 本文IP讲解 + 链路层讲解 = 一个数据包的流浪日记,如果纯技术性文章感觉太枯燥,接下来我们以一个不太严谨的生活举例,将知识点串联下:\

小S

你叫小S,跟很多小伙伴住在一个小区里,当你想跟小伙伴玩耍的时候就喊一喊(集线器),大家都听到后,想玩的下来陪你玩。不想跟你玩的人感觉听到噪音很烦躁,就让李大爷在传达室充当交换机,你想跟院子里人玩的时候,跟交换机李大爷说下,李大爷会告知你要找的小伙伴信息。\

找人通讯


后来你被限足了,不允许出小区大门。此时你想跟外界 小C交流,你把信息发给李大爷,李大爷看到想跟外面通讯。就让你按照外面统一通信的方式( TCP/IP)把信息写好,你发现信封收件地址写的小W收,这地址放到外面没法派送啊!你找小L问下真实地址,小L拿出了姓名-地址映射薄( DNS)查询后告诉了你小C真实地址,然后李大爷叫来了专门负责这个小区快递的快递员( 路由器),这里需注意小区对外只暴露一个公共的地址(公网IP),但是小区不能只有一个人啊!小区里面被分成了N个房间( 私网IP),因为小区里N个住户可能会调换房间,所以每当想对外通讯的时候,快递员路由器会给你动态的分配个 内网IP,并且快递员牛逼之处在于即使两个住户用相同的方式( 端口)把信息发出去快递员也会自动给你重新分配不一样的端口,这叫 NAT技术。

快递员路由器把你的信息通过顺丰/韵达()方式把信息由数字信号变为脉冲信号再发出去,信息不是直达小C小区的哦!就跟你的深圳快递发送到北京可能经过多个中转,虽然你的发件人收件人地址固定死了,但中间可能经过各种路由各种中转,这里其实就用到了ARP包跟根据MAC地址转发,提供路由功能是因为快递员有个小本(路由表)记录着下一站地址, 反正最终信息会到达小C小区的传达室,传达室王大爷在镇守,王大爷会按照相同的方法把信息最终发到小C手里。\

派件快递

你还有个朋友小A,他住的小区由孙大爷看门,因为小A的院子刚盖好,孙大爷刚来不久,孙大爷没有李大爷跟王大爷办公室的电话,李大爷跟王大爷也没有孙大爷的的电话,这时会有两种情况:

  1. 居委会赵大妈告诉了孙大爷关于李、王两位大爷的地址,同时赵大妈也告诉了李、王关于孙的地址,这就叫静态设定路由
  2. 赵大妈病了,孙大爷自己到处发信息,见人就说自己是我是小A他们院子管收发信件的,结果被李、王二位大爷听到了,就记在了他们的通讯录(路由表)上,然后李、王就给孙大爷回了个信息说自己是那个院子负责收发信息的,这叫动态设定路由

有天小S要找小A,小S给李大爷说需求,孙大爷通过通讯录(路由表)查询到小A院子孙大爷管着呢,此时目标是找孙大爷,不过有两种途径

  1. 李大爷直接去找孙大爷。
  2. 李大爷找王大爷,让王大爷去找孙大爷。

李大爷选择 1 还是 2 这叫做路由选择。李大爷当然选择 1 了,因为他遵循最少步骤原则。\

相互联系

前几天小S和小C吵架了,恰好这些天小S老是给小A打电话,小C心想小S是不是在说我人品不行啊,于是小C决定偷听小S和小A的通话,但是他又不能出院子,怎么办呢?小C做了这样一个决定:首先小C告诉王大爷说 “你给李大爷打电话说小A搬到咱们院子了,以后凡是打给他的电话我来接”,王大爷迷迷糊糊就给李大爷打了电话,说:“现在我来管理小A,孙大爷不管了”,结果李大爷就把他的通讯录改了,这叫做路由欺骗

以后小S再找小A,李大爷就转给王大爷了,王大爷收到了这个信息就转给了小C,小C收到这个信息就假装小A和小S通信。因为小C作贼心虚,害怕明天小S和小A见面后当面问他,小C又自己以小S的名义给小A通了个复述了一遍刚才通讯信息,有这就叫数据窃听

再后来,小S还是不断的和小A联系,小C心里嘀咕 “你小S不是不给我打电话吗!那我让你也给小A打不了!

  • 小C联系了一批狐朋狗友,和他们串通好,每天固定一个时间大家一起给小A院子传达室发信息,只要传达室的孙大爷开始接收,就会听到“打雷啦,下雨收衣服啊!”、“人是人他妈生的,妖是妖他妈生的”、“你妈贵姓”等等,听的脑袋都大了,不听又不行,电话不停的响啊!

终于有一天,孙大爷忍不住了,大喊一声:“我受不了拉!!!!”,于是上吊自杀了!

这就是最简单的DDOS攻击,孙大爷心理承受能力弱的现象叫做数据报处理模块有BUG,孙大爷的自杀叫做路由器瘫痪

如果孙大爷身体健壮可以应付这些垃圾信息,这叫健壮的数据报处理,能够抵御任何攻击。孙大爷瘫了之后,小S终于不再给小A打电话了,因为无论他无论如何发信息,对方都是拒绝服务,所以小C的做法还有一个名字叫做拒绝服务攻击

新人小B入住


几天后,小C的院子来了一个美丽的女孩,名字叫做小B,小C很喜欢她,可是小B有个很帅的男朋友,小C干瞪眼没办法。同时小B是不能出院子的。那个男的想追小B自然只能发信息,于是小C又蠢蠢欲动了。小C了解到王大爷之所以能管理电话是因为他有一个 通讯录,因为同一个院子可能有2个孩子都叫小C,靠名字无法区分,所以通讯录上每一行只有两项:

门牌(MAC)电话(IP)
一号门 1234567 (一号门里面是小C)
二号门 7654321 (二号门里面是小B)

每次发信息人家都要说出要找的电话号码(IP),然后通过通讯录去院子里面敲门,比如人家说我找1234567,王大爷就去敲一号门收信息,如果是找7654321,那他就找二号门收信息。这里的电话号码就是传说中的IP地址。这里的门牌号就是传说中的网卡的MAC地址,每一块网卡的 MAC 地址都是不一样的,这是网卡的制造商写死在网卡的芯片中的。\

小C为了泡妞打起了王大爷通讯录的主意,小C趁王大爷去上厕所时,偷偷的摸进传达室,小心翼翼的改了王大爷的通讯录。过了几天,小B的男朋友又给小B来了信息,对方报的是 7654321,王大爷一看通讯录:

门牌(MAC)电话(IP)
一号门 1234567 (一号门里面是小C)
一号门 7654321 (被修改成映射到一号门)

王大爷不知道改了啊,于是就去找一号门的小C了,小C以小B父亲的口吻严厉的教训了那个男的和小B之间不正当的男女关系,并责令小B男朋友立马跟小B分手。这里小C的行为叫做ARP欺骗,因为在实际的网络上是通过发送ARP数据包来实现的,所以叫做ARP欺骗。\

这里要注意,王大爷现在有两个通讯录了,一个是记录每个院子传达室电话的本本,叫做路由表,一个是现在说的记录院子里面详细信息的本本,叫做ARP表,王大爷为了保证安全可以把表藏起来,这就对应程序加密解密。

王大爷的员工手册中有一条是这么写的每个月要重新检查一下门牌号和电话的对应本,也就是ARP表,这个动作叫做刷新ARP表,每个月的时间限制叫做刷新ARP表的周期。这样小C为了让那个男的永远不能找到小B,之后每个月都要偷偷改一次那个通讯录,不过这样也是不得不做的事啊!

补充一点,小C是很聪明的,如果通讯录(ARP表)被改成了这样:

门牌(MAC)电话(IP)
一号门 1234567 (这个是小C的)
二号门 1234567 (注意:这个被小C改了,但是他一时头晕改错了)

计算机就会弹出一个对话框提示出现重复的IP地址,最终会导致王大爷不知所措,于是通知一号门和二号门,你们的电话重复了。这样小B就知道有人在破坏她的好事,这个现象叫做骗局被揭穿了。\

当然小S为了防止自己通话被人窃听,也可以对通话内容进行加密,这部分细节在 HTTP 中讲到了。

5 参考

  1. 说网关:zhuanlan.zhihu.com/p/35200000
  2. TCP/IP讲解:developer.51cto.com/art/201906/…
  3. 小林网络:t.1yb.co/fQG3