网络层

网络层功能:地址管理,路由选择
网络层协议:IP,ICMP,ARP等


IP协议
(IPV4(主),IPV6)


IP协议头格式
这里写图片描述

  • 4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4
  • 4位头部⻓度: IP头部的⻓度是多少个32bit, 也就是 length * 4 的字节数. 4bit表⽰最⼤的数字是15, 因此IP头部最⼤⻓度是60字节.
  • 8位服务类型: 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为
    0). 4位TOS分别表⽰: 最⼩延时, 最⼤吞吐量, 最⾼可靠性, 最⼩成本. 这四者相互冲突, 只能选择⼀个. 对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要.
  • 16位总⻓度(total length): IP数据报整体占多少个字节.
  • 16位标识(id): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯的这个id都是相同的.
  • 3位标志字段: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1表⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰”更多分⽚”, 如果分⽚了的话, 最后⼀个分⽚置为1, 其他是0. 类似于⼀个结束标记.
  • 13位分⽚偏移(framegament offset): 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
  • 8位⽣存时间(Time To Live, TTL): 数据报到达目的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防⽌出现路由循环
  • 8位协议: 表⽰上层协议的类型
  • 16位头部校验和: 使⽤CRC进⾏校验, 来鉴别头部是否损坏.
  • 32位源地址和32位⺫标地址: 表⽰发送端和接收端

网段划分:


IP地址分为两个部分,网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同⼀网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号(主机号为1的代表局域网中路由器)
这里写图片描述


早期网段划分:(已弃掉)
这里写图片描述

A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255


CIDR划分

引⼊⼀个额外的⼦网掩码(subnet mask)来区分网络号和主机号
⼦网掩码也是⼀个32位的正整数. 通常⽤⼀串 “0” 来结尾
将IP地址和⼦网掩码进⾏ “按位与” 操作, 得到的结果就是网络号
网络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关

例:
IP地址192.168.1.34
子网掩码 255.255.255.0
网络号为192.168.1

IP地址192.168.1.68
子网掩码 255.255.255.240
网络号为192.168.1.64

特殊IP地址

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, ⽤于给同⼀个链路中相互连接的所有主机发送数据包
  • 127.* 用于本机环回测试

考题


这里写图片描述
答案:B(参考上面资料,原始IP地址划分)
这里写图片描述

192.168.1.110/27 27表示网络有27位,子网掩码32位中前27位为1其余为0,则网络号为192.168.1.96 因为110转化为二进制位0110 0100,因为27位1,与运算完后,得192.168.1.96(网络号),相同网络号的在同一子网,B排除,与网络号相同,表示这个局域网,不是主机,故选C

这里写图片描述

40.15.128.0/17 变换格式(只是运算)40.15.1000 0000.0/17(将128展开)这里分成了两个子网,也就只需要用一位来表示。也就是第18位 ,因为40.15.128.0/18是其一个子网IP段,第一个地址的第十八位是0,第二个子网18位只能是1喽。故选D


IP地址的数量限制
(IP不够用)
CIDR在⼀定程度上缓解了IP地址不够⽤的问题(提⾼了利⽤率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够⽤. 这时候有三种⽅式来解决:
1. 动态分配IP地址: 只给接⼊网络的设备分配IP地址. 因此同⼀个MAC地址的设备, 每次接⼊互联网中,得到的IP地址不⼀定是相同的。
2. NAT技术
3. IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6⽤16字节128位来表⽰⼀个IP地址; 但是目前IPv6还没有普及(没有向前兼容,替换成本太高)

私有IP地址和公网IP地址

  • 如果⼀个组织内部组建局域网,IP地址只⽤于局域网内的通信,⽽不直接连到Internet上,理论上 使⽤任意的IP地址都可以,但是RFC 1918规定了⽤于组建局域网的私有IP地址

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

路由


  • 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
  • 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下⼀个路由器;
  • 依次反复, ⼀直到达目标IP地址
  • 如何判定当前这个数据包该发送到哪⾥呢? 这个就依靠每个节点内部维护⼀个路由表
  • 路由表可以使⽤route命令查看
  • 如果目的IP命中了路由表, 就直接转发即可;
  • 路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当目的地址与路由表中其它⾏都不匹配时,就按缺省路由条目规定的接⼝发送到下⼀跳地址
  • 路由表可以由网络管理员⼿动维护(静态路由), 也可以通过⼀些算法⾃动⽣成(动态路由)
    这里写图片描述

  • 路由表的Destination是目的网络地址,Genmask是⼦网掩码,Gateway是下⼀跳地址,Iface是发送接⼝,Flags中的U标志表⽰此条目有效(可以禁⽤某些 条目),G标志表⽰此条目的下⼀跳地址是某个路由器的地址,没有G标志的条目表⽰目的网络地址是与本机接⼝直接相连的网络,不必经路由器转发。


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请求来获得目的主机的硬件地址
    缓存表是为了将IP地址与MAC相对应,不是一直有效,是因为网络中的IP是不断地分配更新的,不是固定的,所以缓存表要不断的更新)

ARP数据报的格式
这里写图片描述

  • 源MAC地址、目的MAC地址在以太网⾸部和ARP请求中各出现⼀次,对于链路层为 以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址⻓度对于以太网地址为6字节;
  • 协议地址⻓度对于和IP地址为4字节;
  • op字段为1表⽰ARP请求,op字段为2表⽰ARP应答。

ICMP协议


代表:ping指令,traceroute命令

这里写图片描述
- ping后边跟的是域名或者IP地址,不是URL
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL,延迟性等(IP包中的Time To Live, ⽣存周期).
- ping命令会先发送⼀个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回⼀个ICMP Echo Reply

  • traceroute命令能够打印出可执⾏程序主机, ⼀直到目标主机之前经历多少路由器

ICMP的报文格式
这里写图片描述


ICMP功能

  • 确认IP包是否成功到达目标地址.
  • 通知在发送过程中IP包被丢弃的原因.
  • ICMP也是基于IP协议⼯作的. 但是它并不是传输层的功能, 因此⼈们仍然把它归结为网络层协议;
  • ICMP只能搭配IPv4使⽤. 如果是IPv6的情况下, 需要是⽤ICMPv6

ICMP两类报文

  1. 通知出错的原因
  2. 用于诊断查询

图中数字为十进制
这里写图片描述


NAT技术


NAT能够将私有IP对外通信时转为全局IP. 也就是⼀种将私有IP和全局IP相互转化的技术⽅法:
很多学校, 家庭, 公司内部采⽤每个终端设置私有IP, ⽽在路由器或必要的服务器上设置全局IP;
全局IP要求唯⼀, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;


NAT IP转化过程

这里写图片描述
NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
NAT路由器收到外部的数据时, ⼜会把目标IP从202.244.174.37替换回10.0.0.10;
在NAT路由器内部, 有⼀张⾃动⽣成的, ⽤于地址转换的表;
当 10.0.0.10 第⼀次向 163.221.120.9 发送数据时就会⽣成表中的映射关系


NATP
这里写图片描述


NAT缺陷

  • ⽆法从NAT外部向内部服务器建⽴连接;
  • 装换表的⽣成和销毁都需要额外开销;
  • 通信过程中⼀旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开

NAT与代理服务器的区别

从应⽤上讲, NAT设备是网络基础设备之⼀, 解决的是IP不⾜的问题. 代理服务器则是更贴近具体应⽤, ⽐如通过代理服务器进⾏翻墙, 另外像迅游这样的加速器, 也是使⽤代理服务器.
从底层实现上讲, NAT是⼯作在网络层, 直接对IP地址进⾏替换. 代理服务器往往⼯作在应⽤层.
从使⽤范围上讲, NAT⼀般在局域网的出⼝部署, 代理服务器可以在局域网做, 也可以在广域网做,也可以跨网.
从部署位置上看, NAT⼀般集成在防⽕墙, 路由器等硬件设备上, 代理服务器则是⼀个软件程序, 需要部署在服务器上


OSI七层模型:
https://blog.csdn.net/Romantic_C/article/details/81665591
网络套接字:
http://www.noobyard.com/article/p-afkejdbv-pg.html
UDP服务器:
https://blog.csdn.net/Romantic_C/article/details/81705468
TCP服务器:
https://blog.csdn.net/Romantic_C/article/details/81707907
应用层:
http://www.noobyard.com/article/p-yqikerbl-rr.html
传输层:
https://blog.csdn.net/Romantic_C/article/details/81747317
网络层:
http://www.noobyard.com/article/p-flnqpmhh-qe.html
数据链路层:
http://www.noobyard.com/article/p-vsbedtvz-sw.html