目录
- 网络层基本概念
- IP协议头格式
- 网段划分
- 特殊的IP地址
- IP地址的数量限制
- 运营商的理解
- 全球网络的理解
- 私有IP地址和公网IP地址
- 路由
- IP层分片与组装
- 数据链路层
- 以太网帧格式
- 以太网通信原理
- ARP协议
- ARP数据报的格式
- DNS
- 域名简介
- ICMP协议
- NAT技术
- NAPT技术
- 代理服务器
网络层基本概念
一个人数学有考满分的能力,是不是一定能拿到满分呢?不一定,只是有很大的概率能考满分。同样的,一个数据不一定能够发给对方,只是有很大的概率成功发送给对方。
你的数学能力很强,老师希望你能拿到数学满分,如何保证呢?你这次没考到满分,老师就说再做一张试卷,还没考到满分,再做一张试卷,直到你满分了。
最终目的:拿到试卷满分。老师是给你提供策略--TCP提供可靠性策略
真正去办事的是你--IP报文/IP协议。
IP协议的本质:提供一种能力,将数据跨网络从A主机送到B主机。
注意:本章默认讲的都是以公网IP为例,除非特殊说明以私有IP为例
在复杂的网络中确定一个合适的路径。主机:配有IP地址,但是不能进行路由控制的设备。
路由器:配有IP地址,又能进行路由控制。
节点:主机和路由器的统称。
在路径选择中,目标IP非常重要,决定了我们的路径该如何走。IP = 目标网络 + 目标主机。(先找到目标网络,再在其中找到目标主机)
如何理解呢?
给大家举个例子:
假如学号 = 学院编号 + 学院内个人编号。你捡到了一个钱包,里面只有学生卡,学生卡上只有学号。
归还钱包的本质就是查找,查找的过程中需要排除。如果你一次查找只能排除一个,那就是线性遍历,效率太低了。
有一种高效的方法:将这个钱包交给计算机学院的学生会主席,学生会主席认识这个学院号432,就会交给电气学院的学生会主席,他认识这个学院内个人编号,就会交给这个人。
为什么归还的速度变快了?因为排除的效率变高了。查找第一次,本质是淘汰了这个局域网内的所有人;查找二次,交给其他学生会主席,本质是淘汰了所有的学院。
IP = 目标网络 + 目标主机。为什么这么分呢?构建网络的时候,为我们将来高速定位一台主机,提供基础保证。
IP协议头格式
1.报头和有效载荷如何分离?
固定长度(20字节) + 自描述字段(4位首部长度 + 16位总长度)
4位版本 :指定IP协议的版本。对于IPv4来说,就是4。入网设备太多了,从电脑到手机,未来还有物联网,则会有IP地址不足的问题。IP地址不足,解决技术有NAT技术,ipv6技术(这个技术是我国发明的,所以在我国用的是最多的。主要内网在用,公网在用ipv4)
4位首部长度 :0~15。单位是4字节。 范围共0 ~ 60字节。标准报头长度为20字节,4为首部长度为x,则剩余报头长度:x * 4 - 20字节。
8位服务类型 :3位有线全字段(已经弃用),1位保留字段(必须置为0),4位TOS字段:最小延时,最大吞吐量,最高可靠性(IP是不保证可靠性,我想选择尽量不会丢包的路径,丢包了IP层也没办法),最小成本。这四者互相冲突,只能选择一个,对于ssh(用于在网络上安全地连接到远程计算机或服务器并进行各种操作)/telnet这样的应用程序,最小延时比较重要,对于ftp(文件传输协议)这样的程序,最大吞吐量比较重要。
16位总长度 :表示整个报文的总长度。
8位生存时间(TTL):如果主机挂了或网络本身有问题,就导致IP报文会一直转发,如果时间变久了,一定会存在大量的游离报文,生存时间就是IP报文的跳数,一个节点到另一个节点,称为跳数。每跳一次,TTL就会减1,减为0就会被丢弃。
如何将有效载荷交付给上层?
8位协议:如果你是TCP协议交给IP层,你就填TCP协议号,如果是UDP就填UDP。接收的时候,会根据这个交给上层的哪个协议。
网段划分
IP地址分为两个部分,网络号和主机号
网络号:保证相互连接的两个网段具有不同的标识。
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
在不同的网段内网络号是不相同的,但主机号可能相同,就和我们的学号一样,网段和学院一样,主机号和个人编号一样。
子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
路由器的认识 :1.路由器本质也是一个子网的主机 ,所以也要配置IP地址 。路由器一定至少要连接2个子网 ,路由器也就相当于同时在两个子网。所以路由器要配置多个IP ,如何理解?认为路由器有多张网卡。
2.路由器一般是一个子网中的第一台设备,一般他的IP地址都是:网络号.1
3.路由器的功能,IP报文的转发,不仅仅如此,还有构建子网(局域网) 。如在家里,以前你电脑上网必须要插入网口。现在你买了无线路由器,你能连路由器,手机电脑都能上网,本质:构建子网。
所以说你的IP地址哪里来的,为什么IP地址保证了在同一个子网内能不重复?路由器给你分配的 。所以一个子网内的所有IP都是路由器帮你维护的。你再新增一台主机,得到的IP地址,因为IP都是由路由器维护的,所以给你的IP地址当然可以做到不重复。这种IP我们把它叫做内网IP,而我们上面所举的例子谈的都是公网IP。4.路由器能分配子网内的IP地址。
手动管理管理子网内的IP,是一个相当麻烦的事情。所以有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器。
IP地址公有32位,总共的IP地址一共有2的32次方个:42亿9千万。所以IP地址是一种有限的资源。所以各个国家是要竞争IP地址的。有了IP地址也不能胡乱的使用,也需要划分的。过去曾经,提出一种划分网络号和主机号的方案,把所有IP地址分为五类。这种方法叫做分类划分法
如A类网络,共有2的7次方个,而每一个A类网络中可以包含2的24次方个主机。
但是这种方案,随着互联网快速的发展,这种划分的局限性就很快就出来了,大多数的组织都喜欢申请B类网络,导致B类地址很快就分配完了,而A类却浪费了大量地址。不仅仅是A类网络,B类网络的主机号你也不能保证所有的主机号都能用到。所以大量的IP地址都被浪费掉了。
是谁来申请这些ABCDE类网络呢?申请的不是个人,是组织、机构、国家层面,一般都是以运营商为代表,全球运营商去开会,给中国多少个,韩国多少个,这些都是商量出来的。那不是要抢起来吗?背后的逻辑:网络本身是不赚钱的,只有让更多的人接入进来才赚钱,并且网络的愿景就是让更多人使用,如果用的人少了,那我孵化出来的互联网公司赚的就少了,国家从这些公司捞取的钱就变少了,所以网络的内驱力就是让所有人都能用到IP地址。
当年为什么这么分呢?因为当年的网民少,分的方式比较粗犷,然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的IP地址都被浪费掉了。不仅如此,随着互联网的发展,接入的网民越来越多,导致IP地址严重不足。所以就有了新的划分方案。称为CIDR (Classless Interdomain Routing)
引入一个额外的子网掩码 (subnet mask)来区分网络号和主机号。子网掩码也是一个32位的正整数,通常用一串"0"来结尾。将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号。
举个例子
书写简写方式:xxxxxxxxx/yy,xxxxxxxxx是IP地址,yy就是子网掩码,表示:从左往右数一共有yy位1。如122.133.144.155/24。未来我们想调整网络号,就可以调整子网掩码的范围,子网的1越多,可分配的主机数越少,子网的1越少,可分配主机数就越多。
为什么我们平时没有子网掩码划分,只有源ip和目的ip这个感觉呢 ?子网掩码, 包括分类划分法是配置进全球的所有的路由器当中的,对应的报文中只有源ip和目的ip,没有子网掩码。子网掩码在哪呢?子网掩码在你转发时的一个一个的路由器当中。路由器认为你的网络是什么,你的网络就是什么。
特殊的IP地址
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中互相连接的所有主机发送数据包。
127.*的IP地址用于本地环回测试,通常是127.0.0.1
IP地址的数量限制
我们在上面也已经说过了为什么,这里不再赘述。
CIDR在一定程度上缓解了IP地址不够用的问题(提高了IP地址利用率,减少了浪费,但是IP地址的绝对上限并没有增加)仍然不是很够用。这时候有三种方式来解决:
动态分配IP地址 :只给接入网络的设备分配IP地址。你的手机或者电脑,没有连接上家里的wifi时,没有联网的时候,是没有IP的。当你连上的时候,路由器就会给你分配一个叫做局域网IP,就允许你的电脑通过路由器来上网了。所以这叫做动态分配IP地址,当你的电脑不想上网了,你把网线拔了,重启了或关机了,路由器就会识别到你的主机离线了,就会把你的IP地址回收,这就是为什么你在家里面的时候IP地址叫做192.168.214.130在学校图书馆联网的时候,也可能会发现IP地址也是192.168.214.130。也可以理解为共享IP,用的时候我给你,不用的时候还给我。
NAT技术(后面会重点讲)
IPv6:IPv6并不是IPv4的简单升级版。这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位来标识一个IP地址;但是目前IPv6还没有普及。
真正的变革性的技术叫做IPv6,任何时代都有时代的局限性,当年设计网络的人怎么也不会想到2的32次方不够用。就如同当年说操作系统的内存只需要16-64KB就够了。现在有这种IPv6的技术吗?有,还比较成熟,是哪个国家呢?中国!为什么ipv6技术出来了,全球的网络技术还没有切换成ipv6呢?从技术角度是不具备操作性的,因为TCP/IP协议栈是在操作系统内部的,这个代码是硬编码到里面的,不管是linux/Windows/macOS/手机端,你要把技术全部升级成ipv6,软件上你需要把世界上所有的操作系统都换成ipv6,第二个你还需要把全世界的设备都支持成ipv6,比如说中国的路由器支持ipv6,老外的不支持呢?欧洲的,韩国的,日本的目光狭窄,他们的路由器也不支持对应的ipv6,那此时就无法升级,所以从技术角度上这件事难度是很大的。不仅仅也有技术原因,也有其他原因,ipv4是老美做的,ipv6是中国做的,不能让中国怎么怎么样。点到为止。
所以对我们来讲,ipv6技术不可能在全球公网中全部都用,是做不到的,主要原因就是互联网太大了。但是如果我们中国的网络加起来比全球的网络还要大,那么全世界的网络就得听我们的。因为网络的大小现如今是根据人口和一个地区的发展程度来定的,本质上来说是根据他可入网的设备来定。比如说,在非洲,南美地区,巴西,阿根廷,哥伦比亚,那些国家人口也不少,人口也过亿,但经济发展不好,网络基础建设不完善,所以他们的网络并不好。印度14亿人口,虽然入网的人也不少,但和中国的网民比起来还差得远。中国人多,基础建设领先,技术也做的好,所以中国入网的人就特别多。所以话语主导权是谁的,主要还是取决于谁的网络更大,谁能影响更多的网络范围。如果中国的网络发展的非常好,技术持续迭代,我们会有各种各样的物联网设备,路上跑的中国汽车几亿辆,每台汽车上面有终端设备,每一个终端设备都需要独立的控制,物联网一接,就问国外的怕不怕,中国的网民本来就十多亿,人手一部手机,再加上一部笔记本,加上各种各样的物联网设备,算下来一共成百上千亿入网设备,后面的技术发展,对应的配套设施全起来了,我国成为了制造业强国。这个时候呢,所有的设备都能入网了,我们的入网设备直接飙升,入网设备一旦变多,一定会创造出新的经济场景,一定会孵化出新的商业公司,一定会给这个国家更大的税收,因为科学技术在进步,所以生产力你在提高,所以国家的税收,经济就一定会提高。假如自动能给我国每年创造税收1000亿,如物联网设备,在社会层面上,着火了,车祸不存在了,经济每年给国家节省了1000亿,就问美国想不想要,日本想不想要,其它国家想不想要?就看国外的政府你眼不眼红,你们也想要?想要,就把你的网络切成ipv6的。所以网络也要比谁的拳头大谁的拳头小。
所以我们国家已经开始做这件事了,你们可以打开你手机的支付宝,或者京东淘宝,你访问国内的任何一家大型互联网公司,只要有能力自建机房的那种,一年能赚个几千亿的那种,你去看看他们的APP下面都有某某某提供技术服务,支持ipv6技术。那是因为我们国家政府规定所有的互联网公司,在自己组件内网的时候,必须支持ipv6,不仅仅是规定互联网公司,也规定了生产路由器、交换机的公司,必须支持ipv6,包括你家里的路由器也是支持ipv6的。所以我们国家不是没在做ipv6,是在憋大招,包括我们国家在做产业升级,智能制造升级,电动车等等也都支持ipv6技术。这不是某一个领域的问题,是一个系统工程。
运营商的理解
我们是怎么上网的?
在农村的时候要联系工作人员,让工作人员把网线拉到你家里。如果在城市,家里自带有,因为国家在建设城市的时候就规定必须光纤入户。
上网的时候需要两个设备:调制解调器(猫),家用路由器。
你需要交钱给运营商,运营商才会给你上网的账号和密码。路由器构建子网的时候你也可以设置账号和密码。一共有两套密码。在访问网络的时候,你的数据会经过运营商,运营商会判断你的网络是否合法,是否交钱了。
运营商这个角色在每个国家都非常的重要,我们国家所有的互联网应用,公司,是全球第一的,最典型的就是支付宝,移动支付,共享经济,其他地方没有。你现在能用淘宝,能刷抖音,能上京东闲鱼小红书,背后都是各大互联网公司,而这些公司背后有一批很重要的角色,叫做运营商。不要觉得运营商很坏,天天管你要话费,欠了话费不让你打电话,你就特别仇视它,不要这么认为。我们谈一谈他的贡献,我们上网之前有一件非常重要的事,叫做网络基础建设,这是干什么的?在全国范围内去建机房,建基站,拉光纤,建网络基本设施,我们现在有线的机房,无线的基站,全中国内各种各样的信号塔,所有的工作全部都是由运营商做的,为什么现在很偏远的山区里面照样可以用得起4G网络,原因就在这里。
把基站建立到全国各地,私人企业是不会做的,不仅花费的钱多,回报周期还很长,十几年,私人企业能不能活上十几年都是一个问题。其实电信,联通,移动最开始也是不愿意去做的,但是国家政策下来了,加上国家的扶持,让运营商去做。以前的手机流量费是很贵的,运营商已经垄断了,其实是不愿意降低流量费的,也是国家政策,流量费降低,才能有更多的网民,有了更多的网民,就有更多的互联网公司,国家赚的钱就变为了互联网公司的税收,国家就能有更多的建设。
如滴滴打车,滴滴打车其实是抢了出租车的生意,全国各地的出租车是要有牌照的,每个地方每个政府发一张牌照是有收益的,人民群众都去滴滴打车了,没人坐出租车了,政府的牌照就发不出去了,最后牌照也就不值钱了。当地政府其实是不欢迎的,但国家政策让滴滴进来了。如支付宝,移动支付,不仅能存钱,还能支付,可以接入银行系统,银行也不愿意让支付宝进来干扰我的金融稳定,抢我银行的生意,以前跨行转账是要收钱的,一个银行每年能通过跨行转账赚到很多钱,现在支付宝也能干这个事。
从这两个互联网产品上,就能看出我们国家发展互联网的决心。
全球IP的理解
注意:上面图上全是以公网IP为例。
我们上网时都是用的私有IP。公网IP和私有IP有什么关系呢?
私有IP地址和公网IP地址
IP地址被硬性的划分为:公网IP和私有IP
如果一个组织内部组件局域网,IP地址只适用于局域网内的通信,而不直接连接到公网上,理论上使用任何的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址只能用这四类10.x.x.x,前8位是网络号,共16,777,216个地址
172.16.x.x到172.31.x.x,前12位是网络号,共1,048,576个地址
192.168.x.x,前16位是网络号,共65,536个地址。包含在这个范围中的,都称为私有IP,其余的则称为全局IP(公网IP)
如我们linux主机上显示的IP,私有IP
私有IP不能出现在公网中,因为子网中会有大量重复的地址。每一次转发,报文中的源iP会被替换成路由器的WAN口IP,私有IP不断被替换的过程:NAT技术。
NAT技术又是如何让服务器将报文转回到我们主机上的,后面再讲。
公网IP与私有IP的关系图
路由
每一台机器都会维护一个路由表。路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志标识此条目是否有效(可以禁用某些条目),G标志标识此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机直接相连的网络,不必经路由器转发。
路由表可以使用route命令查看
上面路由表不易观察,假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口,一个网络接口连接到192.168.10.0/24网络,另一个网络接口连接到192.168.56.0/24网络。
转发过程例1:如果要发送的数据包的目的地址是192.168.56.3跟第一行的子网掩码做与运算得到192.168.56.0与第一行的目的网络地址不符。
再跟第二行的子网掩码做与运算得到192.168.56.0,与第二行的目的网络地址匹配,因此从eth1接口发送出去。
由于192.168.56.0/24是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
转发过程例2:如果要发送的数据包的目的地址是202.10.1.2依次和路由表前几项进行比对,发现都不匹配。
按缺省路由条目,从eth0接口发出去,发往192.168.10.1路由器。
有192.168.10.1路由器根据它的路由表决定下一跳地址。
IP层分片与组装
实际上,在一台主机中,报文并没有通过网络层直接发出去,而是继续交给了自己的下一层协议(数据链路层)。数据链路层中,不能一次发送过大的报文,所以会要求上层不能交付给我过大的报文 ,最大不能超过MTU(最大传送单元)
所以在网络层,会对超过MTU的数据包进行分片,也能对分片数据进行组装。
IP的分片与组装字段
16位标识:同一主机发送的报文,每个片的id(16位标识)是相同的。
3位标志:第一位不用。第二位为0,表示允许分片。第三位表示结束标记:叫做"更多分片",是最后一片则置为0,不是最后一片则置为1。
13位片偏移:表示当前分配在原报文中处在哪个位置。
问:你怎么知道一个报文是否被分片?如果没有分配,片偏移 = 0,更多分片 = 0。
问:如何确保将分配全部聚到一起?哪个是第一个,哪个是最后一个,有没有收全,有没有丢失?
通过16位标识来区分是否是来自同一台主机。如果是第一个则更多分片为1,片偏移为0。如果是最后一个则更多分片为0,片偏移大于0。当前起始位置(片偏移)+自身长度=下一个报文中填充的偏移量大小,如果和其他的片不匹配,则丢失,如果全都匹配上了则没丢失。
问:哪一个在前,哪一个在后,如何正确的进行组装?
只要按照片偏移进行升序排序即可
问:怎么保证合起来的报文时正确的?
组装完成后会校验和,不正确则会丢弃。
模拟分片过程
分片的影响:一个报文被拆成了多个,任意一个报文丢失,就会造成拼接组装失败,如果是tcp,进而导致对端对整个报文进行重传,如果是udp,则直接丢包。一个包不会丢包概率为99%,若分的越多则不会丢包的概率99%*99% *...,所以分片会增加丢包的概率。
这就是为什么滑动窗口很大,但仍然要被划分为若干个报文段,而不是一整个报文段。TCP的蛋哥数据报的最大消息长度,称为MSS(Max Segment Size)。
TCP在建立连接的过程中,通信双方会进行MSS协商。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
数据链路层
数据链路层实现的是直接相连的主机/路由器之间,进行数据交付的问题,实现的是某一个区间(一跳)内的通信,而IP实现直至最终目标地址的通信(点对点)。
每台主机有一张网卡,路由器有多张网卡,每一张网卡都有一个Mac地址。用ifconfig命令可查看自己的Mac地址
Mac地址的作用:区分在同一个局域网中,区分特定的主机。
以太网帧格式
如何将报头和有效载荷分离的?定长报头
如何做到分用的?类型能区分有效载荷是什么
以太网通信原理
以太网通信:每台主机上都要有唯一一个自己的标识符
给大家举个例子帮助大家理解
老师叫张三,是只有张三自己听到了这句话吗?所有人都会听到(收到),会在大脑里判断老师是不是叫的自己,不是自己就不用执行老师的指令,会抛弃掉这条信息。张三发现是自己,就会和老师搭上话(建立了连接)
以太网同一原理:
Mac地址:每一张网卡都有自己的地址,Mac地址能在局域网中标明自己的唯一性
每个主机收到后,在数据链路层进行判断,发现不是发给自己的就会丢弃,而我们用户只在乎用户层,所以我们用户感觉不到。
站在系统的角度看待,这网络资源也是共享资源,如果有两台机器同时向以太网中发数据则会发送数据碰撞,会发送的碰撞的区域也被叫做碰撞域。那需要我们互斥访问,以太网互斥访问的方式并不是加锁,而是有一套自己的避免碰撞的算法,如果我发送消息发现了会碰撞,则会重新发送
那这样会产生一个问题:主机越多,碰撞的概率越大,这也就解释了一个现象,你家里的wifi有很多人连接后会很卡,在学校的运动会大型会议的时候,数据网络也很卡。
如何解决这个问题呢?交换机能划分碰撞域
交换机发现消息目的地不在左边的区域,则会将消息发送到右边区域。这样一定程度上缓解了数据碰撞问题。
因为有碰撞域,一台主机发送数据的时候,发送数据不能太长,也不能太短,如果太长,发送一个帧的时间必定会增加,则越容易发生碰撞,所以有MTU,不超过1500字节。如果过短,会填充字段,方便数据帧的转发。
ARP协议
数据链路层解决的是直接相连的主机/路由器之间,进行数据交付的问题。我和你通信的时候需要填上你的目的MAC地址(硬件地址),那么问题来了,我第一次和你通信的时候我怎么知道你的MAC地址(硬件地址)是什么?
ARP协议:根据IP,得到目的主机的MAC地址(硬件地址)。
ARP协议是位于MAC帧和网络层之间的层,在OSI模型中,归属到数据链路层,在TCP/IP模型中归属到网络层
原理:
源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填填FF:FF:FF:FF:FF:FF表示广播)
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
ARP数据报的格式
注意到源Mac地址,目的Mac地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其他类型的网络则有可能是必要的。
硬件类型指链路层网络类型,一般固定填1,表示以太网。
协议类型指要转换的地址类型,一般固定写0x0800,表示为IP地址。
硬件地址长度,一般固定填6,表示以太网地址为6字节。
协议地址长度,一般固定填4,表示IP地址为4字节。
op字段为1表示ARP请求,字段为2表示ARP应答。
模拟一次ARP过程:
ARP请求的过程:
ARP应答的过程:
ARP的结果是会被暂时保存起来的。
云服务器的不易观察,用Windows的查看
1.ARP协议的不是每次通信都会进行,只有ARP缓存失效的时候才会重新触发ARP2.我可以通过我的IP和子网掩码,得到我的网络号,然后枚举ping所有在同一网段内主机,就可以得到该网段内所有主机的IP和Mac
ping命令是一种ICMP报文,给目标主机发送一个报文,让目标主机给我应答,是用来检测和某个主机的连通性的。
ARP的结果是会被缓存起来的,缓存是有时间限制的,因为防止有些主机更换网卡,IP地址没变但Mac地址变了。并且如果我收到多次同样的ARP应答,我会以最新的为准。
所以这样会导致一个问题:
从此以后主机A要经过路由器的报文都会推送给主机M,这种情况叫做ARP欺骗。
主机M收到该报文后可以丢弃该报文,这就实现了让定向的让主机A断网的情况。
主机M也可以收到该报文后代替主机A发送给路由器(将你的报文源IP给换掉),路由器应答回来的时候就会将应答报文交给主机M,主机M在交给主机A。此时主机A在请求的时候并不知道主机M的存在,所以主机M就成功的成为了局域网的中间人。不仅仅可以只欺骗主机A成为中间人,也可以欺骗主机A和欺骗路由器,双向欺骗成为中间人
RARP是什么呢?是逆地址解析协议,ARP是用IP得到Mac,如果你用Mac地址得到IP,这就是RARP,RARP是比ARP要快,因为我已经知道你的Mac地址了,所以构建Mac帧,定向的向你问就可以了。
DNS
DNS(Domain Name System)是一整套从域名映射到IP的系统
我们平时在浏览器的url输入框中可以搜索www.baidu.com,会直接跳到百度的首页,www.baidu.com这被称为域名,访问服务器的时候,在技术上我们只需要知道IP地址和端口号就可以了,但在日常生活中,我们使用的是域名,而非IP地址,为什么呢?因为域名容易被用户记住,用IP地址会导致用户的体验变差,浏览器里面内置了这个功能,使域名被解析成IP地址
用ping指令,ping一下百度的域名
可以看到域名被解析成了110.242.68.3,我们也可以用这个IP来访问百度
最初,通过互联网信息中心(SRI------NIC)来管理这个hosts文件如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件,其它计算机也需要定期下载更新新版本的hosts文件才能正常上网。
这样就太麻烦了,于是产生了DNS系统。一个组织的管理结构,维护系统内的每个主机的IP和主机名的对应关系。如果新计算机接入网络,这个信息注册到数据库中,用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称
com:一级域名,表示这是一个企业域名,同级的还有"net"(网络提供商),"org"(非盈利组织)等。
baidu:二级域名,公司名。
www:只是一种习惯用法,之前人民在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来标识主机支持的协议。
ICMP协议
ICMP协议是一个网络层协议。一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。
我们一般写的接口是网络套接字,而系统中也存在原始套接字,原始套接字允许直接绕过传输层直接访问网络层的一套接口。比如说:构建ICMP。ping命令就是用的这种方式
ICMP功能包括:1.确认IP包是否成功到达目标地址。2.通知在发送过程中IP包被丢弃的原因。3.ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。4.ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6。
当网络出现问题了,会有设备对我们的IP报文进行应答。
ICMP大概分为两类报文:1.通知出错原因。2.用于诊断查询
NAT技术
之前我们讨论了,IPv4协议中,IP地址数量不充足的问题。
NAT技术当前解决IP地址不够用的主要手段,是路由器 的一个重要功能。
NAT能够将私有IP对外通信时转为公网IP,也就是一种将私有IP和公网IP互相转换的技术方法。很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置公网IP。
NAT IP转换
对于服务器来说,就是运营商路由器给我发的消息,服务器将数据响应路由器后,路由器怎么知道要将这个数据给哪个主机呢?
NAPT技术
在NAT路由器内部有一张自动生成的,用于地址转换的表,使用IP+Port来建立这个关联关系。
NAT在替换的时候,不仅仅会替换IP,还会替换Port ,替换的Port是什么取决于路由器,是会变的。 有人说网络层还会对端口号进行操作?其实路由器早就不仅仅只工作在网络层了,还能工作在应用层,如路由器能够构建子网,你能连接wifi的过程就是路由器应用层的功能。
所以服务器要给客户端B发送消息,只需要填上IP为202.244.174.37端口号为1026就行了。
所以两台在不同子网的机器是不可能直接通信的
有没有实现的方法呢?
找一台公网IP的机器/服务器,主机A想给主机B发送的消息先发送给服务器,服务器并不提供服务,服务器只转发给主机B。这种技术称为内网穿透。
内网穿透的工具:frap,在github/gitee上面可以找到这个开源项目。在服务器上部署fraps的服务,主机B上使用frapc和服务器建立长连接,只要主机A能找到服务器,就能和主机B通信。
代理服务器
当你连接校园网的时候其实不是直接访问公网,大部分学校,在组网的时候,对于校园网内所有请求,都会转发到学校的服务器,进行认证,认证不仅仅是认证是否合法,还会给你分配IP地址,请求发送给服务器,服务器会替你去访问。
你用ssh协议登录云服务器的时候,可能会登录不上,换上手机热点就可以能登录上了,这是因为学校的服务器对你ssh请求误判拦截了。
比如用学校构建的网站,用校园网看电影的时候,电影的资源也会缓存在学校的服务器上,这样其他人也看这部电影的时候,在内网上就能查看,不用走到公网上了。
这种服务器就叫做代理服务器,因为是替客户端代理的,所以也叫做正向代理。
如果服务器的IP全部暴露让用户去访问,可能会存在一种问题,有些服务器被大量用户访问,而有些服务器很空闲。这种情况叫做负载不均衡。
所以在公司内部,会部署一台服务器,只公开这一台服务器的IP地址,这台服务器不进行业务处理,专门用来接收请求并将这些请求转发到其它处理业务的服务器上,这种服务器也叫做代理服务器,这种服务器主要用来做后端的负载均衡,也叫做反向代理
当我们访问某一个网站的时候,一定会经过运营商设备,当你要访问比如说www.google.com的时候,运营商发现你要访问的域名不对,直接给你拦截了,域名解析工作都不给你做。也会识别IP地址,你要访问的内容是否合法,如果不合法直接拦截,这就是为什么我们不能访问外网的原因。如果想访问呢?
在我们国家有一些特殊的地区,这些机器是能够直接访问外网的,在这些服务器上部署一些类似于我们上面说的服务,我未来访问的请求目的是这些特殊的服务器,再设置一些加密技术,对于运营商来讲,你访问的是合法的,然后特殊服务器代替你去访问,访问后再经过运营商发送回给你。
路由器往往具备NAT设备功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端。那么NAT和代理服务器的区别有哪些呢?
从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体的应用, 比如通过代理服务器进行fanqiang,灵王像迅游这样的加速器,也是代理服务器。
从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层。
从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。