【网络原理】从零开始深入理解TCP的各项特性和机制.(三)

上篇介绍了网络原理传输层TCP协议的知识,本篇博客给大家带来的是网络原理剩余的内容, 总体来说,这部分内容没有上两篇文章那么重要,本篇知识有一个印象即可.
🐎文章专栏: JavaEE初阶
🚀若有问题 评论区见
❤ 欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .

王子,公主请阅🚀

  • 要开心
  • [1. 网络层](#1. 网络层)
    • [1.1 IP协议](#1.1 IP协议)
    • [1.2 地址管理](#1.2 地址管理)
      • [1.2.1 地址管理](#1.2.1 地址管理)
    • [1.2.2 路由选择](#1.2.2 路由选择)
  • [2. 数据链路层](#2. 数据链路层)
  • 3.应用层协议DNS

要开心

要快乐

顺便进步

1. 网络层

1.1 IP协议

Ⅰ 基本概念

主机: 配有IP地址, 但是不进行路由控制的设备;
路由器: 即配有IP地址, 又能进行路由控制;
节点: 主机和路由器的统称;

Ⅱ 协议头格式

① 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 对于IPv6来说,就是6.
② 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这样的程序, 最大吞吐量比较重要. 总的来说,8位服务类型能够让IP协议切换形态.
④ 16位总长度(total length): IP数据报整体占多少个字节. IP协议与UDP协议一样,存在64KB的限制, 但是IP协议自身支持"拆包组包"功能.
⑤ 16位标识(id): 唯⼀的标识主机发送的报文. 如果一个大的IP数据报拆成了多个小的,拆出来的这多个小包的16位标识是相同的数值.
⑥ 3位标志字段: 第一位保留(暂时不用), 第二位置为1表示禁止拆包. 第三位表示"更多分片", 如果最后一个分片置为1, 其他是0. 类似于一个结束标记.
⑦ 13位分片偏移(framegament offset): 描述当前每个小的数据包(分片)的相对位置.
⑧ 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环. 其实就是描述了这个 IP 数据包,在网络上还能继续存活多久.
⑨ 16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
⑩ 32位源地址和32位目标地址(重要): 表示发送端和接收端. IP 地址,本质上就是一个 32位的整数.为了方便人来理解, 用 点分十进制 方式来表示.

1.2 地址管理

1.2.1 地址管理

Ⅰ 网络号和主机号

IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

同一局域网中的设备,网络号必须相同,主机号必须不同.

一个 IP 地址, 哪个部分是网络号, 哪个部分是主机号,不是一定的,要通过子网掩码来确定网络号的。 如下图: 一个255表示8个1. 被标记成1的就是网络号.

上图的 1总共是24个,但是有些情况不是24个, 这并不是固定的,需要根据实际的网络环境灵活配置.

Ⅱ 特殊的IP地址

① 将IP地址中的主机号全部设为0, 就成为了网络号, 代表这个局域网; 这种IP不能给具体的主机分配. 比如: 192.168.100.0
② 将IP地址中的主机号全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包; 这种IP也不能给具体的主机分配. 比如: 192.168.100.255
前面说UDP 天然能支持广播,就是和这个 IP 有关系,使用 UDP socket 给这个地址发送 UDP 数据报,局域网中所有的设备,都能收到这个数据报而TCP 无法和这个地址建立连接.
如果一个 IP 是 127 开头的, 此时这个 |P 就是"环回 ip"(loopback) 这些IP地址都表示设备自身,自己发给自己. 比如最常用的127.0.0.1;
操作系统提供了一个特殊的"虚拟网卡",关联到了这个 IP 上,这里的 环回 IP 主要的用途就是进行一些测试性的工作,环回 IP 能够排除 网络不通等干扰因素, 更好地排査代码中的问题.

Ⅲ IP地址的数量限制

IP 地址是一个 32 位的整数. 2^32 约等于 42亿9千万, 按理来说地址是不应该重复的,互联网发展到今天,能上网的设备是非常非常多的. 早就超过了 42亿9千万这个数字. 那么IP协议是如何解决IP地址不够用的问题的?

IP协议解决地址不够用问题的方法由下面两个方案结合而成.

① 动态分配IP
设备不上网就不用分配IP地址,设备上网就给设备分配IP.

② NAT机制(网络地址转换)
本质上就是让一个IP地址,代表一批设备.
把IP地址分成两大类:

  1. 内网IP(局域网IP), 如果一个IP地址是类似以下三种地址的话就表示内网IP.
    10.x 或者172.16.x-172.31.x 或者192.168.x
    在同一个局域网内部,内网IP 之间,不能重复在不同的局域网中, 内网 IP 之间, 可以重复。
  2. 外网IP(广域网IP), 除了内网IP剩下的就是外网IP了. 外网 IP 则始终都不允许重复,务必做到唯一.
    通常一个小区/一个学校/一个公司,都是构成一个大的局域网 (这一个局域网中可能就有几干甚至上万个设备).
    这样的一个局域网,使用一个外网 IP 即可表示, 一个外网 |P 就代表了几于个上万个设备.

NAT机制具体是怎么工作的?


路由器会将我的电脑的源IP替换成一个外网IP, 比如123.139.168.15. 之后传输给服务器,如下图所示:

内网IP无法在广域网上使用, 当我的设备的IP数据包传输给服务器时, 路由器会对设备的源IP进行替换, 替换成一个外网IP. 同样地, 当数据包从服务器传回我的设备时, 也会对源IP进行替换.
如下图所示:

当服务器返回数据之后,路由器如何决定这个数据要交给哪个设备?
是要结合端口号来进行区分,"端口号可以用来区分同一个主机的不同进程,也可以区分不同主机的不同进程".

NAT 机制最大的优势就是纯软件方案, 也正是因为这个机制,局域网内部的设备,能够主动访问外网的设备外网的设备无法主动访问局域网内部的设备. 之前写的 UDP echo server 必须部署到云服务器上才能被其他主机访问.

Ⅳ IPv6

IPv6 使用 16 个字节来表示 IP 地址, 总共有 2^128个地址,这个数字大到什么程度? 大到可以给地球上的每一粒砂子都分配一个不同的 ip 地址,甚至还绰绰有余.

IPv6并不是IPv4的简单升级版. 这是互不相的两个协议, 彼此并不兼容; 但是目前IPv6还没有普及,因为升级成IPv6需要成本,并且花了钱网速不见得有多少提升,世界上大部分人都不愿意花这冤枉钱. 然而截止到 2023 年 8 月 28 日, 我国 IPv6 活跃用户数达7.67亿(网民总数为10.79亿, 占比 71%), 世界领先.

我国为什么会大力推行IPv6呢?

IPv4 地址是由美国的一个"民间组织"负责分配, 所谓的民间组织,背后却是由美国军方赞助. 假设中美双方之间出现了极端情况, 美国人这边不给我们分配IP地址, 并且将之前给我们的地址收回,那势必会对我们国家的互联网行业造成重大损失, 为了预防美国人这一手, 国家大力推行IPv6是必然的.
目前来看,中国几乎所有的互联网公司都支持IPv6, 当然没有默认开启, 非必要应该不会默认开启.

Ⅴ 私有IP地址和公网IP地址

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

① 10.x,前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(Network Address
Translation,网络地址转换).

如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. .

1.2.2 路由选择

在复杂的网络结构中, 找出⼀条通往终点的路线;
路由的过程, 是一跳一跳(Hop by Hop) "问路" 的过程. 所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路一样.

① 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
② 路由器决定这个数据包能否直接发送给目标主机, 还是需要发送给下一个路由器;
③ 依次反复, 一直到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表; 此处路由表不展开说明.

2. 数据链路层

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

① 以太网帧格式

源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
帧末尾是CRC校验码.

② 认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 即6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
一台电脑的MAC地址在网卡出厂时就确定了, 不能修改. MAC地址通常是唯一的,所以MAC地址 可以作为 一台网络设备 的身份标识

IP地址描述的是路途总体的 起点 和 终点;
MAC地址描述的是路途上的每一个局部区间的起点和终点;

3.应用层协议DNS

DNS是一整套从域名映射到IP的系统.

① DNS背景

TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.
DNS是应用层协议.
DNS底层使用UDP进行解析.
浏览器会缓存DNS结果.

② 全世界有很多设备需要同时进行 DNS 的请求, 这一组 DN服务器,能抗住这么高的请求量? 一个服务器硬件资源是有限的,服务器处理每个请求,肯定都是要消耗一定的资源的,单位时间内,请求太多,消耗的总资源超过了机器本身的资源上限,机器就挂了.

  1. 开源, 搭建DNS系统的大佬们号召各个网络运营商都可以自己搭建一组"DNS 镜像服务器", 镜像服务器的数据,都从他们这边来同步, 此时用户就会优先访问离自己最近的镜像服务器.

  2. 节流, 让请求量变少. 让每个上网的设备,搞个本地缓存,假设我的电脑1分钟之内要访问10次百度,那么只让第一次访问请求DSN,把请求的结果保存到本地,后面9次请求都使用第一次的结果即可.

一般进行 DNS 解析,访问的都是就近的运营商的镜像DNS.

本篇博客到这里就结束啦, 感谢观看 ❤❤❤
🐎期待与你的下一次相遇😊😊😊

相关推荐
刘逸潇200539 分钟前
FastAPI(二)——请求与响应
网络·python·fastapi
软件技术员1 小时前
使用ACME自动签发SSL 证书
服务器·网络协议·ssl
我也要当昏君1 小时前
6.4 电子邮件 (答案见原书 P284)
网络协议
Mongnewer1 小时前
通过虚拟串口和网络UDP进行数据收发的Delphi7, Lazarus, VB6和VisualFreeBasic实践
网络
我也要当昏君2 小时前
6.5 万维网(答案见原书P294)
网络
嶔某2 小时前
网络:传输层协议UDP和TCP
网络·tcp/ip·udp
文火冰糖的硅基工坊2 小时前
[嵌入式系统-154]:各种工业现场总线比较
网络·自动驾驶·硬件架构
以己之2 小时前
详解TCP(详细版)
java·网络·tcp/ip
せいしゅん青春之我3 小时前
[JavaEE初阶]网络协议-状态码
java·网络协议·http
Ronin3053 小时前
【Linux网络】封装Socket
linux·网络·socket·网络通信