计算机网络 --- IP

1. IP

1.1 IP 首部的格式

在这里插入图片描述

  • 版本: 表示的是 IP 首部的版本号. IPv4 的版本号为 4
  • 首部长度: 当没有可选项时, IP 首部的长度为 20 字节.
  • 服务类型: 由8位组成,3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个
  • 总长度: 字段长 16 比特,因此 IP 包的最大长度位 65535 .
  • 标识: (ID) 用于分片重组. 同一个分片的标识值相同,不同分片的标识值不同.
  • 标志: (Flags) 长度为3位. 第一位保留(未使用)现在必须是0。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果位0就是最后一个分片,为1就是后面还有.
  • 片偏移: 用于标识被分片的每一个分段相对于原始数据的位置.第一个分片对应的值为0
  • 生存时间: (TTL) 这个字段表示一个 IP 数据报最多在网络上存活多久.每经过一个路由器,TTL会减少1,直到变成0则丢弃该包.
  • 协议: 指的是当前的数据被接收方收到之后,分用的时候,要把 载荷 内容交给传输层的哪个协议
  • 首部校验和: 类似于 CRC 这样的东西,此处只需要校验首部即可,载荷部分已经由其他协议校验过了.
  • 源地址: 32位比特构成,表示发送端 IP 地址
  • 目标地址: 32位比特构成,表示接收端 IP 地址

注: IPv6使用 16 个字节表示 IP 地址.

1.2 解决IP地址不够用的问题.

① 动态分配 IP

一个设备接入网络了,就分配.没接入网络就不分配.
(并不能彻底解决这个问题)

② NAT 机制. 网络地址替换

使用一个 IP 地址,来代表一批主机.

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

局域网 IP :

  1. 10.*
  2. 172.16.* ~ 172.31.*
  3. 192.168.*

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 发送数据时就会生成表中的映射关系;

NAPT

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

NAT技术的缺陷

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

1.3 网段划分

要求一个局域网里的主机,网络号要相同,主机号不相同.
两个相邻的局域网,网络号必须不相同.

  • 网络号: 标识网段, 保证相互连接的两个网段具有不同的标识
  • 主机号: 标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

在这里插入图片描述

1.4 子网掩码

子网掩码非常有特点.左半部分都是 1,右半部分都是 0.
然后把子网掩码和ip地址进行按位与运算,得到的结果就是网络号.

计算方式

将 IP 地址和子网掩码进行“按位与”操作(二进制相同位,与操作,两个都是1结果为1,否则为0),得到的结果就是网络号。
将子网掩码二进制按位取反,再与 IP 地址位与计算,得到的就是主机号。

十进制 二进制
IP地址 180.210.242.131 10110100.11010010.11110010.10000011
子网掩码 255.255.248.0 11111111.11111111.11111000.00000000
网络号 180.210.240.0 10110100.11010010.11110000.00000000
主机号 0.0.2.131 00000000.00000000.00000010.10000011

1.5 特殊的 IP 地址

  1. 如果是主机号为 全0, 这个 IP 就表示网络号,表示当前这个网段
  2. 如果是主机号为 1,这个 IP 通常表示当前网段的"网关".(路由器的出入口)
  3. 如果是主机号为 全1,这个 IP 表示"广播 IP"
  4. 127.* (127.0.0.1 环回 IP 表示本机)

2. 数据链路层

2.1 以太网帧格式

在这里插入图片描述

  • 这里的"目的地址"指的是 mac地址
  • 这里的"源地址"指的是 IP地址
  • 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
  • 帧末尾是CRC校验码

2.2 MAC 地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位,及6个字节。一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
  • 在网卡出厂时就确定了,不能修改。虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址

2.3 MTU

MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
  • 不同的数据链路层标准的MTU是不同的;

MTU 对 IP 协议的影响.

由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。

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

在这里插入图片描述
在这里插入图片描述

MTU 对 UDP 协议的影响.

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

MTU 对 TCP 协议的影响.

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

2.4 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请求来获得目的主机的硬件地址

3. DNS

什么是DNS

DNS,即Domain Name System,域名系统。DNS是一整套从域名映射到IP的系统。

域名是一个字符串,如 www.baidu.com , hr.nowcoder.com
域名系统为一个树形结构的系统,包含多个根节点。其中:

  1. 根节点即为根域名服务器,最早IPv4的根域名服务器全球只有13台,IPv6在此基础上扩充了
    数量。
  2. 子节点主要由各级DNS服务器,或DNS缓存构成。
    DNS域名服务器,即提供域名转换为IP地址的服务器。
    浏览器、主机系统、路由器中都保存有DNS缓存。
    Windows系统的DNS缓存在 C:\Windows\System32\drivers\etc\hosts 文件中,Mac/Linux系统的DNS缓存在 /etc/hosts 文件中。

当下 DNS 服务器顶不住全世界访问.

解决办法1

浏览器/客户端本身对域名解析结果会进行缓存.
这样就避免了大量的不必要的 DNS 请求

解决办法2

DNS 服务器也不是只有一台! 而是有多台~也叫做,根域名服务器.

解决办法3

为了更进一步的降低压力,各种网络运营商,也会构建自己的域名服务器镜像.

解决办法4

针对 DNS 服务器做镜像的时候还可以按照域名来进行进一步的划分.

4. 面试题

从浏览器中输入一个 URL 之后,都发生了哪些事情?

  1. 根据输入的域名,查询对应的 IP 地址
  • 查询浏览器自身缓存是否有对应的IP
  • 查询系统文件( hosts 文件)是否有对应的IP
  • 查询路由器缓存是否有对应的IP
  • 查询 DNS 服务器
  1. 构造一个 HTTP 请求
  • 首先进行 TCP 三次握手,建立连接
  • 传输层把这个 TCP数据 进行封装交给网络层,网络层把这个 TCP数据封装成 IP 数据报交给数据链路层,数据链路层再把这个数据封装成 以太网数据帧,(此时就涉及到了 IP地址映射到 MAC地址,依赖了 ARP 协议),交给物理层,物理层把这个数据转换成电信号,继续传输
  • 物理层又将数据交给数据链路层,数据链路层解析数据之后又交给网络层,路由器拿到了网络层中的 IP 数据报,取出其中的目的 IP, 查询路由表,找到下一个传输的目标,进而找到下一个要出书目标的MAC地址.再次进行封装.
  • 此时数据又达到了接收方,数据又要进行分用.物理层把光电信号转成以太网数据帧交给数据链路层.数据链路层解析出 IP 数据报交给网络层,IP 协议再进行解析,解析出 TCP 数据报,再根据 TCP 数据报中的端口号,找到对应的进程,把数据就放入到对应的socket 的接收缓冲区里
  1. 解析 HTTP 请求并响应
  • 应用程序调用对应的 socket api,从 TCP 接收缓冲区里读取数据,应用层把这个数据按照 HTTP 协议来解析,获取到其中的 URL.根据 URL 中指定的路径,知道了是要获取到 / 这个根路径
  • 服务器就会对 / 这个路径进行配置,映射到一个具体的html文件.服务器就会读取这个文件,把这个文件内容构造成一个 HTTP 响应数据,然后再调用 socket api进行发送
  • 又重复进行封装分用.最终发送到达用户主机.
  • 用户主机重复分用之后,把数据取出来交给应用程序.
  1. 根据得到的 HTTP 响应报文,解析这个报文,获取到其中 HTML 内容

  2. 根据 HTML 进行渲染.

猜你喜欢

转载自blog.csdn.net/wwzzzzzzzzzzzzz/article/details/124044329