熟悉网络层IP协议和数据链路层,让面试不再尴尬~

Posted 你这家伙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟悉网络层IP协议和数据链路层,让面试不再尴尬~相关的知识,希望对你有一定的参考价值。

1. 应用层IP 协议

1.1 IP协议头


4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.
8位服务类型(Type Of Service): 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位目标地址: 表示发送端和接收端.
选项字段(不定长, 最多40字节):

1.2 网段划分

网络划分是为了组建局域网

IP地址分为两个部分, 网络号和主机号

  • 网络号:保证相连连接的两个网段具有相同的表示
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
    (统一局域网内,各个主机的ip地址中的网络号需要相同,但是主机号不能相同;两个相邻的局域网(同一个路由器连接的两个局域网),要求网络号不能相同)

1.3 IP地址五种分类

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

此处可能有面试题哦
1.随便给你个ip让你计算属于哪一类ip?
2.让你计算某一类中有多少个ip?

1.3 特殊的ip地址

  1. 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

  2. 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;

  3. 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

1.4 子网掩码

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址,针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):

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

    IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;

1.5 IP 地址的数量限制

因为IPV4的IP地址只有32位,也就是42亿9千万个地址,而且我们每个设备都有唯一的一个地址,但是对于现在的网络来说,这远远不够,那要怎么解决呢?

解决方法:

  1. 通过动态分配IP的方式来一定程度解决(一个设备当联网的时候分配ip,不联网则不分配),但这还不足以解决
  2. 通过NAT机制 + 局域网划分的方式来解决(当前的主要形式)本质上使用一个外网ip代替一大堆的内网设备
  3. IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

1.6 私有IP地址和公网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(Network Address Translation,网络地址
    转换).
  • 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务
    器上. 这样的服务器可以在阿里云/腾讯云上进行购买.

1.7 路由

IP数据实际传输过程类似于“问路”,当IP数据到达某个路由器节点的时候,此时IP数据报就会查询当前路由的路由表,通过路由表来决定下一步该怎么走,两种情况:

  1. 如果路由表上能够查到目的IP,就直接就能走到了
  2. 如果查不到,继续传输下一个路由器,再来询问下一个路由器的情况

极端情况:如果反复查了很多路由器也找不到这个目的IP,此时这个数据包就会被丢弃(IP报头有一个TTL,TTL有一个初始值,每经过一个路由器,TTL就会减一,当为0的时候,此时数据包就要被丢弃了),认为该IP不可达

2. 数据链路层

数据链路层的职责:负责相邻两个节点之间的数据传输

2.1 认识以太网

以太网既设计数据链路层,也涉及物理层
  • “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
  • 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
  • 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;

2.1.1 以太网数据帧

2.1.2 认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点;

  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)

  • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)

2.2 认识MTU

MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;

  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;

  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分(fragmentation);

  • 不同的数据链路层标准的MTU是不同的;

2.2.1 MTU对IP协议的影响

由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
  1. 将较大的IP包分成多个小包, 并给每个小包打上标签;
  2. 每个小包IP协议头的 16位标识(id) 都是相同的;
  3. 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
  4. 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
  5. 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;

2.2.2 MTU对UDP协议的影响

拆包了之后提高了丢包的概率
  • 一旦UDP携带的数据超过了1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报
  • 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.

2.2.3 MTU对TCP协议的影响

拆包影响传输效率
  • TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(表示IP在不进行拆包的情况下,一个TCP数据包最大有多长)
  • TCP在建立连接的过程中, 通信双方会进行MSS协商.
  • 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
  • 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
  • MSS的值就是在TCP首部的40字节变长选项中(kind=2);

3. 应用层的DNS协议

DNS协议的功能就是完后域名和IP地址之间的转换(转换过程使用hash表来维护两者的映射关系)
因为我们的URL中有一个重要的部分,服务器的地址(可以是IP地址,也可以是域名),
世界上有很多的DNS服务器,包括各个运营网络也会在不同的地区架设一些DNS服务器

比如:当你打开一个百度的时候,浏览器就会先去DNS服务器上查询baidu域名对应的IP,然后再进行访问
注意:虽然他会先去最近的DNS服务器进行查询域名,但是他也不是所有的域名都认识,所以如果他查不到,那么此时这个DNS就会向他的上级DNS服务器,如果再摘不到就接着向上级发送,直到最后遇见根域名服务器(他是所有的域名都认识),虽然中间那些DNS服务器没有查询到结果,但是会缓存刚才的查询结果,当下一次解析同样域名的时候,就会直接返回了(包括浏览器也会缓存域名对应的IP)

  • DNS是应用层协议

  • DNS底层使用UDP进行解析

  • 浏览器会缓存DNS结果

4. 网络层的ICMP 协议

典型代表ping命令,ping命令用来检测网络当前质量和联通性的工具
它和传输层无关

问题:ssh对应的是22端口,telnet对应的是23端口,那么ping对应的是啥端口?

答:ping是基于ICMP实现的,他是网络层协议,而端口号是传输层的概念,所以ping中不涉及任何"端口"概念

ping www.baidu.com

就会出现如何信息

4.1 面试必问: 浏览器输入url会发生的事情

如:打开百度页面

站在后端开发程序员视角来看:

1.主机发送过程

  1. 先查域名所对应的IP,当你输入url,首先服务器会去域名解析(先查浏览器缓存,再查hosts文件,最后访问DNS服务器)
  2. 构造HTTP协议数据报(GET 请求,url就是http://www.baidu.com,heade啥都是浏览器自己填的)
  3. 然后构造一个TCP的数据包(在发送这个数据包之前,首先触发三次握手建立连接,然后再去发送这个TCP数据包)
  4. 构造一个IP数据包,目的IP就是百度服务器的IP,源IP就是本机IP,这个包就要进行传输了(查路由表找到从哪个路线开始往后传输)
  5. 数据链路层 构造一个以太网数据帧,把这个数据帧传给相邻的路由器

2.中间传输过程
经过很多的路由器/交换机,一跳一跳的进行寻路(涉及封装分用)

3.服务器接收过程

  1. 数据链路层解析数据,把数据交给网络层
  2. 网络层解析数据,交个TCP
  3. TCP解析数据,交给应用层
  4. 应用层(应用程序)解析HTTP数据,找到百度首页的html。读取文件内容,构造一个HTTP响应,在往回传输
  5. 往回传输的过程需要一层层的封装,自己的主机收到这个响应之后,在进行一层一层的分用

5. NAT技术

IPv4协议中, IP地址数量不充足的问题,NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;

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

NAT IP转换过程人能够

  1. NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
  2. NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;在NAT路由器内部, 有一张自动生成的, 用于地址转换的表;
  3. 当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;

那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的.
那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机? 这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

5.1 NAT技术的缺陷

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

以上是关于熟悉网络层IP协议和数据链路层,让面试不再尴尬~的主要内容,如果未能解决你的问题,请参考以下文章

2020PHP面试-网络篇

计算机网络面试

网络基础面试常考知识点

运维面试网络相关的面试题

运维面试网络相关的面试题

计算机网络之面试常考