一,网络层
网络层的核心工作:
1,地址管理(按照什么样子的规则来描述网上的地址)
2,路由选择

- 4位版本:描述 IP 协议的版本,主要有IPv4和IPv6,对于IPv4来说,就是4
- 4位头部长度(headerlength):IP头部的长度是多少个32bit,也就是length*4的字节数.4bit表示最大的数字是15,因此IP头部最大长度是60字节
- 8位服务类型(TypeOfService):3位优先权字段(已经弃⽤),4位TOS字段,和1位保留字段(必须置为 0). 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要。对于ftp这样的程序,最大吞吐量比较重要
- 16位总长度(totallength):IP数据报整体占多少个字节
通过这个16位可得传输上限为64KB,
所以一个IP数据包最大是64KB,
但是一个IP数据包能够携带的载荷的长度(传输层数据包的长度)并不受限于64KB(IP协议内置了拆包组包的功能,当IP发现要携带的传输层数据太大了,就会自动拆分成多个数据包)
- 16位标识(id):唯⼀的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每⼀个⽚里面的这个id都是相同的
(标识相同的IP数据报,说明携带的载荷是一起的,就可以进行组包)
- 3位标志字段:第⼀位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第⼆位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文,第三位表示"更多分片",如果分片了的话,最后⼀个分片置为1,其他是0,类似于⼀个结束标记.
(即其中两个位有效,其中一位表示"是否触发了拆包组包",另一个位表示当前这个包是不是最后一个)
- 13位分片偏移(framegamentoffset):是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置,实际偏移的字节数是这个值*8得到的,因此,除了最后⼀个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
(描述了进行组包,这些包之间的顺序)
8位生存时间(TimeToLive,TTL):数据报到达目的地的最大报文跳数,一般是64。每次经过⼀个路 由,TTL-=1(即转发次数-1)⼀直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环
(描述了一个IP数据报在网上能够存活的最大时间)
(这个生存时间是一个整数,表示"转发次数")
• 8位协议:表示上层协议的类型(描述了当前IP数据报,载荷里是保存的TCP还是UDP的数据)
• 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏.(只是校验报头,不校验载荷)
• 32位源地址和32位目标地址:表示发送端和接收端
1.1 地址管理
1.1.1 网段划分
IP地址分为两个部分,网络号和主机号(前半部分称为网络号,后半部分称为主机号)
1)网络号:保证相互连接的两个网段具有不同的标识
同一个局域网中,所有设备的IP地址的"网络号"必须相同
两个相邻的局域网,网络号也必须不同
一个路由器,连接了两个局域网(路由器上有两类接口:LAN和WAN【相当于局域网和广域网】),而一个路由器连接的这两个局域网就是"相邻的局域网"
2)主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
同一个局域网中,所有设备的IP地址的"主机号"必须不同
- 不同的子网其实就是把网络号相同的主机放在一起
- 如果在子网中新增⼀台主机,则这台主机的网络号和这个子网的网络号⼀致,但是主机号必须不能和子网中的其他主机重复
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。 那么问题来了,手动管理子网内的IP,是⼀个相当⿇烦的事情.
• 有⼀种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便.
• 一般的路由器都带有DHCP功能,因此路由器也可以看做⼀个DHCP服务器
CIDR
• 引入⼀个额外的子网掩码(subnetmask)来区分网络号和主机号;
• 子网掩码也是⼀个32位的正整数,通常用⼀串"0"来结尾;
子网掩码通常前面都是1,后面都是0
而子网掩码中,前面有多少个1,则IP地址的前多少个比特位就是网络号
• 将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号;
• 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有⼀种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0
1.1.2 特殊的IP地址
• 将IP地址中的主机地址全部设为0(二进制),就成为了网络号,代表这个局域网;
此IP表示网络号 ,表示整个网段,不应该分配给具体的设备
• 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同⼀个链路中相互连接的所有主机发送数据包;
往这个IP上发送数据,就会直接把数据转发给局域网中的所有设备
• 127.* 的IP地址用于本机环回(loopback)测试,通常是127.0.0.1
1.1.3 IP地址的数量限制
IP地址(IPv4)是⼀个4字节32位的正整数.那么⼀共只有2的32次⽅个IP地址,⼤概是43亿左 右.⽽TCP/IP协议规定,每个主机都需要有⼀个IP地址
实际上,由于⼀些特殊的IP地址的存在,数量远不⾜43亿;另外IP地址并⾮是按照主机台数来配置的,⽽ 是每⼀个⽹卡都需要配置⼀个或多个IP地址
CIDR在⼀定程度上缓解了IP地址不够⽤的问题(提⾼了利⽤率,减少了浪费,但是IP地址的绝对上限并没 有增加),仍然不是很够⽤.这时候有三种⽅式来解决
1)动态分配IP地址
某个设备需要上网,就分配,不需要上网就暂时不分配(只能够一定程度上缓解,但是不能从根本上解决问题)
2)NAT网络地址映射
这个方案相当于用一个IP代替多个设备(提高了IP利用率)
3)IPv6
扩展了IP地址的长度(大幅度增加了IP地址的个数)
IPv6并不是IPv4的简单升级版.这是互不相干的两个协议,彼此并不兼容。IPv6用16字节128位 来表示⼀个IP地址,但是目前IPv6还没有普及
首先,NAT把所有的IP地址分为两个大类
1,公网IP / 外网IP
公网IP必须是唯一的
2,私网IP / 内网IP
私网IP在同一个局域网中,不能重复
但是在不同的局域网中,允许重复
此时,一个公网IP就不是代表一个设备了,而是代表一个局域网中的一系列设备了
假设主机A给主机B发数据:
1)A和B在同一个局域网中,不涉及NAT
2)A和B都在公网中,不涉及NAT
3)A和B是在不同的局域网中,NAT禁止这样的通信
4)A在公网中,B在局域网中,NAT也禁止这样的通信
5)A是在局域网中,B在公网中,此时的通信就会涉及NAT
1.1.4 私有IP地址和公网IP地址
如果⼀个组织内部组建局域⽹,IP地址只⽤于局域⽹内的通信,⽽不直接连到Internet上,理论上使⽤任意的IP地址都可以,但是RFC1918规定了⽤于组建局域网的私有IP地址(有三类如下)
• 10.*,前8位是网络号,共16,777,216个地址
• 172.16.到172.31.*,前12位是网络号,共1,048,576个地址
• 192.168.*,前16位是网络号,共65,536个地址 包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP);
• ⼀个路由器可以配置两个IP地址,⼀个是WAN⼝IP,⼀个是LAN⼝IP(子网IP).
• 路由器LAN⼝连接的主机,都从属于当前这个路由器的子网中.
• 不同的路由器,子网IP其实都是⼀样的(通常都是192.168.1.1),子网内的主机IP地址不能重复.但是子网之间的IP地址就可以重复了.
• 每⼀个家用路由器,其实又作为运营商路由器的子网中的⼀个节点.这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN⼝IP就是⼀个公网IP了.
• 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN⼝IP),这样逐级替换,最终数据包中的IP地址成为⼀个公网IP,这种技术称为NAT(NetworkAddress Translation,网络地址转换).
其中,路由器进行NAT替换,除了替换IP之外,也可能替换端口,确保替换之后的端口是不重复的(如果重复了,会随机分配一个空闲的端口)
• 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在⼀台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买
1.2 路由选择
在复杂的网络结构中,找出⼀条通往终点的路线
路由的过程,是⼀跳⼀跳(HopbyHop)"问路"的过程
所谓"⼀跳"就是数据链路层中的⼀个区间,具体在以太网中指从源MAC地址到⽬的MAC地址之间的帧传输区间
IP数据包的传输过程也和问路⼀样
- 当IP数据包,到达路由器时,路由器会先查看目的IP;(每个路由器都只知道相邻的设备的情况,但是更远的就不知道了)
- 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下⼀个路由器;
- 依次反复,⼀直到达目标IP地址
那么如何判定当前这个数据包该发送到哪⾥呢?这个就依靠每个节点内部维护⼀个路由表
路由表中包含了目的IP网络号和走哪个口(LAN/WAN)
- 路由表可以使用route命令查看(在查询路由器的时候,会匹配要找的目的IP是否存在在路由表中,如果存在,此时路由器就认识这个具体位置,直接会指出一个明确的路线,如果不存在,此时路由器就会指一个方向,沿着这个方向走,就可以更接近目标)
- 如果目的IP命中了路由表,就直接转发即可;
- 路由表中的最后一行,主要由下⼀跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下⼀跳地址
假设某主机上的网络接口配置和路由表如下:

default相当于下一跳,通常对应到更上级的路由器
eth0和eth1 即网络接口,相当于路由器上的LAN还是WAN
• 这台主机有两个网络接口,⼀个网络接口连到192.168.10.0/24⽹络,另⼀个网络接口连到 192.168.56.0/24⽹络;
• 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下⼀跳地址,Iface是发送接口,Flags中的U标志表示此条⽬有效(可以禁⽤某些条⽬),G标志表示此条⽬的下⼀跳地址是某个路由器的地址,没有G标志的条⽬表示⽬的⽹络地址是与本机接⼝直接相连的⽹络,不必经路由器转发;
转发过程例1:如果要发送的数据包的⽬的地址是192.168.56.3
• 跟第⼀⾏的⼦⽹掩码做与运算得到192.168.56.0,与第⼀⾏的⽬的⽹络地址不符
• 再跟第⼆⾏的⼦⽹掩码做与运算得到192.168.56.0,正是第⼆⾏的⽬的⽹络地址,因此从eth1接⼝发送出去;
• 由于192.168.56.0/24正是与eth1接⼝直接相连的⽹络,因此可以直接发到⽬的主机,不需要经路由器转发;
转发过程例2:如果要发送的数据包的⽬的地址是202.10.1.2
• 依次和路由表前⼏项进⾏对⽐,发现都不匹配;
• 按缺省路由条⽬,从eth0接⼝发出去,发往192.168.10.1路由器;
• 由192.168.10.1路由器根据它的路由表决定下⼀跳地址
二,数据链路层
数据链路层主要用来处理两个相邻设备的转发
2.1 以太网
• "以太网"不是⼀种具体的网络,而是⼀种技术标准。既包含了数据链路层的内容,也包含了⼀些物理层的内容,例如:规定了网络拓扑结构,访问控制方式,传输速率等;
• 例如以太网中的网线必须使用双绞线。传输速率有10M,100M,1000M等;
• 以太网是当前应用最⼴泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等
2.1.1 以太网帧格式

- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的,而这个mac地址是6个字节的,也叫做"物理地址",由于是6个字节,所以mac地址是可以做到唯一的(开发时也经常将mac地址作为设备的身份标识)
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP(即有一种类型表示载荷是IP数据包,另外还有两种类型表示ARP和RARP两种数据即另外两种协议)
- 帧末尾是CRC校验码
- 其中1500表示载荷的长度最大只有1500字节即1kb多一些,针对IP协议来说,拆包组包起始不是按照64KB而是按照这里的1500(比喻:IP协议对行李打包,数据链路层则是装行李的车,但是车有点小),这里将1500称为MTU
MTU
MTU相当于发快递时对包裹尺⼨的限制,这个限制是不同的数据链路对应的物理层,产⽣的限制.
- 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填充位;
- 最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU;
- 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进⾏分⽚(fragmentation);
- 不同的数据链路层标准的MTU是不同的
对比IP地址和mac地址
- IP地址描述的是路途总体的起点和终点
- mac地址描述的是路途上的每⼀个区间的起点和终点
- 每次到了一个交换机/路由器都会更新源mac和目的mac,源IP和目的IP不变
mac地址
- mac地址通过16进制表示,1个十六进制数字表示4bit,2个十六进制数字则表示8bit即一个字节,字节之间用 - 或者 :分割
- 长度为48位
- MAC地址用来识别数据链路层中相连的节点
- 在网卡出⼚时就确定了,不能修改.mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些⽹卡⽀持⽤⼾配置mac地址)
补充
数据链路层还有一个重要的事情是需要决定当前这个数据要从哪个口上发出去
在网络层中,IP是通过路由表决定数据是走LAN还是WAN
而数据链路层这里会维护一个"转发表"数据结构(这个转发表是硬件上的表)
LSW转发芯片(Lan Switch)就包含了这个转发表,能够探测到每个口连接到的对端的设备对应的mac地址
除了以太网,数据链路层还有哪些协议?wifi,蓝牙,5G
ARP
ARP不是⼀个单纯的数据链路层的协议,⽽是⼀个介于数据链路层和⽹络层之间的协议
ARP协议的作用
ARP协议建⽴了主机IP地址和MAC地址的映射关系.
• 在⽹络通讯时,源主机的应⽤程序知道⽬的主机的IP地址和端⼝号,却不知道⽬的主机的硬件地址;
• 数据包⾸先是被⽹卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直 接丢弃;
• 因此在通讯前必须获得⽬的主机的硬件地址
ARP协议的⼯作流程
• 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求⼴播到 本地⽹段(以太⽹帧⾸部的硬件地址填FF:FF:FF:FF:FF:FF表⽰⼴播);
• ⽬的主机接收到⼴播的ARP请求,发现其中的IP地址与本机相符,则发送⼀个ARP应答数据包给源主 机,将⾃⼰的硬件地址填写在应答包中;
• 每台主机都维护⼀个ARP缓存表,可以⽤arp-a命令查看。缓存表中的表项有过期时间(⼀般为20分 钟),如果20分钟内没有再次使⽤某个表项,则该表项失效,下次还要发ARP请求来获得⽬的主机的硬件地址
三,重要应用层协议DNS
DNS是⼀整套从域名映射到IP的系统,即域名解析协议
域名就是俗称的"网址"
DNS背景
TCP/IP中使用IP地址和端⼝号来确定⽹络上的⼀台主机的⼀个程序.但是IP地址不⽅便记忆. 于是⼈们发明了⼀种叫主机名的东西,是⼀个字符串,并且使⽤hosts⽂件来描述主机名和IP地址的关系
• DNS是应⽤层协议
• DNS底层使⽤UDP进⾏解析
• 浏览器会缓存DNS结果
早期是通过简单的文件映射实现域名和IP的转换,但是这种方法维护起来很麻烦
后来搭建了服务器,直接通过服务器维护域名和ip的关系
当访问某个域名的时候,就可以先访问对应的服务器,根据域名查询到ip然后再根据ip进行通信
但是,当前上网的设备有很多,此时DNS服务器就会承受很高的并发量,所以有如下方法缓解:
1)咱们自己的电脑,会对域名进行缓存
比如访问百度的时候,不需要每次都重新访问DNS获取ip(域名和ip的对应关系,变化不会很频繁)
2)分布式
DNS服务器有很多个
维护原始服务器的DNS服务器称为"根域名服务器",比如,如果我们自己搭建一个网站就需要向其申请域名,指向自己的ip
很多的运营商/大型的互联网公司,也会搭建DNS镜像服务器,就相当于有了很多个DNS服务器
DNS域名是会分级来存储的
