【计算机网络】网络层——IP协议
【计算机网络】网络层——IP协议
目录
一. 基本概念
IP指网络互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模,易构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则。IP只为主机提供一种无连接,不可靠,尽力而为的数据包传输服务
TCP协议提供传输控制,IP协议提供传输服务。TCP协议为传输层协议,其保证可靠性和传输效率,而下层的网络层和数据链路层负责数据在网络中的传输。
双方在进行网络通信时,数据并不是从一方的传输层直接发送到另一方的传输层的,而是需要依次向下交付给网络层和数据链路层,然后发送到网络中;对方主机拿到数据后,也需要依次向上交付解包。如下图
数据自顶向下交付,各协议层添加报头的过程叫做封装;报文自底向上,各协议层移除报头的过程叫做解包
- 网络层的作用就是,将数据从一台主机送到另一台主机,也就是数据的路由
专有名词解释
- 主机:配有IP地址,但不进行路由控制的设备
- 路由器:既配有IP地址,又能进行路由控制、
- 节点:主机和路由器的统称
需要注意的是,现代操作系统的某些特定配置下,也可以使得主机具备一定程度的路由功能。比如支持NAT(网络地址转换),但这并不是主机的主要功能。路由器也可以被称为主机
二. 协议报文格式
- 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字节
IP报头在内核中本质是位段类型,给数据封装报头,实际上就是使用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,便完成了IP报文的封装
解包过程需要回答两个问题:
- IP报头和有效载荷如何分离?
- 有效载荷如何向上交付?
1. IP报头和有效载荷如何分离
方法与TCP一样。在IP报头中,前20字节是固定长度,其中有4位首部长度,根据首部长度就可以知道报头的长度,再根据16位总长度,将报头和有效载荷分离
2. 有效载荷如何向上交付
基于IP协议的传输层协议不止一种,因此IP封装时,需要记录上层协议类型。报头中的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:保留字段
分片与组装
传输层给IP层的数据如果较大,IP层还需要对此进行分片,然后依次交付给下层的数据链路层。这是因为在数据链路层有着MTU——最大传输单元的限制。MTU的讲述可以参看【计算机网络】数据链路层https://blog.csdn.net/m0_72563041/article/details/135192218
数据链路层规定,IP数据包最大的长度为1500字节,这也反向规定了TCP数据段的最大长度——MSS(最大段尺寸),MSS的值会设为MTU减去IP头部和TCP头部的长度,以保证TCP报文段在传输过程中不会被分片。
分片
- 首先,同一个数据包的分片,16位标识(id)是相同的
- 3位标志字段,第三位 “更多分片” 为0代表是分片的最后一个,为1则不是最后一片,可能是起始,也可能是中间
- 13位偏移,指示了该数据包相对于起始数据包的偏移量
举例:将一个4500字节的TCP数据段分片封装,认为IP报文没有选项字段,即固定20字节长度
MTU的1500字节是包括IP报头的,所以有效载荷部分最大为1480字节
相关IP报头字段如下:
- 因为属于同一数据段,所以16位标识相同
- 3位标志字段,第二位为1表示允许分片;第三位为0表示分片的最后一个分片,为1则不是最后一个
- 13位分片偏移是相对于起始分片的偏移量
组装
1. 不同客户端发送的数据包,16位标识可能重复,如何区分?
IP报头中有IP地址,不同客户端IP地址不同
2. 接收端怎么知道是否有分片
- 如果3位标志位的第三位“更多分片”为1,代表是分片中的一片(不是最后一片)
- 片偏移不为0(不是起始分片)
- 片偏移为0,但“更多分片”为1(起始分片)
3. 如何保证分片收齐
- 起始分片:更多分片为1,片偏移为0
- 中间分片:更多分片为1,片偏移大于0
- 结束分片:更多分片为0,片偏移大于0
- 独立数据包(没有分片):更多分片为0,片偏移为0
首先可以保证,起始和结束分片是否收到一定知道;其次中间分片是否收全,IP层需要将所有分片进行排序,然后看每个分片的片偏移是否都等于前一个分片的片偏移+16位总长度
4. 如何组装和确保组装无误
按序排好后,只要分片没有丢失,就可以保证组装成功。如何组装?只要将报头和有效载荷分离,有效载荷依次向上层传输层交付即可
补充:TCP的MSS(Max Segment Size,最大段尺寸)
- TCP的一个数据包也不能无限大,还是受限于MTU。TCP的单个数据包的最大消息长度,称为MSS(Max Segment Size,最大段尺寸)
- TCP在建立连接的过程中,通信双方会进行MSS协商
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然受限于MTU)
- 双方在发送SYN的时候会在TCP报头写入自己能支持的MSS值
- 然后双方得知对方的MSS值后,选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项部分的中(kind=2),详细可以参看 【计算机网络】TCP协议——1.报文格式详解https://blog.csdn.net/m0_72563041/article/details/134991651的选项字段部分
对UDP数据包的分片
- 一旦UDP携带的数据超过1472(1500-20(IP首部)-8(UDP首部)),那么就会在网络层分成多个IP数据包。
- 这多个IP数据包有任意一个丢失,都会引起接收端网络层重组失败,那么这就意味着,如果UDP数据包再网络层被分片,那么整个数据被丢失的概率就大大增加了。而UDP是尽最大努力交付,但不保证可靠性,所以丢包就丢包了
三. 网段划分
IP地址标识网络中唯一一台主机,端口号标识主机中唯一一个进程。所以IP地址+端口号可以表示网络中唯一一台主机的进程
网络通信的实质是,网络中,两个不同主机的进程的通信
端口号在传输层使用,而IP地址在网络层使用
IP地址分为两部分:网络号和主机号
- 网络号:保证相互连接的两个网段(局域网)具有不同的标识
- 主机号:同一网段(局域网),主机之间具有相同的网络号,但必须有不同的主机号
数据在网络传输过程中会遇到一个个的路由器,这些路由器会帮助网络当中的数据进行路由转发,使得网络中的数据慢慢接近目标主机。路由器在帮助数据进行路由转发时,会提取该数据的IP报头当中的目的IP地址,并以此作为数据路由转发的重要依据。
当主机A收到主机B的数据,可能要返回响应或者也要给主机B发送数据,此时双方身份就对掉了,主机B可以根据主机A发送的报文,其中有源IP地址——主机A的IP地址。此时主机B构建的IP报文,源IP是主机B的IP,目的IP是主机A的IP地址
- 不同的子网(局域网),其实就是把网络号相同的主机放到一起
- 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中任何一台主机重复
1. 第一次划分
过去曾经提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图
- A类:0.0.0.0 ~ 127.255.255.255
- B类:128.0.0.0 ~ 191.255.255.255
- C类:192.0.0.0 ~ 223.255.255.255
- D类:224.0.0.0 ~ 239.255.255.255
- E类:240.0.0.0 ~ 247.255.255.255
当要判断一个IP地址属于哪一类时,只需要遍历IP地址的前5个比特位,第几个比特位最先出现0,那么就对应属于哪一类IP地址
主机号越多,代表该网络可容纳的主机数越多
但随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快分配完了,而A类却浪费了大量的地址:
例如,申请一个B类地址,理论上该子网中允许容纳6万5千多台主机
但实际网络架构中,不存在一个子网有这么多主机的情况,因此大量的IP地址都别浪费掉
针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)
2. CIDR方案
在原有的五类网络的基础上继续进行子网划分,需要借用主机号当中的若干位充当网络号
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号
- 子网掩码也是一个32位的正整数,通常用一串“0”来结尾
- 每一个子网都有自己的子网掩码
- 将IP地址和子网掩码进行“按位与”操作,得到的就是网络号
- 网络号和主机号的划分与这个IP地址是A类,B类还是C类无关
下面举两个例子
因为255的比特位为8个1,即全1。任何数与之按位与都为其本身,所以IP地址的前三位不变。最后一位为0,按位与为0。并且不管最后一位数字怎么变,与子网掩码按位与都为0。所以该子网范围为140.252.20.0 ~ 140.252.20.255
240的比特位为1111 0000,即按位与后会保留最后一位的前4个比特位。68的比特位为0100 0100,与240按位与后保留前四位:0100 0000——64
因为最后一位的后4个比特位为主机号,所以最多有16台主机,即从140.252.20.64 ~ 140.252.20.79
可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围
此时一个网络就被更细粒度的划分成一个个更小的子网,通过不断地子网划分,子网中IP地址对应的主机号就越来越短,因此子网中可用的IP地址的个数也越来越少,这就避免了IP地址被浪费的情况
需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的内部再继续进行子网划分
因此一个数据在路由器转发时——路由,随着数据不断路由进入更小的子网,其网络号的位数是不断变化的,准确来说其网络号的位数在不断增加,这就意味着IP地址中的主机号位数不断减少,子网规模不断变小。最终当数据路由到达目的主机所在网络时,就可以在该网络中找到对应的目的主机
IP地址和子网掩码还有一种更简洁的表示方法:例如140.252.20.68/24
这表示该主机的IP为140.252.20.68,子网掩码的高24位为1,也就是255.255.255.0
补充:运营商
运营商其实就是中国电信,移动,联通等等
- 实际网络通信的基础设施建设都是运营商完成的,我们访问服务器并不是直接发送给对应的服务器的,而是需要经过运营商建设的各种基站和各种路由器, 才能最终送达到对应的服务器
- 我们交网费,其实也就是购买入网许可。当我们成功输入联网密码,运营商的路由器会检查是否欠费,没有则正常路由,欠费则不进行数据转发,因此无法上网
也就是说,用户上网的数据首先必须经过运营商相关的网络设备,然后才能发送到互联网公司对应的服务器。网段划分,子网划分等工作都是运营商做的
3. 特殊的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,即主机数最多为
本地环回
本地环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本地环回不会将数据写到网卡上
本地环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常,或者对开发的网络程序进行测试
本地环回的基本原理:
- 当数据到达IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将该数据放到IP输入队列中,然后再由IP输入函数读取上去
- 而IP输入函数将数据读取上去的本应该是链路层交付的数据,因此该数据后续就会被当作从网络中读取上的数据看待,各层协议会对该数据依次进行解包和分用
- 如果不是环回程序,那么接下来就会判断该数据对应的目的IP是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将数据放入到IP输入队列当中,等IP输入函数将其读走
- 只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP协议(后续讲)获取该数据的目的主机的MAC地址(数据链路层)并进行后续数据发送的操作
loopback设备:
四. IP地址不足
IP地址(IPv4)是一个4字节,32位的正整数,因此最多表示的主机数为,将近43亿个。又因为IP地址唯一标识网络中的一台主机,所以要想网络通信,就必须有IP地址。
但全球人口已经有超70亿,更何况不仅电脑,手机等设备,只要是需要上网的,都需要IP地址。由此可见,32位IP地址是远远不够的
因此才提出CIDR的方案,对已经划分好的五类网络继续进行子网划分,其目的就是为了减少IP地址的浪费。
CIDR虽然一定程度上缓解了IP地址不够用的问题,减少了IP地址的浪费,但IP地址的绝对上线并没有增加,即能表示的主机数没有增加。
为此,人们提出了以下几种方式:
- DHCP协议:动态分配IP地址。只给介入网络的设备分配IP地址,因此同一个MAC地址(数据链路层)的设备,每次接入互联网中,得到的IP地址不一定相同,避免了IP地址强绑定与某一台设备。MAC地址是一个48位的地址,每一个网卡至少配备一个MAC地址。后续数据链路层再详细讲解
- NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效的避免来自网络外部的攻击,隐藏并保护网络内部的计算机
- IPv6:IPv6用16字节,128bits来表示IP地址,从根本上缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级,两者是互不相干的两个协议,彼此并不兼容。目前IPv6在公网还没有普及,但在我国的内网内,基本都已经支持IPv6
1. 私有IP和公网IP
如果一个组织内部组建局域网,IP只用于局域网内部的通信,而不直接连到Internet上,理论上,使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
- 10.0.0.0 :前8位是网络号,共16,777,216个地址
- 172.16.0.0 ~ 172.31.255.255 :前12位为网络号,共1,048,576个地址
- 192.168.0.0 :前16位为网络号,共65,536个地址
包含在这个范围内的,都称为私有IP,只在子网(局域网)是使用,其余被称为公网IP(或全局IP)
在Linux中,可以使用ifconfig查看网络信息,第一段的eth0代表这台主机的网络接口,第二段的lo(loop)代表本地环回。可以看到,私有IP为10.0.12.11
在Windows下,可以先Win+r,输入cmd打开命令行控制器,使用ipconfig命令查看网络信息
可以看到已经支持IPv6协议
2. DHCP协议
手动管理IP地址是非常麻烦的,当子网中新增主机时需要给其分配IP地址,当子网当中有主机断开网络时,又需要将其IP地址回收,便于后续给新增主机分配
- 因此,对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)协议
- DHCP通常被应用在大型的局域网中,其主要作用就是集中管理地址,分配IP地址,使网络环境中的主机动态的获得IP地址,Gateway地址,DNS服务器地址等信息,并能够提高地址的使用率
- DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器
举例:
比如家里面的局域网的网络号为:192.168.2.
可用的IP地址就是192.168.2.0 ~ 192.168.2.255;一般规定.0和.255是不用的;路由器一般为局域网中的第一台主机,即192.168.2.1
DHCP的作用就是,当你的手机和你的电脑连网时,按顺序分配IP地址,如果早上你的手机先连,那么手机的IP地址为192.168.2.2,电脑为192.168.2.3;中午手机和电脑都断了网,下午电脑比手机先连,那么电脑的IP为192.168.2.2,手机为192.168.2.3。这就是动态地址分配——DHCP
3. 路由器
路由器是连接两个或多个网络的硬件设备,路由器上有两种网络接口,分别是LAN口和WAN口:
- LAN口(Local Area Network):表示连接本地网络的端口,主要用于家庭网络中的交换机,集线器或PC相连
- WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网
我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP
我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:
4. NAT技术
NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个主要功能
- 一个路由器可以配置两类IP地址,一个是WAN口IP,一个是LAN口IP
- 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
- 不同的路由器,子网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转换表中。
NAT IP转换过程
- NAT路由器将源地址10.0.0.10替换成全局的IP 202.244.174.37
- 在NAT路由器内部,会维护IP地址+端口号转换的表——NAPT转换表
- NAT路由器收到外部的数据,会根据NAPT转换表,把目标IP从202.244.174.37替换成10.0.0.10
- 当10.0.0.10第一次向163.221.120.9发送数据时就会产生NAPT转换表中的映射关系
当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(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穿透)
NAT技术保证内网主机的安全性
NAT技术不仅极大程度缓解了IP地址不足的问题(甚至解决了),还保证了局域网主机的安全性。如果想从外网访问内网主机,如果内网主机没有对该外网IP进行过数据通信,那么NAT路由器的NAPT转换表中没有响应的映射关系,即使外网主机将数据发送给NAT路由器,NAT路由器也不会将该数据转发给局域网主机,因为NAPT转换表没找到映射关系
但这并不代表无法从外网访问内网主机。从外网访问内网主机的方式就是内网穿透(NAT穿透)
内网穿透是一种网络技术,内网穿透通常用于实现两个不同局域网之间的通信,或者公网向内网的通信。当两个局域网之间由于网络隔离或安全限制而无法直接通信时,可以使用内网穿透技术来建立一条安全的通道,使得两个局域网中的设备可以相互访问和通信。
常见的内网穿透技术包括端口映射、反向代理和虚拟专用网络(VPN)等。
-
端口映射:通过在路由器或防火墙上设置端口映射规则,将公网上的某个端口映射到私有网络中的设备,从而实现对该设备的访问。
-
反向代理:在公网上搭建一个反向代理服务器,当公网用户请求访问时,反向代理服务器会将请求转发到内网中的目标设备上,并将响应返回给公网用户。
-
虚拟私人网络(VPN):通过建立加密隧道,将公网用户连接到私有网络中,使得公网用户可以像在内网中一样访问内网设备或服务。
-
第三方工具:一些第三方工具提供了方便的内网穿透功能,例如ngrok,frp等。这些工具通过建立安全的通道,将公网请求转发到内网服务
这些技术都可以实现内网穿透,但具体选择哪种方式取决于实际需求和网络环境。需要注意的是,在使用内网穿透技术时应确保网络安全,采取适当的安全措施来保护内网设备和数据的安全性。
5. 代理服务器
代理服务器(Proxy Server)是一种网络服务器,他充当客户端与目标服务器之间的中间人,处理客户端对目标服务器的请求。客户端向代理服务器发送请求,代理服务器将请求转发给目标服务器,并将目标服务器的响应返回给客户端。通过使用代理服务器,客户端可以隐藏其真实IP地址,并且可以提高网络访问速度和安全性。代理服务器还可以使用过滤网络流量,防止恶意攻击和访问受限内容等
代理服务器有两种类型:正向代理和反向代理
- 正向代理(Forward Proxy):位于客户和目标服务器之间,代表客户端向目标服务器发送请求。当客户端想要访问互联网上的资源时,它会将请求发送给正向代理服务器,然后由代理服务器转发请求并将响应返回客户端。在这种情况下,目标服务器不知道请求的真实来源是客户端,只知道请求来源于代理服务器
- 反向代理(Reverse Proxy):位于目标服务器和客户端之间,代表目标服务器向客户端提供服务。当客户端想要访问某个服务时,它发送请求到反向代理服务器,然后由代理服务器将请求转发给后端的目标服务器,并将响应返回给客户端。对于客户端来说,它只知道请求和响应来自于反向代理服务器,而不知道真正提供服务的是哪个目标服务器
正向代理我们讲述两个例子(该部分知识仅用于学习,了解网络知识):
1. 访问外网(翻墙)
网络世界鱼龙混杂,信息难辨真假,更何况是有目的,有预谋的信息。所以国家或地区可能或限制访问某些网站或应用程序,或者只允许这些网站或应用程序被特定的IP地址访问。
那非特定IP地址的主机就无法访问这些网站了吗?其实不然,可以在特定IP地址的主机上搭建正向代理服务器,将要访问的网站交给这些特定IP地址的主机的正向代理,由他们代替请求网站,然后将响应返回给我们。这就是翻墙的原理
2. 游戏加速器
当我们游戏卡顿,可以使用游戏加速器。游戏加速器是一种网络工具,它通过建立代理服务器与游戏服务器之间的连接,优化游戏网络传输,从而提供更好的游戏体验。当玩家使用游戏加速器时,其游戏数据流量会经过代理服务器进行中转,隐藏了真实的网络信息,同时可以通过加速和优化技术提高网络连接的稳定性和速度
反向代理
反向代理的一个常见例子是负载均衡。当一个网站或应用程序需要处理大量的请求时,可以设置反向代理服务器来分发这些请求到多个后端服务器,从而实现负载均衡。
举个例子:
假设有一个高流量的电子商务网站,为了提高性能和可靠性,可以部署多台后端服务器来处理用户的请求。但是,直接将所有请求发送到一台特定的额服务器上可能导致该服务器过载,影响网站的响应速度。
在这种情况下,可以设置一个反向代理服务器作为中间层,当用户发送请求时,请求首先到达反向代理服务器。反向代理服务器根据一定的算法(如轮询,最小连接数等)将请求转发给后端服务器集群的一台空闲服务器上进行处理,并将响应返回给用户。这样反向代理服务器可以平衡负载,提高网站的性能和可用性。
另外,反向代理还可以用于缓存静态内容,减轻后端服务器的压力,以及提供安全性,隐藏后端服务器的真实IP地址等
五. 路由转发
上面说到,路由器是集连多个子网的设备,子网内的主机如果要访问公网的服务器,其数据需要路由器转发到公网。这就是路由转发
数据在路由过程中,实际是一跳一跳的(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间
IP数据包的传输过程:
- 当IP数据包,到达路由器时,路由器会先查看目的IP
- 路由器决定这个数据包是能够直接发送给目标主机,还是需要发给下一个路由器
- 依次反复,一直到达目的IP地址
- 如何判定当前数据包要发送到哪个子网呢?这个依靠每个节点内部维护的路由表
路由器的查找结果可能有以下三种:
- 路由器经过路由表查询后,得知该数据应该跳到哪一个子网
- 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
- 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。
Linux路由表可以使用route命令查看;Windows下使用route PRINT -4
route PRINT -4
route命令
- Destination:代表的是目的网络地址
- Gateway:代表下一跳地址
- Genmask:代表的是子网掩码
- Flags:U标志表示此条目有效(可以禁用某些条目);G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络是与本机接口直接相连的网络,不必经由路由器转发
- Iface:代表的是发送接口
当一个数据包从源设备发送出去时,它首先会通过源设备的网卡发送到本地网段。然后,根据目标 IP 地址,源设备的操作系统会查找路由表来确定下一跳的路由器。路由表中记录了网络的目的地址和相应的下一跳路由器。根据目的地址,源设备会将数据包发送给下一跳路由器。
下一跳路由器接收到数据包后,会根据自己的路由表,依次与子网掩码Genmask进行按位与操作,然后结果与子网掩码对应的目的网络地址Destination进行对比,如果匹配则将数据发送到这个子网,通过对应的发送接口Iface发出。这个过程会一直持续,直到数据包到达目标设备所在的网络,并被目标设备接收。如果没有匹配的子网,就会发送到默认路由——default,其对应的Flags是UG
路由转发过程中,路由器会根据目标地址进行决策,选择最佳路径来转发数据包。路由器之间通过路由协议来交换路由信息,更新各自的路由表,以保证网络中的路由信息能够得到更新和同步。
通过路由转发机制,网络中的数据包可以在不同的网络之间进行传输,实现了跨网络的通信和互联互通。
举例
假设某主机上的网络接口配置和路由表如下:
- 这台主机有两个网络接口,一个网络接口连到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 地址:路由器检查数据包的目标 IP 地址,以确定下一步的路由决策。
-
查找路由表:路由器查询自己的路由表,路由表是存储在路由器内部的一个表格,记录了目标网络地址和相应的出接口之间的映射关系。
-
路由决策:根据路由表的信息,路由器选择一个最佳的出接口来转发数据包。这个决策可能基于多种因素,例如目标网络的距离、接口的负载情况或者其他策略。
-
封装数据包:路由器将数据包重新封装,更新源和目标的 MAC 地址,并将其发送到下一跳路由器或目标主机。
-
转发数据包:路由器将封装好的数据包通过选定的出接口发送出去。这可能涉及到数据链路层的处理,例如将 IP 数据包封装为适当的链路层帧。
-
循环直至目标:如果目标主机不在直接连通的网络上,路由器将重复上述过程,将数据包发送到下一跳路由器,直到数据包到达目标主机为止。
总之,路由器使用路由表和路由算法来决定如何转发数据包。它根据目标 IP 地址选择最佳的出接口,并封装数据包并转发到下一跳路由器或目标主机。这个过程在整个网络中重复进行,直到数据包到达目标位置。
路由表生成算法
路由可分为静态路由和动态路由:
- 静态路由:是指由网络管理员手工配置路由信息。
- 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。
路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。
六. ICMP
1. 基本概念
ICMP,全称是Internet Control Message Protocol,即互联网控制报文协议,所谓控制,就是通过下发指令来感知和控制网络环境,所以它一定是配合一个无法感知网络环境的协议来工作的,这个协议就是IP协议(包括IPv4和IPv6)。ICMP的作用可以确认IP数据包是否成功到达目标主机;通知在发送过程中数据包被丢弃的原因。
所以,ICMP通常被认为是IP协议的一部分,它封装在IP层中,使用IP协议进行传输。因此,严格来说,ICMP既不是一个网络层协议,也不是一个传输层协议,而是介于两者之间的一个协议。
它的主要功能是传输网络诊断信息,信息主要包括两类:
- 查询类报文:主要用于信息的查询和采集,比如采集传输路径上的每个路由器都是谁,本次传输的报文是否到达目的主机等等。
- 差错诊断类报文:主要用于诊断网络故障,比如传输报文被丢弃的原因是什么等等
2. ICMP的发源
IP协议是一个不可靠协议,如果IP数据包在传输过程中出现错误,如检验和错误,拥塞,超时等,IP数据包是会被直接丢弃的,然后就没有后续了
这是IP协议的一个设计准则决定的,也就是best effort,尽力而为,这样的好处是让IP协议尽量保持简单的形态,只负责有效率的数据传输,而更多的可靠性保证交给上层协议实现(如TCP)
但并不是所有上层协议都保证可靠性,所以需要有协议辅助IP完成必要的网络质量管理。ICMP协议的缘由就是这样
当IP数据包出现错误时,上层发送IP数据包的主机或路由器并不知下层发生了错误,这个时候下层的主机或路由器就可以通过发送ICMP数据包,将错误信息汇报给上层,从而让上层的主机或路由器进行调整。ICMP仅只能提供某些特定类型的错误信息汇报,并不能帮助IP协议成为可靠的协议,不过虽然错误信息有限,但用于基本的网络质量管理足够了
ICMP更详细的讲解可以参看ICMP 协议详解
3. ICMP的应用
ping命令
ping命令 主要查询某个网络节点的连通性,如果出现网络不联通的情况,具体是什么问题,会返回ICMP应答报文,其中附带相关的差错信息予以告知。比如网络不可达(Network Unreacheable),主机不可达(Host Unreachable)等等,然后用户就可以根据这些信息分析具体是哪个环节出现问题
补充:TTL(Time to live)
TTL是指数据包在网络中允许被路由器转发的最大次数或时间。TTL的作用是防止数据包在网络中无限循环,以及确保数据包不会永远存在于网络中
每个经过路由器的数据包,其TTL都会减1,直到TTL值为0,路由器会丢弃该数据包并发送ICMP时间超时信息给数据包的源地址
TTL初始值通常是一个固定的数字,在Windows中通常为128或255,Linux中为64或255
我们使用ping命令检测访问www.baidu.com的连通性
ping命令实质是一个程序,一个进程。最开始会设置一个TTL=1,以此发送数据包,然后逐步增加初始TTL,直到刚好可以访问到目的主机。
需要注意的是,ping命令是越过传输层协议的,所以ping命令并没有对应的端口号
详细用法可以参看:指令笔记(本人不太常用)https://blog.csdn.net/m0_72563041/article/details/132606607
traceroute命令
traceroute(跟踪路由)是一种网络诊断工具,用于确定数据包从源主机到目标主机所经过的路由路径。它通过发送一系列的UDP数据包,并在每个跃点上记录返回时间,从而帮助确定数据包在网络中的传输情况。能够打印出可执行程序主机,一直到目标主机之前经历多少路由器
详细用法可以参看:指令笔记(本人不太常用)https://blog.csdn.net/m0_72563041/article/details/132606607
结束语
本篇博客到此结束,感谢看到此处。
欢迎大家纠错和补充
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
更多推荐
所有评论(0)