目录
1.TCP和IP的关系
2.IP协议报文
2.1. 4位首部长度,16位总长度,8位协议
2.2. 8位生存时间 ,32位源IP地址和32位目的IP地址
3.IP地址的划分
3.1.IP地址的表现形式
3.2.旧版IP地址的划分
3.2.1.旧版IP地址的划分思路
3.2.2.分类划分法
3.3新版IP地址的划分
3.3.1.CIDR(引入子网掩码)
3.3.2. 特殊的IP地址
4、私有IP和公网IP
4.1.IP地址不足
4.2.私有IP
4.3.公网IP
4.4.私有IP和公网IP的区别
5.理解运营商在上网中的作用
6,路由器
6.1.路由器在局域网的作用
6.2.路由器的结构
6.3.NAT技术
6.3.1.NAT IP转换过程
6.3.2.NAT技术的使用
6.4.众多补充知识点
6.5.路由器工作原理
6.6.路由
6.6.1.见一见路由
6.6.2.什么是路由
6.6.3.路由表的组成
6.6.4.路由的过程
6.6.5.route命令
7.IP协议的分片
7.1.为什么要分片
7.2.见见分片
7.3.怎么实现分片
7.4.分片机制示例
7.5.分片的缺点
1.TCP和IP的关系
我们之前已经学习了TCP,当时我们在进行讲解时,是站在上帝视角直接说A主机将数据段发送到B主机,可是A主机真的是直接将数据段发送到对方吗?
其实并不是,传输层的数据段是要向下交付到网络层的,那TCP究竟在数据网络传输的过程中扮演了什么样的角色呢?网络层的核心工作又是什么呢?我该怎样理解这两层协议栈呢?
网络层能够提供将一个数据包从A主机跨网络发送到B主机的能力,但有能力一定能够做到吗?
在我们生活的世界中,没有任何一件事情是100%能够发生的,因为任何事情都是有概率的,比如你们班的数学学霸张三,他具有每次数学考150的能力,但这能代表他每次考试一定能考150吗?
这是不一定的!我们只能说它具有非常大的概率能够做到将数学考试的成绩达到150,但如果张三的父亲是学校的校长,他父亲要求张三必须每次考试都考到150,如果这次考试没到150,那他父亲就将这次考试作废,直到张三考到150为止,这叫他父亲提供给张三的策略。
同理,我们说网络层能够提供将一个数据包从A主机跨网络发送到B主机的能力,但这并不代表网络层一定能够做到!有没有可能网络出现拥塞,而数据包大面积丢失的情况呢?或者对方接受能力太小,网络层发送数据包的速度太快,导致对方来不及接收从而丢弃掉许多报文呢?或者对方迟迟没有返回报文,发送方又该怎么做呢?所以网络层不仅仅面临着只将数据包跨网络发送的要求,还有一些其他在网络传输过程中可能面临的问题,而这些问题由谁来解决呢?其实就是传输控制协议TCP来解决
所以我们说TCP提供了数据包跨网络发送的策略,比如超时重传,确认应答,流量控制,拥塞控制,滑动窗口,捎带应答,延时应答等等,这些都是数据包在网络发送时,如果出现了不可靠的问题,数据包应该怎么处理?这些都是由TCP来控制。
而IP层提供了数据包跨网络发送的能力,比如IP层会通过报头中的目的IP来查路由表,确定数据包的下一跳位置,IP层只负责将数据包交付到下一跳,至于传输过程中出现了什么问题,这是TCP层提供策略来进行解决的,IP层不关心,也不会做什么。
所以我们称,TCP提供数据跨网络传输的策略,而IP提供数据跨网络传输的能力,两者合在一起就一定能够保证数据包可靠的跨网络从主机A发送到主机B,这也就是为什么很多人叫TCP/IP协议的原因,因为这两个协议可以可靠的保证数据包跨网络送到目标主机,而这正就是网络通信的本质。
2.IP协议报文
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4
- 4位头部长度(header length):IP头部的长度,基本单位是4字节,也就是length * 4的字节数。比如length = 4,那么报头长度(包括选项)就是4*4=16。4bit表示的最大数字是15,因此IP报头的最大长度是60字节。因为20字节是固定长度,所以选项部分最大为40字节
- 8位服务类型(Type of service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须为0,后续发展补充)。4位TOS分别为最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小时延比较重要;对于ftp这样的程序,最大吞吐量比较重要
- 16位总长度(total length):IP数据报整体占多少字节
- 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里的标识都是相同的
- 3位标志字段:第一位保留(现阶段不用,后续发展补充);第二位为0表示禁止分片,此时如果报文长度超过MTU长度,该报文就会被直接丢弃;第三位表示“更多分片”,如果分片,最后一个分片的“更多分片”标志位为0,其他都是1
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处于哪个位置,分片偏移的单位是8字节,即如果分片偏移是100,那么实际偏移字节数就是100 * 8 = 800。因此,除了最后一个报文,其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间(Time of live——TTL):数据报到达目的地的最大报文跳数,一般是64。每经过一个路由,TTL - = 1,一直减到0还没到达,那么就丢弃这个报文。该字段主要用来防止出现路由循环
- 8位协议:表示上层传输层协议类型
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
- 32位源地址:发送端,源主机IP地址
- 32位目的地址:接收端,目的主机IP地址
- 选项字段:不定长,最多40字节
2.1. 4位首部长度,16位总长度,8位协议
- 1.报头和有效载荷如何分离?
我们的报头是固定长度——20字节,拿IP报头前20字节,但是这是不够的,因为我们IP报头里面可能含有选项字段,这选项字段的大小可是不包含在这个20字节里面的!
注意到IP协议的那个4位首部长度了吗?
4位首部长度和TCP一样,都代表报头的真实长度大小,单位是4字节,4bit位最大是15,所以IP报头的大小范围是20~60字节,IP与TCP一样,都有自己的头部选项,封装报文时,选项可以带可以不带,具体看需求而定。
同时IP还有16位总长度字段(包含IP协议报头和有效载荷),所以只需要读取4位首部长度×4个字节的值,就可以拿到IP报头,然后再用16位总长度-IP报头的长度就可以拿到有效载荷,通过这两个字段值,就可以将报头和有效载荷作分离了。
- 2.如何将有效载荷交给上层?
8位协议表示网络层的上层的协议类型,ICMP协议是0000 0001,TCP是0000 0110,UDP是0001 0001,通过8位协议就可以将有效载荷向上分用,交付给上层协议了。
常见的8位协议字段有这些
- 1:ICMP(Internet Control Message Protocol,互联网控制报文协议)
- 6:TCP (Transmission Control Protocol,传输控制协议)
- 17:UDP (User Datagram Protocol,用户数据报协议)
- 41:IPv6 (Internet Protocol version 6,互联网协议版本 6)
- 89:OSPF (Open Shortest Path First,开放最短路径优先)
- 132:SCTP (Stream Control Transmission Protocol,流控制传输协议)
- 253:使用实验/测试用途的协议
- 254:保留字段
- 255:保留字段
2.2. 8位生存时间 ,32位源IP地址和32位目的IP地址
- 8位生存时间
8位生存时间TTL(Time To Live),指的是数据报在到达目的主机之前,允许经过的路由器跳数。
在复杂的网络拓扑结构中,没有人能够保证数据报一定能安全无误的到达目的主机,数据报有可能在路由的过程中不停的被环形转发(路由循环),那这样的报文其实就没有意义了,因为他永远无法到达目的主机,还有可能出现路径选择上的问题,比如数据报原本可以选择一条最优的路径进行到达目的主机,但可能由于某种网络环境原因,导致数据报绕了很长的路才会到达目的主机,浪费了很长的时间,那这样的报文其实也没有意义了,因为浪费了太长的时间,极大的降低了网络数据传输的效率,正确的做法就应该当网络环境良好时,重发数据报,让IP层选择一条最优的路径重新进行数据报的路由转发。
所以针对上面可能出现的问题,路由器应该具有直接丢弃报文的能力,而这种能力其实就体现在8位生存时间上,一旦IP报文在路由转发的过程中,经过的路由器跳数超出8位生存时间,那么路由器便可以直接放弃该报文的继续路由,直接丢弃掉它。
TTL的值一般被发送端设置为64,IP报文在转发的过程中,每经过一个路由器,该值就会减1,直到减为0的时候,路由器就会自动丢弃IP报文。在当今的网络环境中,一个报文在转发的过程中,最多也就经过8~9个路由器,不太可能10几个路由器,一旦经过64个路由器,那就不用想了,一定是IP报文在转发的过程中出现了问题!所以TTL可以有效防止路由循环,以及网络中堆积大量无效报文的问题的产生。
- 16位首部校验和
P协议中的16位首部校验和(Header Checksum)扮演着确保数据完整性的重要角色。
- 校验数据是否正确的机制,只需要校验首部即可.
- 载荷部分,要么是TCP,要么是UDP,都已经自己校验过了.此时IP只要校验好自己的报头就好.
- 32位源IP地址和32位目的IP地址
还记得我们socket编程的时候我们老是使用IP+端口号吗?
其中端口号是传输层使用的,那IP就是网络层使用的
- 我们为什么要把点分十进制的IP地址转换成4字节大小?
因为IP协议的32位源/目的IP地址都是4字节大小
之前我们当时写TCPsocket通信代码的时侯,服务器代码中bind的端口号,其实是交给了服务器主机的传输层,用于服务器对发送过来的消息,向上分用交给特定的进程。而客户端所指明的目的IP地址其实是交给了客户端主机的网络层,用于客户端主机将IP报文进行路由转发,跨网络发送到目的主机。
src_ip:port -> des_ip:port
所有的路由器等中间设备都是没有传输层,应用层的,就像下面这样子
至于16位标识,3位标志,13位片偏移,我们放到下面去。
3.IP地址的划分
3.1.IP地址的表现形式
事实上在计算机内部IP地址是32位比特位的数字,为了方便表示,就会采用点分十进制的形式
上面这个是万变不离其中的。但是由此先后诞生了两种划分方式
原始的划分方式
左边的某些连续位表示网络号,右边的某些连续位表示主机号,那么我们平常在讨论这一系列问题的时候,会有一个“网络地址”的概念,一般来说网络地址并不等于IP地址,网络地址就是IP地址中的网络号,将主机号置0,就可以得到网络地址。
IP地址 ::= {<网络号>, <主机号>},
目前使用的最新方式:CIDR
CIDR中已经废弃了IP地址的分类,无分类编址的命名也是由此得来的,所以目前基本已经不再采用所谓的A类、B类、C类的IP地址分类表示法,引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
IP地址 ::= {<网络号>, <子网号>, <主机号>}
接下来来好好了解一下。
3.2.旧版IP地址的划分
3.2.1.旧版IP地址的划分思路
我们处于一个精心设计的世界里面,我们一出生就有身份证号,上线了就有学号。但是我们仔细看看这个学生证号码,它们仅仅只是一个数字吗?它里面是不是包含了我们的班级学号啊。比如23044217就代表23044217班17号,而这个230442里面的23是23届,04是4号学院,4是4专业,2是2班。 一个学号就能找到你的基本消息。这个学号和我们的IP地址也是一样的。IP地址里面包含了主机大量信息。
学校里面,会划分很多的学院,每个学院内又会细分很多专业,每个专业里面都有不同年级的学生,每个学生都有自己的学号,学校管理所有学生的前提是,先能够找到或者定位出任意一个学生,为了方便管理,学校会增设很多的职位。比如 每个学院都有一个院学生会主席,每院学生会主席会建一个群,把各专业的主席拉进群,每个专业的主席又会建一个群,把自己专业里的人拉进去。这样子就很好管理了。
比如理学院的张三同学找到了一张学生卡,因为我们知道学生卡上的学号都是经过设计的,前多少位代表院号,后多少位代表学生的专业号,后多少位代表专业里面学生的编号,入学年份等等信息,所以张三一看就知道这个学生卡不是他们学院的,
张三此时在他专业群里告诉专业主席,专业主席看到后在他们学院的专业主席群里发信息给,他们院的学生会主席看到后在校学生主席群里发一条失物招领,所以这张学生卡就被电子信息工程的学生会主席看到了,他一说这不就是我们院的学生卡吗?
他就把这个学生卡拿到他们院,然后再向下问各个专业的主席,这张卡是哪个专业的,专业的主席认领之后,在本专业的群里面吼一声,谁的学生卡丢了?赶快过来认领来,最后李四就拿到了他的学生卡。
我们简单理解一下就是
- 源主机:张三
- 子网:张三所在的专业群
- 子网:张三所在的学院的专业主席群
- 公网:校学生会主席群
- 子网:李四所在的学院的专业主席群
- 子网:李四所在的专业群
- 目标主机:李四
在上面的故事中,有一个非常重要的细节,就是查找学生卡所属的学生时,所做到的排除,当学生卡交给理学院的学生会主席时,我们立马可以排除掉除电子信息工程之外的其他所有学院,同时当学生卡交到电子信息工程的各个专业主席的群里时,立马就可以排除掉李四专业以外的其他专业,最后在李四专业的群里面,通过一个个学生的确认,最后让李四拿到自己的学生卡。
其实能够做到一下子排除一大批非目标的其他元素,主要就是因为分治思想,在宏观层面上做了很多的划分,互联网里面做了网段划分,国家里面做了很多省的划分,省内又做了很多城市的划分,城市里面做了各种区或县的划分,各个现或区又会做街道的划分,为什么要划分呢?其实就是为了方便国家能够快速定位一个人,从而对国家的人民进行管理。
其实这对于互联网也是如此。
我们都先要标识每台主机,网络通信是通过源IP,目的IP来标识源主机和目的主机
怎么理解地址?
- 我们举一个例子,我们说去北京玩,我们是怎么做的,肯定是先坐飞机/高铁去北京的机场/高铁站,在那里再乘坐地铁/公交去北京的几个景点玩!也就是说我们真正的目的地应该是北京-北京的某个景点
- 我们再举一个例子,唐僧说要去西天的大雷音寺找佛祖取经。唐僧的目的地是西天-》大雷音寺-》佛祖。
事实上,我们看到的像“192.33.432.82”这种IP地址,IP地址是由两部分组成的:目标网络+目标主机
任何主机都是在一个子网里面的,子网里面有多台主机。
我们要跨网络发送给这个主机,我们就要先将消息发到该主机处于的子网,子网再将这个消息转发给主机。
- 对于互联网也是相同的,为什么要进行网段划分呢?
其实就是为了方便互联网能够快速定位一台主机,因为每次确认主机时,排查的效率高,一次能够排除多个子网,这也是为什么IP要分为目标网络和目标主机的原因。
3.2.2.分类划分法
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。
同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。
IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
这些类别是根据IP地址的第一个字节(8位)来划分的,其中不同类别具有不同的网络号和主机号分配方式。下面详细解释每个类别:
A 类地址:
- 范围:1.0.0.0 到 126.0.0.0
- 网络号:第一个字节(8位)用于网络标识,剩下的 24 位用于主机。
- 最大主机数:约 16,777,214(2^24 - 2,减去两个保留地址:全0和全1)。
- 适用场景:A 类地址通常分配给大型组织或互联网服务提供商,因为它们允许大量主机。
B 类地址:
- 范围:128.0.0.0 到 191.255.0.0
- 网络号:前两个字节(16位)用于网络标识,剩下的 16 位用于主机。
- 最大主机数:约 65,534(2^16 - 2)。
- 适用场景:B 类地址通常分配给中等规模的组织或网络。
C 类地址:
- 范围:192.0.0.0 到 223.255.255.0
- 网络号:前三个字节(24位)用于网络标识,剩下的 8 位用于主机。
- 最大主机数:约 254(2^8 - 2)。
- 适用场景:C 类地址通常分配给小型组织或私人网络。
D 类地址:
- 范围:224.0.0.0 到 239.255.255.255
- 特点:D 类地址用于多播(Multicast),不分配给单独的主机或网络。
- 适用场景:用于一次向多个目标发送数据包,例如视频流或音频流。
E 类地址:
- 范围:240.0.0.0 到 255.255.255.255
- 特点:E 类地址是实验性地址,不常用,保留用于特定用途。
- 适用场景:用于实验、研究或未来网络发展。
上面这样的分类划分方案的粒度是非常粗的,就比如A类地址,很少会有一个局域网中存放167 77216台主机,这就是100多w台主机,所以申领A类地址的网段会很少,这类地址就被大量的浪费掉了,你说本来ipv4地址大概就43亿,全世界的人本来就不够分了,你还搁着浪费开了,这种子网划分的方案能好吗?
其实申领最多的地址就是B类地址了,他划分出来的网段,每个网段内能存放65536台主机,所以就会大量的造成B类地址不足,A类地址浪费的问题,所以这种网段划分的方案不够灵活,很容易造成ipv4地址浪费的问题。
所以又有人提出了新的网段划分方案,CIDR。
3.3新版IP地址的划分
3.3.1.CIDR(引入子网掩码)
CIDR 引入了一个灵活的方法,它允许将IP地址按需分配给网络,而不受固定类别的限制。CIDR 地址由两部分组成:网络前缀和子网掩码。
- 网络前缀标识了网络的唯一标识符。
- 子网掩码指示了网络地址中哪部分是网络前缀,哪部分是主机地址。
CIDR中的关键概念包括:
- 前缀表示法:CIDR使用前缀表示法来表示IP地址范围。这个前缀表示法包括IP地址,后面跟着一个斜线和一个数字,表示子网掩码的长度。例如,192.168.1.0/24表示一个具有24位子网掩码的子网,它包括192.168.1.0到192.168.1.255的所有IP地址。
- 聚合:CIDR允许多个连续的IP地址范围被聚合成一个更大的范围。这有助于减小路由表的大小,提高路由效率。
- 无类别路由:CIDR不再依赖于A、B、C类地址的划分,而是根据需要分配地址范围,这样可以更好地满足不同组织的需求。
- 节省地址空间:CIDR允许更灵活地分配IP地址,减少了地址空间的浪费,因为每个组织只分配所需的地址范围。
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号,子网掩码也是一个32位的正整数。
通常用一串 "0" 来结尾。
将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。
下面我们看两个例子:
实际上在不同的路由器上都是配有不同的子网掩码的。这里的不同是指的子网掩码的个数。通过目的IP地址,与子网掩码按位与( & ),就能够得到想要去的目的网络。
3.3.2. 特殊的IP地址
并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就具有特殊用途
- 将IP地址中的主机号全部设为0,就称为网络号,代表这个局域网。比如192.168.0.0
- 将IP地址中的主机号全设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。比如192.168.255.255
- 127.*的IP地址用于本地环回(loop back)测试,通常是127.0.0.1
主机号全0和全1一般不被主机使用,所以一个子网(局域网)的主机数最多为,n为主机号位数。例如192.168.2.0。该子网的主机号为最后一位,有8bits,即主机数最多为
4、私有IP和公网IP
4.1.IP地址不足
我们知道ipv4地址是4字节32位的整数,也就是说,ipv4地址的绝对上限也就是42亿9千万,如果真要是给全世界的入网设备各分配一个ip地址的话,那绝对是不够的!
并且,ip地址也不是按照入网主机来分的,而是按照入网主机上面的网卡来分的,每个网卡都至少要有一个ip地址,一般情况下一张网卡都只配有一个ip地址,但如果你想给网卡配置多个ip地址这也是可以的,比如你想让这块网卡与多个子网(网段)进行通信。
市面现在主流的笔记本计算机,都会配有两张网卡集成在主板上,一张是有线网卡,一张是无线网卡,所以如果真要是给每个入网设备都分配一个全球唯一的ip地址,那绝对是远远不够的!
有人可能会说,我们不是有CIDR技术吗?CIDR技术解决的是网段划分,他只是能够提高ip地址的使用率,不要出现某些ip地址被浪费的情况,但他并不能提高ip地址数量的绝对上限,所以他还是无法解决ip地址不够的问题。
常见解决和缓解ip地址不够的方式大概有3种
- (1)DHCP,动态分配ip地址,只给入网的设备分配ip地址,电脑没有连接到网络时,一定是没有ip地址的,这在一定程度上也可以缓解ip地址不足的问题,但作用确实也是聊胜于无
- (2)目前的互联网环境中,真正解决ip地址不够的主流方式还是通过NAT技术和私有ip的划分,NAT技术能够将私有ip地址转换为公网ip地址,然后进行访问公网上的服务,私有ip地址是可以大量重复的,在转换后,一定会出现的情况就是多个局域网主机共用一个公网ip来访问公网上的服务,NAT技术很重要,我们后面会详细去讲,这里先简单概述一下。
- (3)最直接的方法就是使用ipv6协议,提升ip地址数量的绝对上限,但现在由于种种原因,我国的ipv6技术还没办法推广到全球,但国内现在已经有很多的公司内部开始使用ipv6协议了,在访问公网的时候,再将ipv6地址转换为ipv4地址,或许在未来的某一天我们能看到ipv6被推广到全球使用,但现在我们还是先好好学ipv4吧
4.2.私有IP
ip地址相当于一块大蛋糕,私有ip划走了一部分,公网ip划走了一部分,还有一部分ip不给用户用,只能给网络的中间节点使用,例如路由器,基站等。
私有IP地址是在互联网上不被路由的IP地址,专门为组织内部网络(如企业内部、学校等)设计。这意味着这些地址只能在局域网(LAN)内部使用,不能直接用于互联网通信。然而,通过网络地址转换(NAT),它们可以用于互联网通信。
局域网是不直接连接到公网上的,所以理论上局域网使用任意的ip地址都可以,但RFC1918规定了组建局域网时只能使用的ip地址,我们将这些ip地址称为私有ip,之前我们说ip地址具有唯一性,指的是公网ip具有唯一性,内网ip是可以重复的,这正好能解决ip地址不足的问题,因为大量的局域网主机都使用的是重复的内网ip地址。
内网ip地址可划分为三类:
- (1)10.* ,也是10.0.0.0 - 10.255.255.255 (10.0.0.0/8),
/8
表示网络部分占据了前8位,剩下的24位用于主机部分。前8位为固定网络号用法,共1677,7216个地址,后面的24个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网的ip该类地址比较常见) - (2)172.16. *到172.31. *,也是172.16.0.0 - 172.31.255.255 (172.16.0.0/12)。
/12
表示网络部分占据了前12位,剩下的20位用于主机部分。同样的,前12位为固定网络号用法,共104,8576个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网和学校中,该类ip地址比较常见) - (3)192.168. *,也是192.168.0.0 - 192.168.255.255 (192.168.0.0/16)。
/16
表示网络部分占据了前16位,剩下的16位用于主机部分。同样的,前16位为固定网络号用法,共65536个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(家庭中的ip地址一般这类比较常见)
任何在此范围内的IP地址都可以被任何组织或个人在其内部网络中自由使用,而无需向全球互联网注册机构申请。每个私有IP地址可以在任何数量的网络中重复使用,因为这些网络从不直接相互通信(指的是网络与网络之间不直接相互通信,但通过网络地址转换(NAT),可以用于互联网通信)。
第二类网络地址的个数是第三类的16倍,因为第二类ip地址固定网络号开头的种类有12个。
算一下私有ip大概有2亿,公网ip有41亿个
私有IP地址主要用于本地网络,包括家庭、学校和办公室的局域网。大多数Wi-Fi路由器都被配置为从一个私有IP地址范围(通常是192.168.0.0/16)分配地址。
当从私有IP地址进行的设备需要访问互联网时,会使用一种名为网络地址转换(NAT)的技术。NAT允许路由器将许多私有IP地址映射到一个或多个公共IP地址。这是实现单个互联网连接服务于整个家庭或办公室网络的方式。
- 将局域网中的ip地址设为私有IP地址范围之外的地址,会有什么后果?
局域网IP的范围是被IETF(互联网工程任务组)在RFC 1918中定义的专门用于私有网络的IP地址。这些范围之外的IP地址均属于公共IP地址,它们是由全球互联网注册机构分配的,主要用于互联网通信。
理论上来说,可以使用任何IP地址作为你的局域网IP地址,包括公共IP地址范围。然而,在实际操作中,这样做会有一些问题:
- 如果在局域网内使用了一个已经在互联网上被分配的公共IP地址,那么局域网设备将无法访问该公共IP地址对应的互联网服务。
- 如果局域网需要通过网络地址转换(NAT)与互联网通信,使用公共IP地址范围可能会导致NAT功能出现问题。
- 使用公共IP地址范围可能会违反互联网服务提供商(ISP)的使用条款,甚至可能触犯相关法律。
因此,建议仅在私有IP地址范围内选择IP地址用于你的局域网。
我们来看看我们的云服务器上的
ifconfig
这个就是我们服务器的私有IP,这个可是阿里云的内网IP
在windows段也是一样的
其实在我们的成长生涯里面,基本都是使用私有IP的,直到我们使用了云服务器的时候,我们才用了公网IP
4.3.公网IP
公网IP(Public IP):
- 公网IP地址是可以在全球互联网上访问的IP地址,它们是唯一的,用于标识设备或服务器在互联网上的位置。
- 当您通过互联网与外部资源通信时,通常使用公网IP地址。
- 公网IP地址通常由互联网服务提供商(ISP)分配给您的路由器或服务器。
- 每个互联网连接都需要至少一个公网IP地址,以便在全球互联网上进行通信。
4.4.私有IP和公网IP的区别
2 个例子给你说明白
1. 怎么使用校园网
如果使用校园网,首先需要先通过校园网的路由器把我们的内网 IP 转为校园网的外网 IP。然后通过这个外网 IP 先连接上湖南电信的网关,最后在连接上百度的网关。百度把你请求的信息回传到你的校园网网关,校园网网关再把信息传给你(整个网络呈网状结构。它会自动找到一条通往百度的路径——基于深度优先搜索或者广度优先搜索)。
这个过程就跟淘宝购物差不多,转换一下。假设在学校里订购了一本书,淘宝那边接收到你的订单准备好物品就开始给你发货了。他发现你的收货地址在湖南,于是它可能从杭州出发,先去了福建的中转站,然后再到江西的中转站。突然发现江西到湖南的中转站不通,于是它只能再绕到广东的中转站,最后再到湖南中转站。这些中转站就相当于公网上的各个网关。到了湖南中转站,快递小哥再把包裹送到你的校门(这就是最后一级网关)。这时快递小哥就走了,校门处的管理人员在根据的你的宿舍信息把包裹拿给你。(局域网内部的信息交流由校园网这个网关来处理) 这对刚接触互联网的人来说有些难以理解内网 IP 和公网 IP 的区别,那我们再举一个例子。
我们把酒店的 201 房比作内网 IP,那么凡是酒店都可能有 201 房,假如你饿了会对服务员说:“我在 201 房间,麻烦送些吃的过来“。而假如你要点外卖的话你对店家仅说送来 201 房间(内网 IP),外面的人是不可能知道的。这时你就要对店家说某某市某某区某某酒店(公网 IP)再加上 201 房店家才能找到你。运营商所分配公网 IP 地址(某某市某某区某某酒店)也就是所住的酒店,而 201 房(内网 IP ) 则是酒店管家(路由器)所分配的。所以一个酒店可以有很多的房间(内网 IP )但是当外面的朋友问你住哪里,你肯定不会说你住在201房间(内网 IP )而会说你住在某某市某某区某某酒店(公网 IP )。这是内网 IP 和公网 IP 的本质区别。一个对内,一个对外。
公网 IP 具有世界范围的唯一性,而内网 IP 只在局域网内部具有唯一性
一个局域网里所有电脑的内网IP是互不相同的,但共用一个外网 IP。就像前面酒店的例子一样:你所在学校的校名在整个世界上只有一个,但是你学校里面的 A 栋大楼 3 层 3 号教室只有在你的校园内部才具有唯一性。别的学校也有 A 栋大楼 3 层 3 号教室。你只能跟快递小哥说请帮我把包裹送到 xx 大学,而不能说请帮我把包裹送到 A 栋大楼 3 层 3 号教室。
在局域网中,每台电脑都可以自己分配自己的 IP,但是这个 IP 只在局域网中有效。而如果你将电脑连接到互联网,你的网络提供商的服务器会为你分配一个 IP 地址,这个IP地址才是你在外网的 IP。两个 IP 同时存在,一个对内,一个对外。
互联网上的 IP(即外网 IP)地址统一由一个叫 "IANA(互联网网络号分配机构)" 的组织来管理。由于分配不合理以及 IPv4 协议本身存在的局限,现在互联网的IP地址资源越来越紧张。IANA 将 A、B、C 类 IP 地址的一部分保留下来,留作局域网使用。具体如下——IP地址空间:A 类网 10.0.0.0 ~ 10.255.255.255,B 类网172.16.0.0 ~ 172.31.255.255,C 类网 192.168.0. 0~ 192.168.255.255。也就是说,如果你查到的 IP 地址在以上 A、B、C 类IP 地址的范围内,它一定就是局域网的 IP 地址,否则就是公网的地址。
实际生活中不仅有一级 NAT 技术,还有二级 NAT 技术。也就是可能你的校园网关也只是个局域网。通过多级转换可以得到更多的地址。
区别公网IP和私有IP的方法
经验法
- 1、一般电信 ADSL 带宽在未升级大带宽前是(动态)公网 IP。如果花费很少的钱给你升级为 100M 光纤上网,99.99% 是内网IP,那 0.01% 是我还没有发现过案例。
- 2、代理网络运营商 99.99% 都是内网IP,如长城带宽、聚友E家等。
- 3、光纤上网的 99.99% 都是内网IP。
直观法
以下 IP 段的地址都是内网 IP 地址
10.0.0.0 到 10.255.255.255
172.16.0.0 到 172.31.255.255
192.168.0.0 到 192.168.255.255
5.理解运营商在上网中的作用
运营商通常是指提供移动通信、互联网、有线电视等通信服务的公司或组织。这些公司负责搭建和维护通信基础设施,例如移动电话网络、互联网网络和有线电视网络,使人们能够进行语音通话、数据传输和观看电视节目。
举个例子来理解一下。
一个家庭想要能够上网,都需要做哪些准备工作呢?
- 首先肯定是有运营商,在你家附近有网络覆盖。
- 你这个家庭联系运营商进行光纤入户。
- 工作人员上门安装调制解调器(就是我们平常所说的 “猫儿”)和 无线路由器。
- 工作人员给你开户,配置路由器账号、密码(这套账号密码是运营商认证你们的账号密码)。
- 配置你自己的账号、密码(这套账号密码是你登录路由器连接网络所需要使用的,账号通常可直接设置为你的手机号)。这套账号密码是用来认证连接的成员的。
- 正常上网,正常按月按年交费。
我们在上网的过程中,是需要通过运营商的设备来进行上网的。
提问:这里的交费(可以理解为买流量),是交给谁了呢?
答案是交给运营商了!这里就有一个疑问:我们自己平常上网,我们玩抖音、微信、头条、搜索、点外卖等等,可是到了月底或者年底交费却给了运营商,这是为什么呢?
原因很简单,是运营商给我们搭建通信的基础设施,所有设备上网都是要通过运营商所搭建的基础设施!
无论是你的手机卡,还是家里的路由器都是有账号认证的。当你的电话卡欠费时,为什么就不能拨打电话了呢?原因就是运营商会对你的手机号进行认证,再检测你所剩的余额。但是欠费了依然可以拨打10086,这个就是运营商设置的一个提供服务的操作。
我们这里再简单的思考一下:我们经常听到,我们是访问不了goole的,是需要fb(自行理解ovo~)去访问外面的网站,这又是为什么呢?
这里我们只需要思考清楚是谁拦截了你。答案就是运营商。我们这要上网就需要先经过运营商,运营商拿到你的数据,看你的目的IP是到哪里的,检测到是外面的就直接拦截了你。简单理解,就是运营商给你设置了一道墙。
6,路由器
6.1.路由器在局域网的作用
- 路由器本质也是子网的一个主机,也要配置IP地址。
- 路由器一定至少要连接两个子网,路由器相当于同时在两个子网,路由器一定要配置多个IP(上图有两个),我们可以理解为路由器有多个网卡
- 我们一般可以理解为路由器是子网的第一个设备,一般它的IP地址的网络号就是1.
- 路由器的功能不仅仅是IP报文的转发,路由器还有一个功能就是构建子网,比如无线路由器的例子
- 也就是说路由器能自主维护内网地址。
通过上图我们也能发现:
- 不同的子网其实就是把网络号相同的主机放到一起。
- 如果在子网中新增一台主机,都必须先连接路由器,由路由器维护这个连接,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。(事实上这个是内网IP)
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同。 那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情。
- 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
- 一般的路由器都带有DHCP功能。
- 因此路由器也可以看做一个DHCP服务器。
我们所使用的家用路由器:
- 对内:面对自己构建的子网;
- 对外:自己本身是被人构建的子网的一个主机。
6.2.路由器的结构
路由器在其物理结构上通常具有两主要类型的网络接口,分别是LAN口(局域网口)和WAN口(广域网口),我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP.
它们在网络连接和数据传输中扮演着不同的角色:
LAN口(局域网口):
- 局域网接口:LAN口通常用于连接本地网络内的设备,如计算机、手机、智能家居设备等。这些设备通常位于同一个物理位置,例如您的家庭或办公室内。
- 本地数据交换:LAN口用于在局域网内传输数据包,使本地设备能够相互通信,共享文件、打印机、互联网连接等。
WAN口(广域网口):
- 广域网接口:WAN口通常用于连接到广域网,如互联网服务提供商(ISP)的网络。这是您的局域网与外部互联网之间的关键接口。
- 外部数据传输:WAN口负责将数据包从局域网传输到外部网络(互联网),并将来自外部网络的数据包传送回局域网。这是实现互联网连接的关键。
- WAN口IP,也可理解为自己所在的上级子网所分配的IP。说是广域网口也不是很准确。
- WAN口IP可能是私有IP,也可能是公有IP。一般来说,处于全球网络通信体系越靠近最顶层的路由器的WAN口IP就越有可能是1公网IP,而处于通信体系最底下的那些路由器的WAN口IP就是私有IP
- 一般来说,运营商提供的路由器的WAN IP是公网IP,这样可以让用户能够连接到互联网。而用户自己家里的路由器的WAN IP则通常是运营商分配的私有IP,用于内部网络的连接和管理。
我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:
通过上图我们也能发现:
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP(私有IP)地址不能重复,但是子网之间的IP地址就可以重复了。
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了。
- 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。这样的服务器可以在阿里云/腾讯云上进行购买。
因为有了私有IP,每个局域网内的私有IP是可以重复的,这样就大大缓解了IP地址不足窘迫。通常在局域网中使用网络地址转换(NAT)技术(本质上就是不断的将私有IP向上替换成公网IP进行通信),将多个内部设备共享一个公网IP地址,以便它们可以访问互联网。
6.3.NAT技术
NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个主要功能
- 一个路由器可以配置两类IP地址,一个是WAN口IP,一个是LAN口IP
- 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),即子网的第一个IP。子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了,即两个子网允许出现相同的主机号
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了
- 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(将源IP地址替换成WAN口IP),这样逐级替换,最终数据包中的IP地址会成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有公网IP的服务器上,这样的服务器可以在阿里云/腾讯云等等云服务平台购买
路由器在做IP地址替换时,还会将源IP和目的IP的映射关系保存,记录在NAT转换表中。
6.3.1.NAT IP转换过程
- 在上图,10.0.0.10和10.0.0.11这两台主机都向目标地址是163.221.120.9:80发送消息
- 在NAT路由器内部,会维护IP地址+端口号转换的表——NAPT转换表
- 这两条消息到了NAT路由器,路由器会根据NAPT转换表将源地址10.0.0.10替换成全局的IP 202.244.174.37,然后再转发出去
- NAT路由器收到外部的数据,也是一样的,会根据NAPT转换表,把目标IP从202.244.174.37替换成10.0.0.10
当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(NAT),将数据包中的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。
在进行 NAT 转换时,路由器会将源 IP 地址+端口号替换为它自己(路由器)的公网 IP 地址+端口号,并在其 NAPT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。
具体而言,当出口路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址+端口号。然后,根据NAPT转换表中的映射关系,找到对应的私有 IP 地址+端口号。接着,出口路由器会将数据包的目标 IP 地址+端口号修改为对应的私有 IP 地址+端口号,并将数据包发送到局域网内的相应主机。
- 为什么转换表中不仅转换IP地址,还转换端口号?
这是因为可能存在同一局域网不同主机访问同一外网服务器的同一端口号服务
正如上图,10.0.0.10和10.0.0.11同时想访问202.244.174.37:80。
如果只转换IP地址,那么这两台主机转换后的数据包其中源IP地址都是NAT路由器的IP地址。当服务器返回响应时,只有NAT路由器的IP地址,无法区分这个响应是给哪台局域网主机的。所以还需要转换端口号来区分不同主机
总结一下,就是
NAT IP转换过程就是将源IP(也就是私有IP)不断转换成公有IP的过程。
NAT技术是一种网络地址转换技术,它可以将私有网络地址(如局域网内部地址)转换成公共网络地址(如互联网地址)。这样,多台设备就可以共享一个公共IP地址上网,既节省了IP地址资源,又增强了内部网络的安全性。NAT技术通常部署在路由器或防火墙上,通过修改数据包的IP地址和端口号等信息,实现内部网络与外部网络的互联互通。
6.3.2.NAT技术的使用
局域网中的数据包在发送到公网的过程中,其实是要做源ip地址替换的,像图中绿色的箭头就是数据包的流向(这里我就先不说路由选择的事情,直接先说数据报跳到下一跳后,下一步要做的工作,至于路由选择的事情,后面会详细去讲。)
当数据报从客户端主机发出去的时候,会到达自己所在局域网的出口路由器,也就是图中的家用路由器,然后数据报中的IP层的源ip字段就会被路由器替换为路由器自己的Wan口ip10.1.1.2,当路由器将数据包发送到运营商路由器时,运营商路由器会将IP报头中的源ip字段又替换为自己的Wan口ip122.77.241.4,最终由运营商路由器将报文发送给公网上的服务器主机122.77.241.4。
这样不断将数据报中的源ip替换为路由器的Wan口ip的技术,其实就是NAT技术,而ip地址不足的问题能够得以解决,主要是有两个原因,
- 一是通过局域网划分是私有ip大量重复的使用,
- 二是私有ip可以通过NAT技术访问到公网上的服务器,
如果往细说一说的话,其实能够让私有ip访问到公网上的服务器,并不是因为NAT技术,而是因为目的ip和网络中每个节点的路由表,NAT技术配套的还有NAPT技术,如果没有NAT技术就没有NAPT技术,所以说NAPT实际上解决的是数据包如何从服务器返回的问题,NAT解决的是数据包如何从内网转发到公网的问题。
6.4.众多补充知识点
(1)相互连接的两个网段的网络号是不能相同的,不连接的两个网段的网络号是可以相同的。
由于相互连接的两个网段是会有桥接设备路由器的,当路由器收到来自外边的数据报要转发到他所管理的各个网段中的某一个网段时,如果这些网段的网络号都相同,那路由器就无法路由转发该数据报,而路由器在组建局域网的时候,是绝对不会这样组建的。
如果两个网段之间并没有任何桥接设备,他们各自用的路由器并不相同,就像下面的两个网段,两个网段的网络号都是192.168.1.0,但两个网段并没有连接,并不会出现各自的路由器不知道该将数据报发送到哪个网段的情况,因为两个路由器各自都管着自己的家庭局域网,之间并没有交集,所以这两个家庭局域网的网络号是允许相同的。
(2)家用路由器桥接了两个子网,一个是家庭中的局域网,一个是与运营商路由器和其他路由器之间构建的局域网。
像路由器这样的设备,一定是桥接了很多的子网的,所以路由器会配有多块网卡,每个网卡对应不同的子网接口,能够与不同的网段建立连接。
图中的路由器桥接了两个网段,则路由器在这两个网段中就应该各自有该网段中的ip地址,比如下面中间的路由器,他既有在家庭局域网中的内网ip192.168.1.1,又有路由器和路由器之间所构成的局域网的内网ip10.1.1.2,前者一般称之为Lan口ip,指的是路由器对内管理的局域网中自己的ip,后者一般称之为Wan口ip,指的是路由器对外,自己作为局域网中的一台主机时,自己的ip。
像网段1右边的运营商的路由器同样也有自己的Lan口ip和Wan口ip,对内管理着其他路由器,所以Lan口ip是10.1.1.1,对外自己作为局域网中的一台主机,有着自己的对外的公网Wan口ip122.77.241.4
(3)不同的私有ip是可以一样的。
不同的网段,如果是相互不桥接的网段,出现相同的私有ip是一件非常正常的事情,只要保证他们各自可以访问公网就可以了,这也是一定能够做到的,因为他们是互不连接的网段,之间并不会影响。
如果是相互桥接的网段,两个网段的网络号是不能重复的,同时也不能出现相同的私有ip,比如网段1的网络号是192.168.0.0,网段2的网络号是192.168.101.0,如果两个网段出现了相同的私有ip,则会导致连接两个网段的桥接路由器在转发来自外部报文时,出现不知道发给谁的问题,比如两个网段中,同时存在192.168.101.26ip地址,那当路由器在确定该ip地址应该去的网段时,网段1和网段2都能去,因为他们各自的子网掩码是FF FF 00 00和FF FF FF 00,一旦按位与后,两个网段都应该去,这一定是错误的!
所以相互桥接的网段中,各自是不能出现相同的私有ip的!路由器是可以控制这件事情不发生的,因为路由器具有DHCP的功能。
从所有的局域网的角度来看,无论各个局域网之间是否相互桥接,我们都是可以大面积,高频率的使用那三类私有ip地址的,所以,这就可以解决ipv4地址不足的问题,因为大量的私有ip地址可以在不同的网段中被重复的使用,这样就可以省下很多的公网ip留到公网环境中去使用,比如给大型的互联网公司这些公网ip,让各个局域网的主机都能访问到公网的同一台的服务器。
(4)一个路由器可能会维护多个Lan口ip或多个Wan口ip吗?
一个路由器会桥接不同的子网,那路由器就会同时处于不同的网段中,在这些网段中,路由器都要有自己的ip地址,且这些ip地址都不能相同,同时路由器既可能对内管理多个网段,也可能对外同时处于多个路由器组建的局域网,所以路由器可能会维护多个Lan口ip或多个Wan口ip,在配置路由器时,只要给路由器多配几块网卡就可以实现路由器的多ip地址了。
(5)为什么NAT技术要不断作源ip的替换?
如果不进行源ip的替换,就无法看到局域网主机的公网ip地址了,虽然源ip的替换无法解决数据报路由到下一跳的问题,因为这个问题实际上是由目的ip+节点路由表的方式来解决的,但源ip替换的价值其实并不是体现在数据包路由上的,而是解决ipv4地址不足的问题,它能够让不同的局域网主机共享一个公网ipv4地址。
多个局域网主机共享一个公网ipv4地址:这个功能是NAT最大的价值,这可以解决ipv4地址不足的问题,因为它可以让许多的私有ip共享同一个公网ipv4地址。
隐藏内部网络拓扑结构:这个作用可以算是捎带的,看一下就好,时间长了肯定也会忘,但上面的功能是NAT技术最大的价值,一定要记住!当内部设备通过 NAT 路由器访问互联网时,外部网络只能看到 NAT 路由器的公网IP地址,而无法直接获知内部设备的真实IP地址,这样就隐藏了内网的拓扑结构。
(6)为什么局域网的主机还可以查到公网ip?
其实局域网中的所有主机都可以查到自己的公网ip,就像下面图中左侧四台客户端主机的公网ip就是运营商路由器的Wan口ip122.77.241.4/24,因为他们所处的局域网数据包最终转发到公网时,他们的源ip都会被替换成连接公网的路由器的Wan口ip,所以这些局域网的主机会共享同一个公网ip。同时右侧的两台客户端主机也是如此,他们也会共享同一个公网ip,正是右侧连接公网的路由器的Wan口ip122.77.241.5/24
(7)局域网的主机会共享一个公网ip吗?
这是一定会发生的!因为我们知道ipv4地址不足的问题能够得以解决,靠的就是组建局域网的ip地址是能够大量高频率被使用的私有ip地址,那么这些私有ip地址对应的主机是一定要能够访问到互联网的,那么也就是说这些主机一定要有配套的公网ip,公网ip只有大概42亿,所以许多的局域网的主机一定会共享一个公网ip的。
下面是我的移动设备手机和笔记本连接我家的局域网时,查到的公网ip,左侧是通过windows命令行curl 4.ipw.cn和一个查询公网ip的网址查出来的结果,右侧是我的手机用同样的查询公网ip的网址查出来的结果,可以看到我的移动设备的公网ip和笔记本相同,我还看了我姐的手机和我妈的手机,他们的公网ip和我的两个设备的公网ip全部相同!
(8)两个局域网中的主机能否直接进行通信?
两个局域网中的主机无法通过发送数据报的方式直接进行通信,因为我们说过目的ip大部分情况都得是公网ip,而局域网中的主机会存在大量重复私有ip的情况,如果数据报的目的ip是私有ip的话,那数据报其实是不知道该去哪里的,因为网络中可能很多的局域网中都有主机的地址是数据报的目的私有ip,所以我们称下面的两个局域网中的主机是没有办法直接进行通信的。
(9)那我和我的朋友用QQ聊天是个什么逻辑呢?我和我的朋友都在局域网里面啊!
其实之前我们写过一个UDP版本的聊天室的socket通信代码,他的逻辑和QQ是类似的。
我们用的QQ的客户端和服务器端都是腾讯公司写的,当我们登录QQ时,其实就是本地的客户端进程和腾讯的QQ服务器建立了TCP连接,如果你此时给你的朋友发消息,其实你并不是直接将消息发送给你的朋友了,消息一定是先被发送到了腾讯的服务器上,然后再由腾讯的服务器把你发送的消息推送给你的朋友,如果你的朋友是在线状态,也和服务器建立了连接,那你的朋友会立刻收到由服务器转发的消息,如果你的朋友不在线,那服务器会先缓存这批消息,等下次你的朋友上线的时候,服务器会将之前你发的消息,再推送给你的已经上线的朋友。
推送的方式也很简单,只要你登录了QQ,服务器就与你建立了连接,那么你们之间就有通信可以使用的sockfd1,服务器只需要将你的消息暂存到一个buffer里面,当你的朋友与服务也建立连接之后,你的朋友的QQ客户端和服务器也会有通信时使用的sockfd2,服务器只需要将buffer中的数据通过调用send接口和sockfd2参数,就可以将消息推送到你的朋友那里。
所以我们说局域网中的客户端之间是无法直接进行通信的,必须由公网上的服务器主机来间接实现你们俩之间的通信,例如图中两台主机都和服务器建立了TCP连接,此后两台主机之间的通信,服务器就做一个消息的中转站,将消息发送给你的朋友。所以从一台客户端主机到服务器,和从服务器回到这台客户端主机,这条路径是具有唯一性的,但客户端主机之间是不具有唯一性的,因为他们的ip地址都是私有ip。
总结:
- (1)内网中的数据包能够发送到公网,靠的是目的ip和网络中每个节点的路由表。
- (2)NAT进行源ip的替换是为了解决ipv4地址不足的问题,能够让局域网中的主机共享一个ipv4地址
- (3)数据包从公网服务器返回的时候,靠的是NAPT,不仅仅做源ip的替换,同时也会做port的替换,达到数据包能够从内网发到公网上的服务器,也能够回来的目的。
6.5.路由器工作原理
- 路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程。在这个过程中负责转发或者负责路由的机器就叫做路由器。
- 路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备。
如下图所示,主机A想和B通信,主机A先产生数据包,在经过一个互联网络之后,到达主机B。
如下图所示,有两个路由器router1和router2,router1连接的是1.0网段,router2连接的是4.0网段,1.0网段和4.0网段默认是不能通信的。
现在如果主机1.1想和右边的主机4.2通信,这个过程是如何发送的呢?
- ARP缓存表:
- ARP(地址解析协议)缓存表用于存储局域网内IP地址与MAC地址的映射关系。
- 当一个设备需要发送数据包给同一局域网内的另一个设备时,它首先会查看自己的ARP缓存表,看是否有目标IP地址对应的MAC地址。
- 如果没有,它会发送一个ARP请求广播到网络上,询问谁拥有该IP地址。收到ARP响应后,它会将MAC地址和IP地址的对应关系保存在ARP缓存表中,以便将来使用。
- 路由表:
- 路由表用于决定数据包在网络中的下一跳地址,以便数据包能够到达目的地。
- 路由器使用路由表来根据目标IP地址选择最佳的转发路径。
- 路由表中的条目通常包括目的网络地址、子网掩码、下一跳地址(或接口)等信息。
- 当路由器接收到数据包时,它会检查数据包的目标IP地址,然后在路由表中查找匹配的条目,以确定如何转发数据包。
首先主机1.1会先检查自己的ARP缓存表,发现自己的表中并没有4.2的MAC地址,于是它发广播,这个广播会发送给主机1.2和Router1的E0接口,1.2不会给1.1任何回复,而router1发现4.1不是同一网段所以不会帮它转发,而是把自己的IP1.3和E0接口的MAC地址回复给主机1.1,所以在1.1的ARP表中保存的是E0接口的MAC地址和其IP的对应关系。
所以主机1.1想和4.2通信的时候,它产生的数据会先以单播的形式传给router1的E0接口。
当E0接口收到数据包之后,查看数据包中的目标地址为4.2,然后router1会查找自己的路由表,发现在自己的路由表中能找到4.0这个网段,并且4.0网段在s0接口上,所以路由器就会根据路由表的指示把数据包从自己的E0接口路由至S0接口。
(这里要注意的是,如果路由表中找不到4.0这个网段,路由器不会像交换机一样执行广播,而是会丢弃这个数据包,并向1.1返回一个请求超时的结果。路由器也不会学习源目标地址。即路由器根本不关注源地址,只关注目的地址)
进而通过S0端口所连接的互联网络把数据包传递到了router2的S0接口
进而通过E0接口找到最终的目的地,把数据包转发过去,完成整个的转发过程
6.6.路由
6.6.1.见一见路由
主机A要发一个数据包a到主机C,请详细阐述传输过程中数据包a被路由的步骤。
第一步;在主机A上的封装过程
- ①主机A的应用层上向主机C发出一个数据包a
- ②主机A的应用层将数据包a传向自己的传输层,数据包a被分成数据段a。
- ③然后将数据段a传至自己的网络层,并为数据段a加上IP包头,数据包a的源IP地址为92.168.1.2,目的IP地址为92.168.3.2
- ④在封装完成后,主机A将数据包a向下送到数据链路层上进行帧的封装,为数据包a封装上帧头和尾部的校验码,源MAC地址0000.0C11.1111,目的MAC地址0000.0C22.2222。
由于主机A和主机C不在同一个IP网段,所以主机A把数据帧a发送给默认网关(路由器A接口f0/0)
第二步:路由器A的工作
- ①接收数据后,被存放在接口里进行校验,以保证数据的正确。
- ②将数据帧的二层封装拆掉,取出数据包a。
- ③将数据包送到路由器A中,然后由路由器A在路由表中寻找网段92.168.2.0
- ④在路由表里要到达网段92.168.3.0要通过路由器A接口f0/1,然后对数据包a重新进行帧封装源MAC地址0000.0C33.3333,目的MAC地址0000.0C55.5555
- 路由器A将数据帧a从路由器A接口f0/1发送给路由器B
第三步:路由器B的工作
- ①接收数据后,被存放在接口里进行校验,以保证数据的正确。
- ②将数据帧a的二层封装拆掉,取出数据包a。
- ③将数据包a送到路由器B中,然后由路由器B在路由表中寻找网段92.168.3.0
- ④在路由表里要到达网段92.168.3.0要通过路由器B接口f0/1,然后对数据包a重新进行帧封装源MAC地址0000.0C77.7777,目的MAC地址0000.0C66.6666
第四步:主机C的拆封过程
- ①核对帧封装的目的MAC地址和自己的MAC地址是否一致,否则丢弃。
- ②主机C检查帧尾的校验,是否损坏,否则丢弃。
- ③拆除帧封装,取出数据包a,传向自己的网络层。
- ④网络层核对目的IP地址无误后会拆掉IP包头将数据段向上传送至传输层处理。
- ⑤主机C会在传输层按顺序将数据包重组成数据流。
数据包a的路由过程结束
6.6.2.什么是路由
路由一般是路由器的IP层来做
路由是IP层最重要的核心工作,路由其实就是一跳一跳问路的过程,在问路的过程中,我们要去哪里当然是最重要的,而去的地方其实就是目的ip,目的ip大部分情况下都是公网ip。
如果是内网ip,很可能是只在内网环境下进行内网主机之间的通信,比如军网,为了保证军网的网络安全以及敏感信息的安全性,军网会与互联网隔离,军网内部通信通常使用的就是私有ip地址,也就是内网ip,这些报文只会在军网内部进行转发,不会在互联网中路由。
回到主题上来,报文在进行路由时,其实就相当于问节点,我要去目的主机,下一步我应该怎么走?网络中的每个节点都有自己的网络层,都会维护一张路由表,每个节点在查询路由表之后,节点就会告诉数据包怎么走,一般节点的查询结果会有两种,
- 一种是告诉数据包,你下一步到那个路由器A就可以了,后面怎么走我就不知道了,你到时候问A就可以了。
- 另一种是,我也不知道你该怎么走,但你可以去问问那个路由器B,看看他知不知道怎么走。
而这两种情况实际就分别对应了路由表的两种查询结果,
- 一种是节点确实知道数据包的下一跳位置应该在哪。
- 另一种是节点虽然不知道,但节点有默认网关,节点会自动把数据包交付到默认网关的位置。
其实IP层进行数据包的路由,最重要的两个部分就是目的ip和路由表。
我们先来看看路由表的大概组成部分和每个条目,需要说明的是,不止路由器有路由表,网络中的任何一个节点都有路由表,因为主机和路由器都有自己的网络层。
6.6.3.路由表的组成
通常情况下,路由表包含了路由器进行路由选择时所需要的关键信息.这些信息构成了路由表的总体结构.理解路由表的构成对我们进行路由维护和排错有重要意义,
下面将讲述路由表的主要结构成分.
路由表中的每一个路由项具有五个属性,在此我将它们分为四个部分:
1、网络地址(Network Destination)、网络掩码(Netmask):
网络地址和网络掩码按位与的结果用于定义本地计算机可以到达的网络目的地址范围。
通常情况下,网络目的地址范围包含以下四种:
- 主机地址;某个特定主机的网络地址,网络掩码为255.255.255.255,如上表中的6、7、9;
- 子网地址,某个特定子网的网络地址,如上表中的4、5;
- 网络地址;某个特定网络的网络地址,如上表中的2、3、8;
- 默认路由;所有未在路由表中指定的网络地址,如上表中的1,在后文将详细描述;
在添加路由时,Windows要求输入的网络地址和网络掩码相与后的结果必须等于网络地址,否则路由添加会失败。
2、网关(Gateway,又称为下一跳服务器):
在发送IP数据包时,网关定义了针对特定的网络目的地址,数据包发送到的下一跳服务器。如果是本地计算机直接连接到的网络,网关通常是本地计算机对应的网络接口,但是此时接口必须和网关一致;如果是远程网络或默认路由,网关通常是本地计算机所连接到的网络上的某个服务器或路由器。
3、接口(Interface):
接口定义了针对特定的网络目的地址,本地计算机用于发送数据包的网络接口。网关必须位于和接口相同的子网(默认网关除外),否则造成在使用此路由项时需调用其他路由项,从而可能会导致路由死锁。
6.6.4.路由的过程
下面来看一下,一个具体的路由表是如何将数据报进行转发的。
当路由器收到一个要转发和路由的数据报,并遍历其路由条目以决定如何转发时,正确的处理流程应该是这样的:
提取目的IP地址:从数据报中提取出目的IP地址。
遍历路由表:路由器遍历其路由表,对每个路由条目执行以下操作:
a. 计算网络地址:将目的IP地址与路由条目中的Netmask(子网掩码)进行按位与操作,得到网络地址。
b. 匹配网络地址:将计算出的网络地址与路由条目中的Network Destination(网络目标地址)进行比较。这里并不是与原始的目的IP地址直接比较,而是与网络地址进行比较。
选择路由:
如果相同:如果计算出的网络地址与路由条目中的Network Destination相匹配,那么路由器从该条目对应的Interface接口将该数据报转发到Gateway里面。如果Gateway(网关)字段非空,则数据报会被发送到该网关的IP地址(这通常意味着数据报需要被转发到另一个路由器)。如果Gateway为空或与Interface的IP地址相同,则数据报可能直接被发送到本地网络上的某个主机或进行广播。
如果不相同:如果计算出的网络地址与路由表中任何条目的Network Destination都不匹配,路由器会继续遍历路由表,直到找到匹配的条目或确定没有匹配的条目为止。
处理无匹配情况:
- 如果路由器遍历完整个路由表后都没有找到匹配的条目,那么它可能会采取以下几种行动之一:
- 如果存在默认路由(通常是一个具有全0子网掩码(
0.0.0.0
)的路由条目),则使用默认路由来转发数据报。- 如果没有默认路由,路由器可能会丢弃该数据报,并向发送方发送一个ICMP目标不可达消息(具体取决于路由器的配置和策略)。
因此,当按位与的结果与Network Destination不相同时,路由器会继续在路由表中查找匹配的条目,而不是立即丢弃数据报或采取其他行动。它会一直遍历路由表,直到找到匹配的条目或确定没有匹配的条目为止。
接下来来看一些例子
当然,以下是一些具体的例子来说明路由器处理数据报时的流程:
例子1:直接匹配路由
场景:
- 路由器收到一个目的IP地址为192.168.1.100的数据报。
- 路由器的路由表中有一条路由条目,其Network Destination为192.168.1.0,Netmask为255.255.255.0,Interface为Ethernet0/1,Gateway为空。
Network Destination Netmask Interface Gateway
192.168.1.0 255.255.255.0 Ethernet0/1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为192.168.1.100。
- 计算网络地址:将目的IP地址192.168.1.100与子网掩码255.255.255.0进行按位与操作,得到网络地址192.168.1.0。
- 匹配网络地址:将计算出的网络地址192.168.1.0与路由条目中的Network Destination192.168.1.0进行比较,发现匹配。
- 选择路由:由于Gateway为空,且Interface为Ethernet0/1,路由器将直接通过Ethernet0/1接口将数据报发送到本地网络上的主机192.168.1.100(如果它存在的话)。
例子2:通过网关转发
场景:
- 路由器收到一个目的IP地址为10.0.0.1的数据报。
- 路由器的路由表中有一条路由条目,其Network Destination为10.0.0.0,Netmask为255.255.255.0,Interface为Serial0/0,Gateway为172.16.1.1。
Network Destination Netmask Interface Gateway
10.0.0.0 255.255.255.0 Serial0/0 172.16.1.1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为10.0.0.1。
- 计算网络地址:将目的IP地址10.0.0.1与子网掩码255.255.255.0进行按位与操作,得到网络地址10.0.0.0。
- 匹配网络地址:将计算出的网络地址10.0.0.0与路由条目中的Network Destination10.0.0.0进行比较,发现匹配。
- 选择路由:由于Gateway为172.16.1.1,路由器将数据报发送到网关172.16.1.1的IP地址,这通常意味着数据报需要被转发到另一个路由器。
例子3:无匹配路由和默认路由
场景:
- 路由器收到一个目的IP地址为203.0.113.1的数据报。
- 路由器的路由表中没有直接匹配203.0.113.1的路由条目。
- 但是,路由表中有一条默认路由,其Network Destination为0.0.0.0,Netmask为0.0.0.0,Interface为Serial0/1,Gateway为192.168.2.1。
Network Destination Netmask Interface Gateway
0.0.0.0 0.0.0.0 Serial0/1 192.168.2.1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为203.0.113.1。
- 遍历路由表:路由器遍历其路由表,但没有找到与203.0.113.1直接匹配的路由条目。
- 处理无匹配情况:由于存在默认路由,路由器选择使用默认路由来转发数据报。
- 选择路由:路由器将数据报发送到网关192.168.2.1的IP地址,以便通过另一个路由器进行转发。
这些例子展示了路由器在处理数据报时如何遍历路由表、匹配网络地址以及选择路由的详细流程。
6.6.5.route命令
route 命令可以显示或设置 Linux 内核中的路由表,主要是静态路由。
这些标题的含义如下
+-----------------+-------------------------------------------------------------+
| 字段名称 | 含义 |
+-----------------+-------------------------------------------------------------+
| Destination | 目标网络或目标主机(本机的数据要发送的目的地:子网或主机), |
| | 与Genmask组成一个网段。 |
+-----------------+-------------------------------------------------------------+
| Gateway | 网关(如果是默认网关,网关的地址必须和主机的某块网卡在同一 |
| | 子网)即网关地址。如果没有就显示星号(*)。 |
+-----------------+-------------------------------------------------------------+
| Genmask | 网络掩码,如果目标网络的子网掩码为255.255.255.255,说明目标 |
| | 是一台主机;如果子网掩码为'0.0.0.0',说明该路由是默认路由。 |
+-----------------+-------------------------------------------------------------+
| Flags(旗标) | |
| U | 该路由是启动的。 |
| H | 目标是一部主机 (IP) 而非网段。 |
| G | 需要透过外部的主机 (gateway) 来转递封包(该行有gw)。 |
| R | 使用动态路由时,恢复路由资讯的旗标。 |
| D | 已经由服务或转 port 功能设定为动态路由。 |
| M | 路由已经被修改。 |
| ! | 这个路由将不会被接受(用来抵挡不安全的网域)。 |
| A | 由addrconf安装。 |
| C | 缓存条目。 |
+-----------------+-------------------------------------------------------------+
| Metric | 距离、跳数。暂无用。与目标的“距离”(通常以跳数计算)。它不被 |
| | 最近的内核使用,但可能需要路由守护进程。 |
+-----------------+-------------------------------------------------------------+
| Ref | 不用管,恒为0,对这条路线的引用次数(Linux内核已不再使用)。 |
+-----------------+-------------------------------------------------------------+
| Use | 该路由被使用的次数,可以粗略估计通向指定网络地址的网络流量。 |
| | 路线查询次数。根据-F和-C的使用,这将是路由高速缓存丢失(-F) |
| | 或命中(-C)。 |
+-----------------+-------------------------------------------------------------+
| Iface | 接口,即eth0,eth1等网络接口名,为此路由发送数据包的接口。 |
+-----------------+-------------------------------------------------------------+
7.IP协议的分片
7.1.为什么要分片
真正在路由器和之间传递的确实是IP报文,但在一个局域网内部,真正传输的是MAC帧,这也就意味着,真正在局域网内传输的是数据帧,也就是说每个局域网内都会按照数据帧的方式传输,到达局域网中的下一跳位置后,下一跳位置的网络层来决定下下一条的位置应该在哪,确定好之后,在下一个网段中继续用数据帧来传输,所以真正在网线上跑的是数据帧,而不是IP报文。
而数据链路层有MAC帧协议,常见的就是以太网协议,以太网有规定,MAC帧的有效载荷不能超过MTU(maximum transmisson unit 最大传输单元)1500字节,IP报文能够决定传输数据的大小吗?并不能,控制传输数据大小的是TCP,TCP是面向字节流的,它可以控制什么时候发送数据,发送的时候发送多少,这也就是为什么滑动窗口中有多个数据段,而不是一个数据段,因为MTU会限制单个数据包的有效载荷不能超过1500字节,所以TCP在通过滑动窗口发送数据段时,都是发送多个数据段,而不是将多个数据段合并成一个大数据段进行发送。
先通过下图与文字,我们对分片首先有一个认识:
之后我们可以对分片进行一个简单的 总结 :
- 链路层由于物理特征的缘故,无法一次转发过大的数据 。每个链路层协议有其最大传输单元(MTU),在以太网中通常为1500字节。因此,一次转发的报文大小受到MTU的限制。
- 分片是在网络层(IP层)进行的 :当IP数据包大小超过某个链路或节点的最大传输单元(MTU)时,路由器或主机会将原始数据报进行分片,使其大小适合于网络上的传输。
- 分片后的数据包会带有相同的源和目的地址 ,但是会有不同的标识符以及分片偏移字段,以便接收方能够将分片正确地重组成原始的数据报。
7.2.见见分片
我们知道: 数据包在分片之前,一定是一个独立的ip报文 :
那么,当数据包分片后,应该是 ①每个分片后的包应该是都带报头 ②不需要带报头,只要有第一个就行 ?—— 是①!
具体过程如下图所示:(该例是对上面不准确例子的扩充)
上面就是一个简易的分片示例
7.3.怎么实现分片
此时我们知道了为什么会有分片,那么分片的是如何做到的?分片行为主要由下面三个字段完成:
上文我们已经对这三个字段进行了解释,这里再次简单提及:
- 16位分片标识:如果一个报文不分片,不同报文之间的16位标识符是不同的;如果一个报文分片了,分片报文的16位标识符是一样的,说明这些分片报文原本属于一个完整的报文。
- 3位标识:1位保留、1位标识禁止分片、1位标识更多报文MF(1说明后面跟了具有16位标志符的报文,0说明后面没有)
- 13位片偏移:分片以后,各个部分在原始报文的哪个位置,即在原始报文中的偏移量。
其实解决如何要进行分片与组装,可以将这个问题细分为几个小问题,解决这些小问题之后,这个大问题自然就迎刃而解了。
(1)如何判断一个报文被分片了?
3位标志中,第一个字段被保留,第二位表示禁止分片,第三位表示更多分片标志位MF。
设置第三位MF为1,则该报文被分片,分片的报文中,除了最后一个分片,其他分片都是1,只有最后一个分片的第三位是0。
所以当收到一个报文时,如果该报文的更多分片标志位MF是1,那说明这个报文是一个分片报文,如果该报文的更多分片标志位MF是0,但同时他的13位片偏移大于0,则说明这个报文是分片中的最后一个分片报文
- 得到结论, 对于一个报文,可以通过下面的方法判断是否被分片 :
- 更多分片标志为1:分片
- 13位片偏移不为0:分片
- 上面两条如果任意一条都无法满足,为独立报文
- (对于上面的结论,不能反着推,比如:分片的报文更多分片标志一定为1,通过下面一条我们可以完全对分片报文进行认识:)
(2)同一个报文的分片怎么能够识别出来?
16位标识,同一个数据报的所有分片都会具有相同的16位标识,因为这些分片原来都是出自一个数据报的,每个数据报都有自己的16位标识字段,自然一个数据段被分片后,每个分片的标识字段的值都是相同的。
(3)分片哪个在前,哪个在后,有没有收全或丢失?
13位片偏移,表示该报文的有效载荷在原来的数据段中的偏移量,所以我们可以通过偏移量的大小和报文自身的长度来确定分片的前后顺序以及是否收全或丢失
(4)如何将分片的报文重新组装为一个完整的报文?
将受到的分片报文可以先按照偏移量的大小做一个升序排序,后一个报文的偏移量大小,应该等于之前一个或多个报文在原来数据段中的长度之和。
(5)怎么保证我组装的报文是正确的?
把收到的分片合起来之后,合起来的报文的首部有16位IP头部校验和,除此之外,去掉IP报头向上交付后的TCP报文段的TCP首部也会有自己的16位头部校验和,通过这些校验和就可以判断组装好的报文是否是正确的。
7.4.分片机制示例
分片机制 示例 :
- IP 数据报 : 首部 20 2020 字节 , 数据部分 3800 38003800 字节 ;
- 将其进行分片处理 : 每个分片不超过 1420 14201420 字节 ;
- 标识 : 666 666666 ;
- 标志 : DF = 0 , 表示允许分片 ; MF = 0 , 表示后续没有分片 ;
- 片偏移量 : 0 00
分片后的结果是 : 分成 三片 ;
第一片 :
- 分片数据 : 首部 1 11 ( 20 2020 字节 ) + 1400 14001400 字节数据部分 ;
- 标识 : 666 666666 , 同一个分组的分片 , 标识相同 ;
- 标志 : DF = 0 , 允许分片 ; MF = 1 , 后续还有分片 ;
- 片偏移量 : 片偏移量 是 0 , 单位是 8 88 字节 , 本片偏移量相当于 0 00 字节 ;
第二片 :
- 分片数据 : 首部 2 22 ( 20 2020 字节 ) + 1400 14001400 字节数据部分 ;
- 标识 : 666 666666 , 同一个分组的分片 , 标识相同 ;
- 标志 : DF = 0 , 允许分片 ; MF = 1 , 后续还有分片 ;
- 片偏移量 : 片偏移量 是 175 , 单位是 8 88 字节 , 本片偏移量相当于 1400 14001400 字节 ;
第三片 :
- 分片数据 : 首部 3 33 ( 20 2020 字节 ) + 1000 10001000 字节数据部分 ;
- 标识 : 666 666666 , 同一个分组的分片 , 标识相同 ;
- 标志 : DF = 0 , 允许分片 ; MF = 0 , 后续没有分片 ;
- 片偏移量 : 片偏移量 是 350 , 单位是 8 88 字节 , 本片偏移量相当于 2800 28002800 字节 ;
片偏移量是从数据部分开始计数 , 数据部分的开始位置是 0 00 字节 , 其单位是 8 88 字节 , 片偏移量 1 11 代表 8 88 字节 ;
7.5.分片的缺点
分片有风险,只要有一部分丢了,如果对端网络层无法组装,要组装的几部分会全部丢弃,对方TCP没有收到报文,就认为是丢包了。所以一般不建议分片,分片会增加丢包概率。
1、对UDP的影响
UDP没有发送缓冲区,应用层要发多少,到了网络层就是多少,这个时候就得老老实实分片。分片会增加丢包的概率,一旦某个分片报文丢了导致无法组装就会将相关的分片报文全部丢弃。(是否相关可以根据16位分片标识来判断)
2、对TCP的影响
因为TCP有缓冲区的存在,想发多少、什么时候发都由TCP决定,TCP可以做到自己控制数据段的长度,然后再传到网络层,此时就无需网络层来分片了。
但TCP每次可以发送的数据长度不是无限大,受制于MTU和对方主机的MSS(Max Segment Size),即最大消息长度。
受制于MTU的意思是,为了不分片,TCP每次最多携带的数据是多少。不同系统的MTU可能有所不同,MTU减去TCP报头和IP报头的大小,就是TCP每次最多可以发送的数据量。
受制于对方主机的MSS的意思是,对方每次最多可以接收多少。双方在发送SYN的时候会在TCP头部写入自己可以支持的MSS值,在得知对方的MSS以后,选取较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2);