精华内容
下载资源
问答
  • IP地址基础知识

    2021-06-20 19:16:23
    文章目录1.IP的基本概念2.IP协议头部格式3.IP报文分片与重组4.IP地址基础知识4.1IP地址的构成4.2IP地址的分类4.2.1早期分类4.2.2子网掩码和CIDR4.3私有IP地址4.4特殊IP地址4.5路由选择 1.IP的基本概念 HTTP解决的...

    1.IP的基本概念

    HTTP解决的问题:构建与解析请求和响应(对应的操作是read和write)

    tcp解决的问题:数据的可靠性,效率,什么时候发送,每次发送多少(具体办事还是得看下两层)

    IP解决的问题:端到端,将数据经过路由选择,发送到对方主机的过程由IP层负责(可能经过多个IP)
    数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使是在不同的数据链路上也能实现两端节点之间的数据包传输
    在这里插入图片描述

    主机:配有IP地址,但是不进行路由控制的设备

    路由器:即配有IP地址,又能进行路由控制

    节点:主机和路由器的统称

    2.IP协议头部格式

    image-20210613154438690

    4位版本号: 指定IP协议的版本,对于IPV4来说,就是4(通常是4,ipv4和ipv6不兼容)

    4位首部长度: 表示IP协议的头部长度是多少个32bit(4字节),4位能表示的最大数为15,即首部长度最大为60字节(和TCP类似)

    8位服务类型: 前面三个比特位表示优先权,已经弃用了。后面4位TOS字段, 和1位保留字段(必须置为0).

    4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个为侧重点. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.

    8位协议: 标识传输层使用什么协议,在数据分用的时候,通过该字段决定将有效载荷交给谁(将数据交给响应的协议)

    16位总长度: 标识IP数据包的整体长度。

    将首部长度读上来,总长度 - 首部长度就是有效载荷长度(分离报头与有效载荷)

    16位标识: 表示当前UDP数据包分片是属于哪一个完整的UDP报文,同一个UDP数据包当中的所有分片具有相同的标识

    在这里插入图片描述

    3位标志:由3比特构成,表示包被分片的相关信息。每一位的具体含义请参考下表。

    在这里插入图片描述

    13位片偏移: 用来标识分片在原来数据之中的位置,用于接收方进行组装

    由13比特构成,用来标识被分片的每一个分段相对于原始数据的位置。第一个分片对应的值为0。由于FO域占13位,因此最多可以表示8192(=2 13 )个相对位置。单位为8字节,因此最大可表示原始数据8×8192=65536字节的位置 ->UDP最大长度就是2^16字节,因此可以表示UDP的每一个位置

    8位生存时间(Time To Live TTL): 数据在传输过程中,允许经过的路由器的个数(TTL也叫跳数)

    TCP只会存在于发送端和接收端,网络之中只能看到IP报文。

    每经过一个路由器,TTL–; 硬件也有BUG,可能导致循环路由,这样网络中就会存在大量的废弃的游离报文,TTL解决了这些游离报文问题(TTL为0,数据包被丢弃)

    16位首部校验和: 使用CRC进行检验,来鉴别头部是否损坏(数据的可靠性是由TCP保证的,所以IP只进行头部的鉴定,不会对数据进行鉴定)

    32位源/目的IP地址: 表示发送端和接收端,一般在网络之中是不会改变的
    路由查找的基本过程,是先找到目标网络,然后进行报文转发,再找到目标主机,应该根据目的IP进行路由(比如去故宫玩,首先先去北京)

    3.IP报文分片与重组

    在这里插入图片描述
    在这里插入图片描述
    注意事项:
    1.每个切片都带有一个ip的头部 -> 比如大小为3000字节的UDP数据包,需要分成三个片进行运输,这是因为有两个20字节的IP头部
    2.同一个分片的16位标识都相同
    3.在进行重组的时候,通过标志位是否是0,来表示是否重组完成了
    4.重组的时候判断数据是否丢失:将偏移量进行排序,然后通过ip报头读取当前的数据长度,当前的偏移量+数据长度 = 下一个数据包的起始位置,如果不是,则表示丢包发生了,一旦丢失一个分片,则整个数据包都被丢弃
    5.通过偏移量和最后的标志位判断是否进行了分片,如果这个数据包分片了,那么除了第一个其余的偏移量都不相同,第一个的最后的标志位肯定不为0

    4.IP地址基础知识

    4.1IP地址的构成

    IP地址由“网络标识(网络号、网段)” 和"主机标识(主机号、主机地址)"两部分组成

    192.168.128.10/24中的“/24”表示从第1位开始到多少位属于网络标识。在这个例子中,192.168.128之前的都是该IP的网络地址

    网络标识在数据链路的每个段配置不同的值。网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络地址。IP地址的“主机标识”则不允许在同一个网段内重复出现
    在这里插入图片描述

    由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的IP地址都不会相互重叠

    IP包被转发到途中某个路由器时,正是利用目标IP地址的网络标识进行路由。因为即使不看主机标识,只要一见到网络标识就能判断出是否为该网段内的主机
    在这里插入图片描述

    4.2IP地址的分类

    4.2.1早期分类

    早期IP地址分为四个级别,分别为A类、B类、C类、D类(还有一个一直未使用的E类。) 。它根据IP地址中从第1位到第4位的比特位对其网络标识(标识一个子网络,代表了一堆的ip地址)和主机标识进行区分。
    在这里插入图片描述

    在分配IP地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为0或全部为1。
    因为全部为0,只有表示对应的网络地址或IP地址不可获知的情况下才使用。而全部为1的主机地址通常作为广播地址。

    因此,在分配过程中,应该去掉这两种情况。这也是为什么C类地址每个网段最多只能有254(2^8-2=254)个主机地址的原因。

    4.2.2子网掩码和CIDR

    CIDR是什么

    网络标识相同的计算机必须同属于同一个链路。例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。因此,这种网络结构实际上是不存在的

    上述这种直接使用A类或者B类地址的情况,会造成大量的IP被浪费,IP的总数量才2^32,因此,资源形式非常严峻(已经枯竭了),为此需要开发一种新的组合来减少这种浪费 -> 人们开始放弃IP地址的分类作为网络地址,采用用任意长度分割IP地址的网络标识和主机标识。这种方式叫做CIDR

    在这里插入图片描述

    子网掩码是什么:

    上面说到,CIDR采用任意长度分割IP地址的网络标识和主机标识,因此引入子网掩码来进行分割

    现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是由一个叫做“子网掩码”的识别码通过子网网络地址细分出比A类、B类、C类更小粒度的网络。这种方式实际上就是将原来A类、B类、C类等分类中的主机地址,部分用作子网地址,可以将原网络分为多个物理网络的一种机制 -> 由固定的网络标识长度,变成了根据新规则进行划分子网(一批网络标识相同的IP地址,就叫做子网)

    子网掩码也是一个32位的数字,它对应的IP地址网络标识部分全为1,对应的IP地址主机表示部分全为0

    自从引入子网掩码后,一个IP地址有了两种识别码,一种是IP地址本身,另外一种是表示网络部分的子网掩码

    因此有:主机号全0,表示的就是网络号,主机号全1,表示的就是广播号地址
    最大主机号=子网掩码的反码
    网络号=子网掩码 & ip地址

    以172.20.100.52的前26位是网络地址的情况为例,以下是其中一种表示方法,它将IP地址与子网掩码的地址分别用两行来表示
    在这里插入图片描述
    另一种表示方式如下所示。它在每个IP地址后面追加网络地址的位数(这种方式也叫“后缀”表示法。) 用“/”隔开。
    在这里插入图片描述
    不难看出,在第二种方式下记述网络地址时可以省略后面的“0”。例如172.20.0.0/16跟172.20/16其实是一个意思(网络标识部分全1,主机号部分全0)

    场景模拟:
    一个网络之中,当前的网络号为 127.16.99.0,子网掩码为255.255.255.0,现在需要将网络平均划分为4个子网,求每一个子网当中ip地址的范围,以及子网掩码
    在这里插入图片描述

    VLSM:
    CIDR被应用到互联网的初期,网络内部采用固定长度的子网掩码机制。也就是说,当子网掩码的长度被设置为/25以后,域内所有的子网掩码都得使用同样的长度。然而,有些部门可能有500台主机,另一些部门可能只有50台主机。如果全部采用统一标准,就难以架构一个高效的网络结构。为此人们提出组织内要使用可变长度的、高效的IP地址分配方式。

    于是产生了一种可以随机修改组织内各个部门的子网掩码长度的机制——VLSM(可变长子网掩码)

    4.3私有IP地址

    即是有了上述的CIDR技术,也只是提高了IP地址的利用率,无法改变IP地址缺少的现实,于是需要使用其他的办法,缓解IP地址资源紧张的办法,其中一种就是私有IP地址

    它不要求为每一台主机或路由器分配一个固定的IP地址,而是在必要的时候只为相应数量的设备分配唯一的IP地址。尤其对于那些没有连接互联网的独立网络中的主机,只要保证在这个网络内地址唯一,可以不用考虑互联网即可配置相应的IP地址

    在这里插入图片描述

    4.4特殊IP地址

    127.0.0.1 本地回环地址,用来测试网络协议栈

    0.0.0.0 一般用于服务端程序,用来表示服务器程序当中所有网卡的IP地址

    255.255.255.255:UDP的广播地址,全网广播,DHCP

    主机号全为0,表示子网,网络标识

    主机号全为1,表示子网,广播号

    4.5路由选择

    发送数据包时所使用的地址是网络层的地址,即IP地址。然而仅仅有IP地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表(Routing Table)。实现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,网络地址转换,属于网络层的协议)
    在这里插入图片描述

    子网掩码
    网关
    子网

    展开全文
  • 我们在使用程序进行网络数据传输的时候需要遵循的网络协议(TCP/IP)。 1.OSI模型和TCP模型的对比 2.三次握手四次挥手 TCP协议的数据交互流程 发送请求,我想连接你 允许客户端连接 发送数据给服务端 关闭连接的...

    网络编程

    网络编程:借助网络,自己编写应用程序,数据交互或者信息交流
    网站编程: 是借助浏览器来实现与现有的服务器之间交互

    一.网络通信协议

    • 我们在使用程序进行网络数据传输的时候需要遵循的网络协议(TCP/IP)。

    1.OSI模型和TCP模型的对比

    在这里插入图片描述

    2.三次握手四次挥手

    TCP协议的数据交互流程

    • 发送请求,我想连接你
    • 允许客户端连接
    • 发送数据给服务端
      在这里插入图片描述

    关闭连接的操作

    • TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
    • 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
    • 服务器关闭客户端的连接,发送一个FIN给客户端。
    • 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
      在这里插入图片描述

    二.IP地址的表示

    • InetAddress
      在这里插入图片描述

    1.常用方法

    1. byte[]
      getAddress() 返回此 InetAddress 对象的原始 IP 地址。
    2. static InetAddress[]
      getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
    3. static InetAddress
      getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。
    4. static InetAddress
      getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。
    5. static InetAddress
      getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
    6. String
      getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
    7. String
      getHostName() 获取此 IP 地址的主机名。
    8. static InetAddress
      getLocalHost() 返回本地主机。
    public class IpDemo {
    	public static void main(String[] args) throws UnknownHostException {
    		//获取IP地址,本机IP地址,网络地址
    		InetAddress localHost = InetAddress.getLocalHost();
    		System.out.println(localHost);//DESKTOP-4GUP2FO/192.168.137.1
    		System.out.println("ip地址"+localHost.getHostAddress());//ip地址192.168.137.1
    		System.out.println("主机名字"+localHost.getHostName());//主机名字DESKTOP-4GUP2FO
    		System.out.println("========================");
    		//外网的话一定要联网,数可以是ip地址,也可以是域名
    		InetAddress taobao = InetAddress.getByName("www.taobao.com");
    		System.out.println(taobao);//www.taobao.com/118.123.2.248
    		System.out.println("ip地址"+taobao.getHostAddress());//ip地址118.123.2.248
    		System.out.println("主机名字"+taobao.getHostName());//主机名字www.taobao.com
    	}
    }
    
    • dos获取指定域名的ip信息
      在这里插入图片描述

    三.UDP协议

    • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.
      具体使用 :
    • DatagramPacket表示存放数据的数据报,DatagramSocket表示接受或发送数据报的套接字

    1.构造方法

    只放数据

    1. DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。

    目标对象和数据

    1. DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
    2. DatagramPacket(byte[] buf, int offset, int length) 构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
    3. DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
    4. DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
    5. DatagramPacket(byte[] buf, int length, SocketAddress address) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

    2.常用方法

    1. InetAddress
      getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
    2. byte[]
      getData() 返回数据缓冲区。
    3. int
      getLength() 返回将要发送或接收到的数据的长度。
    4. int
      getOffset() 返回将要发送或接收到的数据的偏移量。
    5. int
      getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
    6. SocketAddress
      getSocketAddress() 获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
    7. void
      setAddress(InetAddress iaddr) 设置要将此数据报发往的那台机器的 IP 地址。
    8. void
      setData(byte[] buf) 为此包设置数据缓冲区。
    9. void
      setData(byte[] buf, int offset, int length) 为此包设置数据缓冲区。
    10. void
      setLength(int length) 为此包设置长度。
    11. void
      setPort(int iport) 设置要将此数据报发往的远程主机上的端口号。
    12. void
      setSocketAddress(SocketAddress address) 设置要将此数据报发往的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。

    3.DatagramSocket

    3.1DatagramSocket构造方法

    1. DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
    2. protected DatagramSocket(DatagramSocketImpl impl) 创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
    3. DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
    4. DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
    5. DatagramSocket(SocketAddress bindaddr) 创建数据报套接字,将其绑定到指定的本地套接字地址。

    3.2DatagramSocket常用方法

    • 都需要从DatagramPacket获取数据或者发送.
    1. void
      receive(DatagramPacket p) 从此套接字接收数据报包。
    2. void
      send(DatagramPacket p) 从此套接字发送数据报包。
      在这里插入图片描述

    发送端

    • 创建datagramsocket
    • 创建datagrampacket
    • datagramsocket 发送 datagrampacket

    Client.java

    public class Client {
    	public static void main(String[] args) throws IOException {
    		//创建DatagramSocket
    		DatagramSocket datagramSocket=new DatagramSocket();
    		//键盘输入
    		System.out.println("请输入要发送的数据:");
    		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    		String mess = br.readLine();
    		byte [] bytes=mess.getBytes();
    		//创建datagrampacket,将发送的内容保存就进去
    		DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);
    		datagramPacket.setAddress(InetAddress.getByName("127.0.0.1"));
    		datagramPacket.setPort(8989);
    		//datagramsocket发送datagrampacket
    		datagramSocket.send(datagramPacket);
    		System.out.println("数据发送成功");
    	}
    }
    
    

    接收端

    • 创建datagramsocket
    • 创建datagrampacket
    • datagramsocket 接收数据 保存到datagrampacket
    • 将信息打印出来datagrampacket

    Server.java

    public class Server {
    	public static void main(String[] args) throws IOException {
    		System.out.println("接收端已经启动等待接收数据");
    		//创建datagramsocket,该接收端的ip地址是本地ip
    		DatagramSocket datagramSocket=new DatagramSocket(8989);
    		//创建datagrampacket
    		byte[] bytes=new byte[100];
    		DatagramPacket datagramPack=new DatagramPacket(bytes,100);
    		//datagramsocket接收数据,保存到datagrampacket
    		datagramSocket.receive(datagramPack);//程序会进入到阻塞状态
    		//将信息打印出来datagrampacket
    		System.out.println("接收到的信息是"+new String(bytes));
    		System.out.println("发送者的IP地址:"+datagramPack.getAddress());
    		System.out.println("发送者的port地址是"+datagramPack.getPort());
    		//获取发送来的数据
    		byte[] data=datagramPack.getData();
    		
    	}
    }
    
    

    四.TCP协议

    • TCP在使用的时候,必须先启动服务端,才可以使用客户端.

    • TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输(打电话).

    1.服务端ServerSocket的构造方法(设置端口号)

    1. ServerSocket() 创建非绑定服务器套接字。
    2. ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
    3. ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
    4. ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

    2.Socket

    2.1Socket的构造方法

    1. Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字
    2. Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

    2.2常用方法

    Socket
    accept() 侦听并接受到此套接字的连接。

    客户端

    • 创建socket,指定目标主机,端口号.
    • 创建输出流.
    • 将数据通过输出流,发送给服务端.
    • 刷新资源.

    Client .java

    public class Client {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    		System.out.println("请输入你要发送的内容");
    		//发送的内容
    		String message = br.readLine();
    		//创建客户端socket
    		Socket socket=new Socket(InetAddress.getByName("192.168.1.241"),12306);
    		//创建输出流
    		OutputStream out = socket.getOutputStream();
    		out.write(message.getBytes());
    		out.flush();
    		out.close();
    		System.out.println("发送成功");
    		
    	}
    }
    
    

    服务端

    • 创建serversocket,设置端口号,设置ip地址,不设置为本机.
    • 获取socket,accept()服务端阻塞.
    • 通过socket,获取input流.
    • 从input流中,获取客户端发送来得数据 .

    Server .java

    public class Server {
    	public static void main(String[] args) throws IOException {
    		//创建ServerSocket服务器,设置端口号,设置ip地址
    		ServerSocket server=new ServerSocket(12306);
    		System.out.println("服务器已经启动");
    		while(true) {
    			//监听客户端的操作,得到socket对象
    			Socket socket=server.accept();
    			//得到客户端信息
    			InetAddress inetAddress = socket.getInetAddress();
    			System.out.println("ip地址"+inetAddress.getHostAddress()+"端口号"+socket.getLocalPort());
    			//创建输入流
    			InputStream inputStream = socket.getInputStream();
    			byte [] bytes=new byte[inputStream.available()];
    			inputStream.read(bytes);
    			System.out.println("发来的信息是:"+new String(bytes));
    			inputStream.close();
    		}
    	}
    }
    
    展开全文
  • IP协议和IP地址

    2021-04-26 20:38:33
    1、IP协议 网络之间的互连协议( Internet Protocol,IP)是方便计算机网路系统之间相互通信的协议,是各大厂家循的计算机网络相互通信的规则、如图4-1-1所示给出了IP数据报头( Packet Header) 结构,有些书称为IP数据...

    1、IP协议

    网络之间的互连协议( Internet Protocol,IP)是方便计算机网路系统之间相互通信的协议,是各大厂家循的计算机网络相互通信的规则、如图4-1-1所示给出了IP数据报头( Packet Header)
    结构,有些书称为IP数据报头。

    (1)版本。

    长度为4位,标识数据报的P版本号,值为二进制0100,则表示IPv4。

      (2)头部长度( Internet Header Length,HL)
           长度为4位。该字段表示数的单位是32位,即4字节。常用的值是5,也是可取的最小值,表示报头为20字节;可取的最大值是15,表示报头为60字节

      (3)区分服务( Type of Service,Tos)
           长度为8位,指定特殊数据处理方式。该字段分为两部分:优先权和ToS。后来该字段被IET改名为区分服务( Differentiated Services,DS)。该字段的前6位构成了区分代码点( DifterentiateServices Code Point,DSCP)和显式拥塞通知( Explicit Congestion Notification,ECN)字段,DSCP用于定义64个不同服务类别,而ECN用于通知拥塞,具体如图4-1-2所示。

      (4)总长度(Total Length)

     该字段长度为16位,单位是字节,指的是首部加上数据之和的长度,所以数据报的最大长度为2^16-1=65535字节,由于有MTU限制(如果以太网单个IP数据报就不能超过1500字节),所以超过1500字节的IP数据报就要分段,而总长度是所有分片报文的长度和。

      (5)标识符( Identific)
            该字段长度为16位。同一数据报分段后,其标识符一致,这样便于重装成原来的数据报。


            (6)标记字段(1lag)
           该字段长度为3位,第1位不使用:第2位是不分段(DF)位,值为1表示不能分片,为0表示允许分片:第3位是更多分片(MF)位,值为1表示之后还有分片,为0表示最后一个分片。

    (7)分片偏移字段( Fragment Offset)
           该字段长度为13位,单位8字节,即每个分片长度是8字节的整数倍。该字段是标识所分片的分组,分片之后在原始数据中的相对位置。

    (8)生存时间( Time to Live,TL)。
          该字段长度为8位,用来设置数据报最多可以经过的路由器数,用于防止无限制转发。由发送数据的源主机设置,通常为16、32、64、128个。每经过一个路由器,其值减1,直到为0时该数据报被丢。


          (9)协议字段( Protocol)。
         该字段长度为8位,指明IP层所封装的上层协议类型,如ICMP(1)、 IGMP(2)、TCP(6)、UDP(17)等。


        (10)头部校验( Header Checksum)。
        该字段长度为16位,是根据IP头部计算得到的校验和码。计算方法没有采用复杂的CRC编码,而是对头部中每个16比特进行二进制反码求和(与ICMP、1GMP、TCP、UDP不同,P报头不对P报头后面的数据进行校验)。


        (11)源地址、目标地址字段( Source and Destination Address)
         该字段长度均为32位,用来标明发送IP数据报文的源主机地址和接收P报文的目标主机地址,都是IP地址。


        (12)可选字段( Options)
        该字段长度可变,从1字节到40字节不等,用来定义一些任选项,如记录路径、时间戳等这些选项很少被使用,并且不是所有主机和路由器都支持这些选项。可选项字段的长度必须是32位(4字节)的整数倍,如果不足,必须填充0以达到此长度要求。


    2.IPv4地址
       IP地址就好像电话号码:有了某人的电话号码,你就能与他通话了。同样,有了某台主机的IP地址,你就能与这台主机通信了。 TCP/IP协议规定,IP地址使用32位的二进制来表示,也就是4个字节。例如,采用二进側表示方法的P地址形式为0000000010100000这么长的地址,工程师操作和记忆起来太费劲。为了方便使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为18.2.168.1。IP地址的这种表示法叫做点分十进制表示法,这显然比1和0容易记忆得多。如图41-3所示将32位的。

    3、IP地址分类

       IP地址分为五类:A类用于大型网络,B类用于中型网络,C类用于小型网络,D类用于组播,E类保留用于实验。每一类有不同的网络号位数和主机号位数。各类地址特征如图41-4所示。

    (1)A类地址。
        IP地址写成二进制形式时,A类地址的第一位总是0。A类地址的第1个字节为网络地址,其他3个字节为主机地址
    A类地址范围:1.0.0.0~126.255.255.255。
    A类地址中的私有地址和保留地址:
    1)   10.X.X.X是私有地址,就是在互联网上不使用,而只用在局域网络中的地址。网络号为10,网络数为1个,地址范围为10.0.0.0~10.255.255.255。
    2)127X.XX是保留地址,用作环回( Loopback)地址,环回地址(典型的是127.0.0.1)向自己发送流量。发送到该地址的数据不会离开设备到网络中,而是直接回送到本主机。该地址既可以作为目标地址,又可以作为源地址,是一个虚IP地址。

    (2)B类地址
        IP地址写成二进制形式时,B类地址的前两位总是10。B类地址的第1和第2字节为网络地址,第3和第4字节为主机地址。
    B类地址范围:128.0.0.0~191.255.25.255。
    B类地址中的私有地址和保留地址:

    1)  172.160~172.31,25255是私有地址。
    2)  169.254.XX是保留地址。如果PC机上的P地址设置自动获取,而PC机又没有找到应的DHCP服务,那么最后PC机可能得到保留地址中的一个IP。

    3)C类地地
        IP地址写成二进形式时,C类地址的前三位固定为110。C类地址第1-3字节为网格地址第4字节为主机地址。
       C类地址范:192.0.0.0~223.255.255.255

      C地址中的私有地址:192168Xx是私有地址,地址范围:192.168.0.0~192.168.255.255


         4)D类地址
        IP地址写成二进制形式时,D类地址的前四位固定为1110.D类地址不分网路地址和主机地址,该类地址用作组播。
       D类地址范围:224.0.0.0~239.255.255.255。其中,224.0.0.1代表所有主机与路由器;224.0.0.2代表所有组播路由器;224.0.0.5代表OSPF路由器;224.0.0.6代表OSPF指定路由器/备用指定路由器;224.0.0.7代表ST路由器;224.0.0.8代表ST主机,224.0.0.9代表RIP-2路由器,224.0.0.12代表DHCP服务器/中继代理,224.0.0.14代表RSVP封装,224.0.0.18代表虚拟路由器冗余协议(Virtual Router Redundancy Protocol, VRRP)。


        (5)E类地址。
       IP地址写成二进制形式时,E类地址的前四位固定为11110.E类地址不分网络地址和主机地址。E类地址范:240.0.0.0~247.255.255.255。

     

     

    展开全文
  • 输入: 输入IP网段,格式: xx.xx.xx.xx/[0-32] 输出:可用地址范围 思路: ip与掩码拆分,健壮性判断 按位与,或者主机位置0,求出网络号 计算该网段可用地址范围。 效果: [root@centos8 commonshells]# ./...

    输入: 输入IP网段,格式: xx.xx.xx.xx/[0-32]
    输出:可用地址范围
    思路

    1. ip与掩码拆分,健壮性判断
    2. 按位与,或者主机位置0,求出网络号
    3. 计算该网段可用地址范围。

    效果

    [root@centos8 commonshells]# ./calIpRange.sh 114.12.3.3/30
    114.12.3.3/30该网段网络号为114.12.3.0
    114.12.3.3/30该网段最小可用地址为114.12.3.1
    114.12.3.3/30该网段最大可用地址为114.12.3.2
    114.12.3.3/30该网段广播地址为114.12.3.3
    

    脚本:

    #!/bin/bash
    #########################################################
    #Filename:   calIpRange.sh
    #  Author:   LiangDong
    #   Email:   395539184@qq.com
    #    Date:   2021-04-04
    #     URL:   https://github.com/ledrsnet
    #    Desc:    输入IP网段,输出可用地址范围
    #	          1.ip与掩码拆分,健壮性判断
    #             2.按位与,求出网络号
    #             3.计算该网段可用地址范围。
    #     
    #########################################################
    
    set -eu
    
    # 1.ip掩码拆分并进行健壮性判断
    E_NOARGS=65
    if [ -z "$1" ];then
        echo "Usage:`basename $0` ip/mask"
        exit $E_NOARGS
    fi
    IP_MASK=$1
    IP=`echo $IP_MASK |sed -En 's/^(.*)\/([0-9]{1,2})/\1/p'`
    NET_MASK=`echo $IP_MASK |sed -En 's/^(.*)\/([0-9]{1,2})/\2/p'`
    #echo IP_MASK=$IP_MASK
    #echo IP=$IP
    #echo NET_MASK=$NET_MASK
    if [[ ! $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]];then
       echo  "Ip address $IP is invalid . Useage: ip/mask" 
       exit 2
    elif [ $NET_MASK -gt 32 -o $NET_MASK -lt 0 ];then
       echo "netmask should be in 0-32,your input netmask is $NET_MASK; Useage: ip/mask"
       exit 3
    elif [ $NET_MASK -eq 32 ];then
    	echo "主机位是32位,可用地址为$IP"
    	exit 4
    fi
    
    
    # 2.求出ip第几段前几位作运算
    IP_SUB1=`echo $IP |cut -d. -f1`
    IP_SUB2=`echo $IP |cut -d. -f2`
    IP_SUB3=`echo $IP |cut -d. -f3`
    
    #IP_SUB4=`echo $IP |cut -d. -f4`
    #IP_INDEX=`[ $[$NET_MASK/8+1] -ge 5 ] && echo 4 || echo $[$NET_MASK/8+1]`
    #echo IP_INDEX=$IP_INDEX
    #eval echo \$IP_SUB$IP_INDEX
    
    IP_INDEX=`echo $[$NET_MASK/8+1]`
    IP_SUB=`echo $IP |cut -d. -f$IP_INDEX`
    IP_SUB_BINARY=`echo "obase=2;$IP_SUB" |bc |xargs printf "%08d"`
    #echo IP_INDEX=$IP_INDEX
    #echo IP_SUB=$IP_SUB
    #echo IP_SUB_BINARY=$IP_SUB_BINARY
    IP_SUB_NET_BIT=$[$NET_MASK%8]
    IP_SUB_HOST_BIT=$[8-$NET_MASK%8]
    
    #echo IP_SUB_NET_BIT=$IP_SUB_NET_BIT
    #echo IP_SUB_HOST_BIT=$IP_SUB_HOST_BIT
    
    # 3.网络位不变,主机位全为0
    AVAILABLE_MIN_IP=$(echo $IP_SUB_BINARY|head -c${IP_SUB_NET_BIT} |xargs printf "ibase=2;%s`echo 00000000 |head -c${IP_SUB_HOST_BIT}`\n"|bc)
    #echo AVAILABLE_MIN_IP=$AVAILABLE_MIN_IP
    
    # 与操作 生成连续重复的字符串有什么好办法没?
    #R_NET_MASK=
    #R_HOST_MASK=
    #R_MASK=
    #for i in `seq ${IP_SUB_NET_BIT}`;do
    #	R_NET_MASK+=1
    #done
    #for i in `seq ${IP_SUB_HOST_BIT}`;do
    #	R_HOST_MASK+=0
    #done
    #R_MASK=`echo "ibase=2;$R_NET_MASK$R_HOST_MASK"|bc`
    #echo R_MASK=$R_MASK
    #A_MIN_IP=$[$IP_SUB&$R_MASK]
    #echo A_MIN_IP=$A_MIN_IP
    
    
    # 网络位不变,主机位全为1
    AVAILABLE_MAX_IP=$(echo $IP_SUB_BINARY|head -c${IP_SUB_NET_BIT} |xargs printf "ibase=2;%s`echo 11111111 |head -c${IP_SUB_HOST_BIT}`\n"|bc)
    #echo AVAILABLE_MAX_IP=$AVAILABLE_MAX_IP
    
    # 4.输出可用地址范围
    case $IP_INDEX in
    1)
    	echo "$IP_MASK该网段网络号为${AVAILABLE_MIN_IP}.0.0.0"
    	echo "$IP_MASK该网段最小可用地址为${AVAILABLE_MIN_IP}.0.0.1"
    	echo "$IP_MASK该网段最大可用地址为${AVAILABLE_MAX_IP}.255.255.254"
    	echo "$IP_MASK该网段广播地址为${AVAILABLE_MAX_IP}.255.255.255"
    	;;
    2)
    	echo "$IP_MASK该网段网络号为${IP_SUB1}.${AVAILABLE_MIN_IP}.0.0"
    	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${AVAILABLE_MIN_IP}.0.1"
    	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${AVAILABLE_MAX_IP}.255.254"
    	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${AVAILABLE_MAX_IP}.255.255"
    	;;
    3)
    	echo "$IP_MASK该网段网络号为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MIN_IP}.0"
    	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MIN_IP}.1"
    	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MAX_IP}.254"
    	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${IP_SUB2}.${AVAILABLE_MAX_IP}.255"
    	;;
    4)
    	echo "$IP_MASK该网段网络号为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.${AVAILABLE_MIN_IP}"
    	echo "$IP_MASK该网段最小可用地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.$[${AVAILABLE_MIN_IP}+1]"
    	echo "$IP_MASK该网段最大可用地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.$[${AVAILABLE_MAX_IP}-1]"
    	echo "$IP_MASK该网段广播地址为${IP_SUB1}.${IP_SUB2}.${IP_SUB3}.${AVAILABLE_MAX_IP}"
    	;;
    *)
    	echo "Calculator Error Exception!"
    esac
    

    如果有什么bug,欢迎评论指导呀!

    展开全文
  • 端口安全安全MAC地址分类端口安全保护动作配置端口安全经常使用的场景MAC地址偏移出现场景如何避免MAC地址漂移检测 MAC地址 MAC(Media Access Control Address)地址:网络中每台设备都有一个唯一的网络标识。 1....
  • JAVA解析纯真IP地址

    2021-02-12 14:30:47
    看下JAVA代码中怎么解析IP的吧。(代码参考至lumaQQ.谢谢开源作者luma)解析的主类package com.showtime.IPparse;import java.io.File;import java.io.FileNotFoundExceptio...
  • 默认网关:默认网关就是与这台主机相连的第一个路由器的接口的地址,老师的解释是,当一个...ip分组总结:DF与MF标志位的意义:DF标志着允不允许ip进行分组,DF是Don’t fr……的意思,表示不要分组,当DF为0的时候可...
  • php本地匹配ip地址

    2021-05-01 03:49:42
    /*** IP 地理位置查詢類*/class IpLocation {/.../*** 第一條IP記錄的偏移地址**@var int*/private $firstip;/*** 最后一條IP記錄的偏移地址**@var int*/private $lastip;/*** IP記錄的總條數(不包含版本信息記錄)**...
  • /** * 第一条IP记录的偏移地址 * * @var int */ private $firstip; /** * 最后一条IP记录的偏移地址 * * @var int */ private $lastip; /** * IP记录的总条数(不包含版本信息记录) * * @var int */ private $...
  • Linux主机IP地址配置

    2021-05-13 05:58:35
    1 简述osi七层模型和TCP/IP五层模型osi七层模型有如下层次构成:(1) 物理层:二进制传输,为启动、维护以及关闭物理链路定义了电气规范、机械规范、过程规范和功能规范;(2) 数据链路层:定义如何格式化数据以便进行...
  • IP数据报中解析源目的地址青 岛 农 业 大 学理学与信息科学学院计算机网络综合实习报告题 目从IP数据报中解析源/目的地址专 业 计算机科学与技术学 号姓 名指导教师日 期目 录一、设计任务和目的- 2 -二、设计要求...
  • IP地址

    2021-03-31 10:33:02
    IP地址由32位二进制组成,采用淀粉十进制表示。 例如 192.168.0.1 11000000.10101000.00000000.00000001 IP分类 A类可用的分配范围是1.0.0.1-----126.255.255.254 子网掩码默认为255.0.0.0 B类可用的分配范围是128....
  • 2.创建IP库基本信息对象 /** * IP库基本信息对象 * * @author Tom * @date 2020-12-21 */ public class IPEntry { /** * 国家 */ public String country; /** * 地区 */ public String area;
  • 【1】简介:IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到...【2】IP地址的组成:IP地址由4个字节段组成,一个字节
  • 71张图详解IP地址IP 路由、三层转发、ARP、ICMP 架构师之道2021-04-07 13:51:24 https://www.toutiao.com/i6948285918986027531/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&...
  • IP协议的简介以及IP首部信息

    千次阅读 2021-01-04 10:43:16
    介绍了IP协议的概念和IP首部的内容,以及相关知识点,ICMP、ARP、port、DNS。
  • 网络层IP协议

    2021-10-16 08:39:04
    前言 ... 传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是,UDP协议并不保证数据... 实际有数据传输能力的是网络层IP协议,提供了将数据从主机A跨网络送到主机B的能力。 一.基本概念 ...
  • c++ IP地址离线查询

    2021-03-30 10:18:16
    在此就需要一些技术手段来分析客户端的IP地址。总的来说可以有以下几种方法。 1、通过在线ip服务(使用post/get等技术手段) 投入少,但是查询速度慢,效率不高,对于并发量大的情况,效果不好。 2、通过离线ip...
  • IP报文格式详解

    千次阅读 2021-01-27 22:17:58
    IP报文首部讲解 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service|
  • C++指针偏移原理

    2021-08-17 19:26:36
    在C++中我们可以通过指针方便的访问各种类型数据,但我们都知道指针只是一个头地址,而我们需要遍历的数据通常占有大量的空间,那么指针是如何遍历其中的数据呢?这就涉及到指针偏移的一个问题,下面我们看个例子: ...
  • 计算机网络·片偏移练习题

    千次阅读 多人点赞 2021-05-03 19:25:05
    每个分片的片偏移字段值是多少(十进制形式)? (分条列知识) IP数据报由首部+数据形式存在,首部有固定的20B+可选择的部分组成 IP数据报的首部长度字段值就是告诉你每个分片首部占多少字节 这个字段值显示的是二...
  • IP 协议是基于IP 地址将数据包发送给目的主机,能够让互联网上任何两台主机进行通信。 网络层通信 IP 协议位于 OSI 参考模型的第三层,即网络层。 网络层 网络层的主要作用是实现终端节点之间的通信。这种...
  • ip协议格式 ip地址管理 路由选择
  • ip协议1.1 ip协议格式1.2 ip地址的管理2. DHCP协议 1. ip协议 1.1 ip协议格式   4位版本:标识当前是ipv4协议   4位首部长度:计算出来的值需要乘以4,才是首部的长度   8位服务类型(TOS):前三位表示...
  • 有小伙伴问:为什么没有配置 IP 地址就无法上网? IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协议之一。 IP 协议是基于 IP 地址将数据包发送给目的主机,能够...
  • IP包头详解

    千次阅读 2021-12-14 15:00:04
    ip包头最小⻓度 20字节,具体多大,取决于可选项有多大 可选项最大⻓度:10*4=40个字节 IP最大的⻓度:20字节+40个字节 = 60字节 所以是20~ 60字节,但 一般是:20字节
  • JAVA解析纯真IP地址库3

    2021-03-06 02:08:08
    packagecom.worthtech.app.util.ip;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.nio.ByteOrder;importjava.nio.MappedByteBuffer;importjava.nio.ch...
  • IP地址分为网络位(网络号)和主机位,网络位用来表示IP地址所处的网段,主机位用来标识该设备在该网段的编号 IP地址是由32个二进制组成的,通常用十进制表示。 二、IP地址分类 IPv4被划分为A、B、C、D、E五类,每...
  • 地址:占32位,表示发送端IP地址. 目的地址:占 32位,表述目的端IP地址. IP数据报首部的可变部分 IP首部的可变部分就是一个可选字段.选项字段用来支持排错,测量以及安全等措施,内容很丰富.此字段的长度可变,从1个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,891
精华内容 23,956
关键字:

ip可以表示偏移地址吗