计算机网络(1) |青训营笔记

156 阅读24分钟

昨天直播时李*老师再次强调基础的重要性,复习相关知识点,顺便写个笔记

网络分层.jpg

OSI 7 层 网络模型

  • 应用层,负责给应用程序提供统一的接口;
  • 表示层,负责把数据转换成兼容另一个系统能识别的格式;
  • 会话层,负责建立、管理和终止表示层实体之间的通信会话;
  • 传输层,负责端到端的数据传输;
  • 网络层,负责数据的路由、转发、分片;
  • 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
  • 物理层,负责在物理网络中传输数据帧;

TCP/IP 网络模型

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、DNS、FTP 等;
  • 传输层,负责端到端的通信,比如 TCP、UDP 等;
  • 网络层,负责网络包的封装、分片、路由、转发,比如 IP、ICMP 等;
  • 网络接口层,负责网络包在物理网络中的传输,比如网络包的封帧、 MAC 寻址、差错检测,以及通过网卡传输网络帧等;

网络层会涉及到什么协议呢

  • 网络层协议有: ARP协议,IP协议,ICMP协议,IGMP协议。

  • ARP协议

    • 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
    • 地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。
    • ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。
  • IP协议:

    • IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务
  • ICMP协议:

    • ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
    • ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。
  • IGMP协议:

    • 互联网组管理协议(IGMP,Internet Group Management Protocol)是因特网协议家族中的一个组播协议。
    • TCP/IP协议族的一个子协议,用于IP主机向任一个直接相邻的路由器报告他们的组成员情况。允许Internet主机参加多播,也是IP主机用作向相邻多目路由器报告多目组成员的协议。多目路由器是支持组播的路由器,向本地网络发送IGMP查询。主机通过发送IGMP报告来应答查询。组播路由器负责将组播包转发到所有网络中组播成员。 

字节序是什么

  • 大于一个字节类型的数据在内存中的存放顺序。是在跨平台和网络编程中,时常要考虑的问题

  • 字节序经常被分为两类:

    1. Big-Endian(大端,网络):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
    2. Little-Endian(小端,主机):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  • 高低地址与高低字节:

    • 内存的空间布局大致如下:

      最高内存地址 0xFFFFFFFF -> 栈区(从高内存地址,往 低内存地址发展。即栈底在高地址,栈顶在低地址) -> 堆区(从低内存地址 ,往 高内存地址发展)-> 全局区(常量和全局变量)-> 代码区-> 最低内存地址 0x00000000

    • 在十进制中靠左边的是高位,靠右边的是低位,在其他进制也是如此。例如 0x12345678,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

      • 网络字节序 就是 大端字节序:4个字节的32 bit值以下面的次序传输,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit
      • 主机字节序 就是 小端字节序,现代PC大多采用小端字节序
  • 计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节…如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节;小端字节序正好相反。为何还要弄出个小端序?

    • 这是因为计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的,所以计算机的内部处理都是小端字节序。
    • 但是人类还是习惯读写大端字节序,所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存
  • 如果C++程序通过socket将变量a = 0x12345678的首地址传递给了Java程序,由于Java采取Big Endian方式存取数据,很自然的它会将你的数据解析为0x78563412,这样问题就出现了

    • C++提供了相应的函数接口,htonl、htons用于主机序转换到网络序,ntohl、ntohs用于网络序转换到主机序。htons用于主机序转换到网络序,ntohl、ntohs用于网络序转换到主机序。其中h表示host主机,n表示network网络。

键入网址到网页显示,期间发生了什么?

  • 浏览器做的第一步工作是解析 URL,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息,然后委托操作系统将消息发送给 Web 服务器
  • 下一步是通过DNS 服务器查询服务器域名对应的 IP 地址,浏览器缓存 -> 系统本地缓存 -> host文件 -> 本地DNS -> 根DNS -> 顶级域名服务器(.com) -> 权威域名服务器
  • 然后应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。
  • 协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作
  • 协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的;根据路由表规则,来判断哪一个网卡作为源地址 IP
  • 生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。在 MAC 包头里需要发送方 MAC 地址接收方目标 MAC 地址,用于两点之间的传输接收方的 MAC 地址需要 ARP 协议帮我们找到路由器的 MAC 地址
  • 网络包只是存放在内存中的一串二进制数字信息,通过网卡将数字信息转换为电信号在网线上传输,网卡会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
  • 交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备,交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口
  • 网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包
  • 数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器自己的 MAC 地址符合,符合就将包收起来。接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道自己上层是 TCP 协议。于是,扒开 TCP 的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。于是,服务器自然就知道是 HTTP 进程想要这个包,于是就将包发给 HTTP 进程。服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,于是就把这个网页封装在 HTTP 响应报文里。HTTP 响应报文也需要穿上 TCP、IP、MAC 头部,不过这次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址

交换机是什么?

  • 交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备

  • 信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。然后通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机的网卡相同,但交换机的工作方式和网卡不同。计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。因此,和网卡不同,交换机的端口不具有 MAC 地址

  • 将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。交换机的 MAC 地址表主要包含两个信息:

    • 一个是设备的 MAC 地址,
    • 另一个是该设备连接在交换机的哪个端口上。
  • 交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口

    • 地址表中找不到指定的 MAC 地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址被从地址表中删除了。
    • 这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

路由器和交换机的区别

  • 网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。不过在具体的操作过程上,路由器和交换机是有区别的。

    • 因为路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
    • 交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址

路由器的工作原理

  • 路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方;同时还具有 IP 地址,从这个意义上来说,它和计算机的网卡是一样的。当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

  • 电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的 FCS 进行错误校验。如果没问题则检查 MAC 头部中的接收方 MAC 地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。总的来说,路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃

  • 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃

  • 接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操作。

    • 转发操作分为几个阶段,首先是查询路由表判断转发目标。根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。每个条目的子网掩码和 192.168.1.100 IP 做 & 与运算后,得到的结果与对应条目的目标地址进行匹配,如果匹配就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」
  • 路由器的发送操作:根据路由表的网关列判断对方的地址。

    • 如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
    • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点
  • 知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

  • 发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

  • 源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输

NAT 基本原理

  • NAT的基本工作原理是,当私有网主机和公共网主机通信的IP包经过NAT网关时,将IP包中的源IP或目的IP在私有IP和NAT的公共IP之间进行转换。
  • NAT技术无可否认是在ipv4地址资源的短缺时候起到了缓解作用;在减少用户申请ISP服务的花费和提供比较完善的负载平衡功能等方面带来了不少好处。但是在ipv4地址在以后几年将会枯竭,NAT技术不能改变ip地址空间不足的本质。然而在安全机制上也潜在着威胁,在配置和管理上也是一个挑战。如果要从根本上解决ip地址资源的问题,ipv6才是最根本之路。在ipv4转换到ipv6的过程中,NAT技术确实是一个不错的选择,相对其他的方案优势也非常明显。

IP层相关问题

网络IP地址转化流程,外网IP和内网IP是怎么转换的

  • 公网ip具有世界范围的唯一性,而内网ip只在局域网内部具有唯一性。并且,一个局域网里所有电脑的内网IP是互不相同的,但共用一个外网IP

  • 在局域网中,每台电脑都可以自己分配自己的IP,但是这个IP只在局域网中有效。而如果你将电脑连接到互联网,你的网络提供商的服务器会为你分配一个IP地址,这个IP地址才是你在外网的IP。两个IP同时存在,一个对内,一个对外。内网主要作用有:

    • 共享传输信道:简单地理解就是不需要每台电脑一个外网IP地址;
    • 传输速率高:内网之间的电脑因为没有外网网络拓扑的复杂性,所以互相通信的网络可以很快,比如从一个台电脑向另一台电脑复制一个几G的文件可能只需要数十秒时间。
    • 误码率低:因为通信距离很近,所以误码率很低,换句话说就是网络很稳定
  • 互联网上的IP(即外网IP)地址统一由一个叫“IANA”的组织来管理。由于分配不合理以及IPv4协议本身存在的局限,现在互联网的IP地址资源越来越紧张。

  • NAT技术:实现内网电脑访问外网的能力

    • 假如电脑A想要访问百度,百度的IP我们假设为:172.168.30.3;电脑A的IP是我们虚构的,实际上可能并不存在这样一个IP,如果用电脑A的IP去访问百度,那肯定行不通。由于百度和电脑A不在一个局域网内,所以A要访问百度,那么必须得经过网关。而网关的这个IP地址,是真实存在的,是可以访问百度的。为了让 A 可以访问百度,那么我们可以采取这样的方法:让网关去帮助 A 访问,然后百度把结果传递给网关,而网关再把结果传递给 A
    • 不过电脑A、B、C都可能拜托网关去帮忙访问百度,而百度返回的结果 的目的IP都是网关的IP=192.168.1.1,去访问百度的时候,把 A的IP + 端口 映射成 网关的IP+端口就可以唯一确定身份
    • 百度把结果返回给网关的80端口之后,网关再通过映射表,就可以把结果返回给 A的60端口了。
    • 这种方法地址的映射转换,我们也称之为网络地址转换,英文为 Network Address Translation,简称NAT。
  • 像A、B、C这样的IP地址我们也称之为内网IP,即内网IP;而像网关,百度这样的IP我们称之为外网IP(即互联网公网IP)。

ping 的工作原理

  • ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议, 主要的功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等;ICMP 报文封装在 IP 包里面,工作在网络层,是 IP 协议的助手,ICMP 包头的类型字段,大致可以分为两大类:查询报文类型(用于诊断)和差错报文类型(通知出错原因)

  • ping发送和接收过程

    • ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包,最重要的是两个:第一个是类型,对于回送请求消息而言该字段为 8;另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间;由 ICMP 协议将这个数据包连同地址一起交给 IP 层,构建一个 IP 数据包
    • 接下来,需要加入 MAC 头;如果在本地 ARP 映射表中查找出 IP 地址的MAC地址则可以直接使用,否则发送 ARP 协议查询 MAC 地址,由数据链路层构建一个数据帧
    • 主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃;接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议
    • 主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0序号为接收到的请求数据包中的序号,然后再发送出去给主机 A
    • 在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

    ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)

ICMP常见报文类型

  • 查询报文:回送消息 —— 类型 08

    • 用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的

    • 可以向对端主机发送回送请求的消息(ICMP Echo Request Message,类型 8)也可以接收对端主机发回来的回送应答消息(ICMP Echo Reply Message,类型 0

    • 相比原生的 ICMP,这里多了两个字段:

      • 标识符:用以区分是哪个应用程序发 ICMP 包,比如用进程 PID 作为标识符;
      • 序号:序列号从 0 开始,每发送一次新的回送请求就会加 1, 可以用来确认网络包是否有丢失。

      选项数据中,ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短

  • 差错报文的类型:

    • 目标不可达消息 —— 类型 为 3:IP 路由器无法将 IP 数据包发送给目标地址,在这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。

      • 网络不可达代码为 0,路由器中的路由器表匹配不到接收方 IP 的网络号
      • 主机不可达代码为 1,路由表中没有该主机的信息,或者该主机没有连接到网络
      • 协议不可达代码为 2,对端主机的防火墙已经禁止 TCP 协议访问
      • 端口不可达代码为 3,端主机没有进程监听 8080 端口
      • 需要进行分片但设置了不分片位代码为 4, IP 首部的分片禁止标志位设置为1。根据这个标志位,途中的路由器遇到超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃
    • 原点抑制消息 —— 类型 4:路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息

    • 重定向消息 —— 类型 5,路由器发现发送端主机使用了「不是最优」的路径发送数据,会返回一个 ICMP 重定向消息给这个主机,在这个消息中包含了最合适的路由信息和源数据

    • 超时消息 —— 类型 11,IP 包中有一个字段叫做 TTLTime To Live,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。

网络ping不通是什么原因?

  • ping的原理是利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少

  • ping命令不通,主要有两种情况,一种是同网段内的ip地址ping不通,另一种是不同网段的ip地址ping不通

    • 同网段ping不通,结果是“无法访问目标主机” ,说明此时,ping的需求并没有成功发出,这时,要检查:

      1、对方是否开机?ip是否存在?

      2、有跨交换机vlan的话,检查对应的中间trunk链路是否导通?

      3、走直连路由是否正确?是否应该走默认路由,而走了直连路由。

      4、子网掩码是否错误。

      5、默认网关是否填写正确

    • 同网段ping不通,结果是“超时(time out)” ,这种情况是ping已经成功发出了,到达了主机,但时没有得到响应,要检查:

      1、检查下防火墙,防火墙禁止了对ping的回应。

      2、子网掩码的设置错误,导致不在同一个网段。

      3、设备硬件故障,导致设备没有对应的mac地址,无法生成路由表,而走默认路由。

      4、ip冲突,或ip地址与直联路由不在同一个网段。

      5、网关没有设置好

    • 跨网段ping不通,结果是“无法访问目标主机” ,说明请求没有成功发出,获取不了目的ip地址与mac地址。可能出现的原因是:

      1、目的ip地址不存在。

      2、检查路由表是否有缺省的路由

      3、检查arp表是否有网关的mac地址

      4、有网关设置错误

      5、走了默认路由

    • 跨网段ping不通,结果是“time out” ,表示ping的request消息已经发出,目的ip的网关已经获取到目的ip的mac地址,但是目的主机没有回复,或源主机无法收到。这些应该检查回程路由和节点回程路由。可能的原因有:

      1、检查下防火墙,是否拦截了ping的请求消息。

      2、检查经过节点的路由是否正确,或者是否有回程路由。

      3、回程路由的硬件网卡出口和ping的request的入口网卡不是同一个

      4、交换机vlan对应的接口全部down了,导致vlan状态down,vlan的对应路由没有生成。