【Linux网络编程十】网络原理之IP协议【网络层】

1.理解IP协议

IP协议的本质工作:提供一种能将数据跨网络从A主机送到B主机的能力。
而用户需要的是能够可靠的将数据跨网络送达。所以传输层TCP协议就是为了提供可靠性策略的。

IP地址=目标网络+目标主机 这样组成的目的是构建网搭的时候,为我们将来高速定位一台主机,提供基础保证!!

因为在路由转发时,都是先找到目标网络,再从目标网络中定位到目标主机。

2.IP报文

在这里插入图片描述

①四位版本:指定IP协议的版本, 对于IPv4来说, 就是4
②4位首部长度:表示真正的报头长度(默认报头20字节+选项)
③16位总长度:表示整个报文的长度
④16位表示:唯一标识主机发送的报文,当IP分片时,每一个分片的标识必须一样。
⑤3位标志:第一位默认不用,第二位表示是否同意分片,1表示禁用,0表示同意,第三位,表示若ip报文进行了分片,则0表示最报文的最后一个分片,1表示不是最后一个分片。
⑥13位片偏移:表示当前分片在原始报文中处于哪个位置,是分片相对于原始IP报文开始处的偏移。
⑦8位生存时间TTL:报文到达目的地的最大报文跳数。一般是64. 每次经过一个路由, TTL-1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
⑧八位协议:表示上层使用什么协议
⑨32位源ip地址:发送方的ip地址
⑩32位目的ip地址:接收方的ip地址

【问题1】如何将报头和有效载荷分开?

使用固定长度+自描述字段(4位首部长度与16位总长度)来分开
即先读取20字节得到报头,根据里面的4位首部长度,确定真正报头的长度,再根据16位总长度减去报头,剩下的就是有效载荷。

【问题2】ip地址与端口号

应用层的套接字是需要ip地址和端口号的,因为ip地址+端口号唯一确定一个进程。而端口号是作用于在传输层,填充Tcp报头的。而IP地址是作用于网络层,填充IP报头的。

【问题3】如何看待两台主机通信?

只需要注意的是,在我们整个通信的过程之中,只有通信主机和目标主机,客户端和服务
器双方的会使用自己的tcp,而中间的所有设备使用的时候,只会应 用到网络层。它只要把报文给我转发就行了。
在这里插入图片描述

2.1分片问题

实际上,在一台主机中,报文并没有通过网络层直接发送出去,而是继续交给了下一层协议(数据链路层)。
而数据链路层要求一次性不能发送过大的数据,数据大小的范围为[46,1500]字节,而最大的数据长度为1500字节,也称为MTU。这是网卡决定的,是定性的。

所以也就要求数据链路层的上层不能给我交付过大的报文。
但网络层也是一个跑腿的,它并不能决定发送多少,发送多少数据是由传输层决定的,如果传输层发送过大的数据给网络层,因为数据链路层不能接收过大的数据,这就要求网络层需要对报文进行分片,将报文分成几个小的报文。
在这里插入图片描述

【问题1】:怎么知道ip报文分片了?

1.ip报头里有个3位标志位,正常没有分片的报文,最后一位必为0,如果发生分片了,那么就会存在为1的报文。
2.ip报头里有个13位片偏移,正常没有分片的报文,为0,如果发生分片了,那么就不为0;

【问题2】:如何将分片组装起来?

每个分片都有自己的报头,每个报头里面的16为标识都是一样的,再根据13位片偏移来确定哪个分片是第一个,哪个分片是中间和最后的,就可以完成组装。

【问题3】:建议分片吗?为什么?

不建议网络层分片,因为一旦分片丢了,就会要求传输层重新发送报文,这样会增加报文重发概率。ip中任何一个分片丢失,都要重新发送。

【问题4】:如何避免分片?

网络层和数据链路层都是跑腿的,真正决定数据多少的是传输层也就是Tcp协议。所以倒逼Tcp进行流量控制不让它发很大的报文。

【问题5】:MTU与MSS

1.MTU是数据链路层最大能发送的数据段。因为有了MTU的存在,所以TCP的一个数据报不能无限大,要受限于MTU,TCP单个数据报的最大长度称为MSS(Max Segment Size); 大小为1460字节。
在这里插入图片描述
2.这也就是为什么TCP的滑动窗口中,可以发送/已发送未应答的区域里面还要再划分成一个个小区块,这一个个小区块就是MSS,不能将滑动窗口中数据全部发送出去, 而是受限于MTU,每次发送必须是MSS。在这里插入图片描述
3.TCP在三次握手期间双方就会进行MSS的协商,取双方较小值作为标准。

3.路由器

在这里插入图片描述

1.路由器本质也是特定子网下的一台主机,不过路由器至少要有两个IP,因为路由器至少要连接两个子网。
2.路由器的ip地址一般位该子网的第一台主机。
3.路由器的功能不仅能够专访ip报文,更重要的是它能够构建子网(局域网),并且可以对子网内的ip进行管理。
4.通常手动管理ip非常麻烦,而有种技术叫做DHCP,能够自动的给子网内新增的主机结点分片ip地址,就避免了手动管理IP的不便。而一般的路由器都带有DHCP服务,所以路由器也可以看作一个DHCP服务器。
5.路由器上有LAN口和WAN口,LAN口通常连接的是局域网,LAN口一般连接的是公网。在这里插入图片描述
6.子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级
替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地
址转换).
7.如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服
务器上. 这样的服务器可以在阿里云/腾讯云上进行购买

3.1路由问题

ip报文是如何从源主机发送到目的主机的呢?
是通过路由器不断的转发ip报文,这个转发的过程也称为路由。

1.当ip报文到到达路由器时,路由器会查看目的ip;将目的ip与子网掩码相与,得到目的网络。路由器就会判断该目的网络是否是它的子网,如果是,就发送给目标路由器,如果不是就发送给缺省路由器。依次反复, 一直到达目标IP地址;在这里插入图片描述

2.所以路由器查询的结果无非就2种:
①路由器知道在哪,发送给具体的下一跳或者主机
②路由器不清楚,发送给默认路由器(同网段的类一个路由器)
3.那么路由器是如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;
4.注意每台主机操作系统里面自己也有一个路由表,报文最初会和主机内部的路由表进行比对,目的i地址与子网掩码按位与后发现不是所在的子网,就会转发到默认路由器中。

首先理解我们对应的主机呢,是可以通过查路由表
然后判定ip报文要去的目标网络不在同一子网下直接就可以把它干到我们的家用路由器当中,家用路由器接入运营商的网络,不管你后面怎么转发它都是这样的原则。

如果找到了知道下一跳去哪里,那么就把报文直接转给下一跳路由器去,如果不清楚,把报文转给默认路由器
不断的路由,所以报文呢,就会越来越靠近目标网络。

所以路由过程的本质就是不断的查询路由表的过程。而这个过程也只是能找到目标网络在哪里,并不能具体到目标主机在哪里,要想找到目标主机,还需要MAC地址来确定。
也就是IP层是用来决策的,用来找路的,而具体的找人还需要数据链路层来执行。

4.网络划分

以前网络划分是采用固定的分类方法,即将ip地址分为5类
A类,B类,C类,D类等。在这里插入图片描述

不过这种方法会造成大量IP地址被浪费掉。

例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.

后来为了合理的使用IP地址,使用了子网掩码的方式来进行划分网络,称为CIDR(Classless Interdomain Routing):

1.引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
2.子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
3.将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
4.网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
5.要注意子网掩码是保存在路由器中的,因为路由器连接哪个子网它心里是清楚的,所以它也就是知道该子网的子网掩码。

我们实际使用的方法是:分类+子网划分的方法

比如我要申请一个B类IP地址,并且我有10台主机需要分配。我们只需要留给主机号四位即可,剩下的全为网络号。

在这里插入图片描述
也就是我先得到B类网络可是B类,网络主机号太多,我用不完,然后怎么办呢?我把我的16个主机号,拿出来12位,就放在我们的ip地址的子网掩码里,每个子网都可以用14台主机,最终,在内部这个主机号当中的12位那么一共排列组合就能排列成2到12次方个所以也就意味着我除了构建处一个网络之外,我还能构建更很多很多同样的网络。未来12位我不用就暂时保留起来,这就是网络划分。

子网掩码的划分方案呢,它其实是可以更精细的把上面
所讲的a到e类或者abcd这几类网络呢来进行更合理的使用.
虽然没有解决ip地址不足的上限,但是,它确实解决了浪费问题在这里插入图片描述

5.私有ip与公有ip

一般我们接触到使用的网络都是使用的私有ip,私有ip只能用于局域网,不能用与互联网。
私有IP+公有IP=互联网。
在这里插入图片描述

6.理解运营商与全球网络

运营商在网络上扮演什么角色呢?

【结论】
1.全球所有人想上网那么都必须得是先由运营商的工作人员先上门给我们把网线拉进来(城里面这些住宅楼呢,它本身就在盖的时候就已经把光纤就入户了)
也就是任何一个人访问网络之前,都得先访问运营商的网络,任何才能到公网中。

2.运营商给我们提供网络的基础设施建设(各种基站)
在这里插入图片描述

怎么理解全球网络?

IP地址在被划分的时候它会根据国家,根据省市就直接把我们的公网IP给我们划分好了,然后构建出来了一个一个的网段。

那么假设IP地址的分配上是以国家为单位的话,就可以构建根据前4位不同,来区分不同国家的网络来进行通信了。

在前4位基础上再划分4位来区分不同的省份,在前8位基础上再划分4位来区分不同的市。

其实呢,就相当可以把我们对应的A类B类地址32位的。在国家或者在省级别,我们直接给它划分好,那么国家和国家之间有国际级别的路由器好,也可以有省之间的路由器
紧接着到了比如某一个地区了可是这个地区现在ip地址是不可能再划分了光ip就有限,所以我们采用这种子网划分的方案。在这里插入图片描述
我们的报文必须得在家里从我的电脑上先交到家用路由器,然后再转发给运营商路由器再由运营商路由器把报文转发到公网。

7.NAT技术

NAT技术就是能够将私网ip转换未公网ip来访问外网的技术
在这里插入图片描述
每经过一次路由器的转发,就会将源ip地址替换未WAN口的ip。最终就能转换为公网访问公网。

当服务器要将响应发送回去时,它就会发送给运营商路由器(公网接口)
,运营商的私网接口就会转发给家用路由器,然后发送给主机A。
NAT路由器内部是有一个自动生成的,用于地址转换的表,就比如上面的过程弄成一张表,那么回来就能安装该表反向将数据发送回去。

7.1NAPT

但是存在一个问题,如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
在这里插入图片描述

NAT路由器不仅能够替换ip地址,还可以替换端口号。
可以将不同的主机发送给NAT路由器时,不仅替换它的源ip地址,并且将端口号也改变成不同,这样就可以区分不同主机发送了。

【NAT的缺陷】

由于NAT依赖这个转换表,所以有诸多限制:
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tew_gogogo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值