jjzjj

TCP/IP的Internet层

背对背依靠 2023-03-28 原文

Internet层

Internet层相关协议

ICMP协议:

  Internet Control Message Protocol,用于探测网络中的状态,ping命令使用的就是icmp协议(向网络中发送icmp协议数据包,根据网络的状态返回不同的提示信息),不但能检测网络的状态,还能检测网络的速度。

范例: 利用icmp协议判断网络状态

[root@centos7 ~]#ping 10.0.0.8
PING 10.0.0.8 (10.0.0.8) 56(84) bytes of data.
64 bytes from 10.0.0.8: icmp_seq=1 ttl=64 time=0.307 ms
64 bytes from 10.0.0.8: icmp_seq=2 ttl=64 time=0.344 ms
64 bytes from 10.0.0.8: icmp_seq=3 ttl=64 time=0.335 ms
64 bytes from 10.0.0.8: icmp_seq=4 ttl=64 time=0.441 ms

[root@centos7 ~]#ping 10.0.0.81
PING 10.0.0.81 (10.0.0.81) 56(84) bytes of data.
From 10.0.0.7 icmp_seq=1 Destination Host Unreachable
From 10.0.0.7 icmp_seq=2 Destination Host Unreachable

[root@centos7 ~]#ping 10.0.0.8  #端口不可达
PING 10.0.0.8 (10.0.0.8) 56(84) bytes of data.
From 10.0.0.8 icmp_seq=1 Destination Port Unreachable
From 10.0.0.8 icmp_seq=2 Destination Port Unreachable

[root@centos8 ~]#ping www.redhat.org #dns解析可能除了问题
ping: www.magedu.org: Name or service not known

ping命令:

选项:

-s:指定数据包的大小(默认为64byte),最大为62207
-f:实现网络的攻击(默认一秒发送一个icmp数据包) flood:泛红,拼命向对方发送icmp数据包
-c:指定ping的次数(指定发送多少个icmp数据包)

ARP:

Address Resolution Protocol:地址解析协议。通过ip地址把对方的mac地址找到。
过程:想网络中发送一个广播,广播中的信息包含想进行通信的ip地址,接收返回消息以后确定目标的mac地址。然后将该IP地址和物理地址缓存到计算机一段时间。

linux查看曾今通讯过的ip和mac的对应关系(arp缓存):

arp -n

arp这种机制没有确认的过程,可能会收到中间人攻击。

同网段arp和跨网段arp

1.先判断两者是否在同一网络,是就直接广播
2.A利用arp获取和它直连的路由器那个接口的mac地址
3.把数据包交给路由器,然后路由器利用和B相连的那个接口发送arp请求获取B的mac
4.最后实现A把数据包交给了B。
有几个网段就做几次arp广播

RARP协议:

  反向地址解析 mac解析成IP(比如网吧的无盘电脑固定ip,电脑启动以后会向网络发请求(发自己的mac地址),通过服务器mac和ip的映射表来分配ip地址)

internet 协议(IP协议--internet protocol)

Internet 协议特征

IP协议位于

IP PDU 报头

IP协议的报文有5行是固定的,一行32位(4个字节),固定的一共20个字节。

第一行:

版本号(ipv4、ipv6),ipv4是32位,一共有43亿个地址
首部长度:
区分服务:
总长度:数据包总长度

第二行:

标识:数据包是来自哪一个大包
标志:决定片偏移是一个大包分出来的包还是本身就是一个独立的包
片偏移:是来自于大包的第几个小包

第三行:

生存时间:占8位,记为TTL:Time-To-Live(生存时间值),以经过的路由器数量为单位,每经过一个路由器,TTL值减1,当TTL值减到0时,路由器就会将这个包丢弃,这样就可以防止包在网路上无休止的传播发送。


链接:https://blog.csdn.net/whatFUK/article/details/113714833

协议:上层协议的类型(tcp、udp等)
首部校验和:

第四行:

源地址:

第五行:

目标地址:

范例:探测网络中地址是否存在冲突--arping工具

#查看指定的ip地址都被那些设备用了
arping ip地址 #网络中是否有地址冲突 首先这个地址得存在 

ip地址组成和分类

ipv6在互联网上使用比较多,局域网仍然使用的是ipv4,因为ipv6不方便管理。

IPv4

IPv4地址:

是一个32位的二进制数字,可唯一标识IP网络中的每台设备 ,网络中通信的设备都需要事先配置一个ip地址(唯一)

IP地址作用:

mac地址世界唯一,ip地址在每一个局域网中唯一。有了mac地址还配置ip地址的原因,ip地址是一个可以修改的地址,由网络位和主机位组成。所以能描述设备在哪一个网络里面。

IP地址由两部分组成:

网络 ID:描述在哪一个网络(网段)里
主机 ID:标识网络里唯一设备

IPv4地址格式:点分十进制记法

每8位二进制数化为一组,方便阅读和管理。
范围: 00000000 --- 11111111 (0---255)

IP地址分类(现在已经不常用了)

通过地址的划分方式来确认网络id和主机id

A类:(以1-126开头的)

  • 网络id:(约定了总共的32位中,最高位为0 )0 0000000 - 0 1111111.X.Y.Z : 0-127.X.Y.Z (0开头的地址表示位置地址,127开头的地址表示设备本身),所以要去除0和127开头的

  • 主机id:剩下的24位

  • 默认子网掩码:255.0.0.0

  • 网络数:126=2^7(可变是的网络ID位数)-2

  • 主机数:2^24-2=16777214(要去除全0和全1的情况)

B类:

  • 网络id:前16位(约定最高的两位不改变)10 000000 - 10 111111.X.Y.Z:128-191.X.Y.Z

  • 主机id:剩下的16位

  • 默认子网掩码:255.255.0.0

  • 网络数:2^14=16384

  • 每个网络中的主机数:2^16-2=65534

C类:

  • 网络id:前24位(约定前面的三位不改变)110 0 0000 - 110 1 1111.X.Y.Z: 192-223.X.Y.Z

  • 主机id:剩下的8位

  • 默认子网掩码:255.0.0.0

  • 网络数:2^21=2097152

  • 每个网络中的主机数:2^8-2=254

D类:

表示多播地址,1110 0000 - 1110 1111.X.Y.Z: 224-239.X.Y.Z(不是给计算机分配的)

判断ip地址属于哪一类,只看ip地址的第一个十进制数就行了。

传统ip地址分类缺陷

每一类之间的网络位和主机位的变化幅度太大

公共和私有IP地址

私有IP地址:不直接用于互联网,通常在局域网中使用


这几个地址在互联网上是不会出现的都是在局域网上使用

公共IP地址:互联网上设备拥有的唯一地址


公有地址世界唯一。

特殊地址

0.0.0.0
0.0.0.0不是一个真正意义上的IP地址。它表示所有不清楚的主机和目的网络(表示的是未知地址)

255.255.255.255(每一位都是1)
限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机

127.0.0.1~127.255.255.254
本机回环地址,主要用于测试。在传输介质上永远不应该出现目的地址为“127.0.0.1”的 数据包

224.0.0.0到239.255.255.255
组播地址,224.0.0.1特指所有主机,224.0.0.2特指所有路由器。224.0.0.5指OSPF 路由器,地址
多用于一些特定的程序以及多媒体程序

169.254.x.x(windows配置了自动获取ip,但是网络中不存在dhcp服务器)
如果Windows主机使用了DHCP自动分配IP地址,而又无法从DHCP服务器获取地址,系统会为主
机分配这样地址

CIDR:无类域间路由

不将ip地址进行分类,通过子网掩码这个技术来区分网络位和主机位。

子网掩码:netmask

是一个32位的二进制数,和ip成对使用。ip的网络位有几位,则netmask的对应位就为1。反之对应的主机位为0。
子网掩码也就决定了网络中的主机数:

通过子网掩码判断网络位和主机位的位数:

1的位数有几位则网络位就是几。剩下的就是主机位。

子网掩码表示方法

方法一:点分十进制
方法二:CIDR表示法:IP地址/网络位 例如:IP/12

老命令ifconfig使用的就是点分十进制,新命令ip使用的就是CIDR表示法

范例:通过ip地址确定ip范围

#203.101.123.163/28的ip范围:
前24位不变,把163拆成二进制,前四位是网络位,后面的是主机位。
163=128+32+3=1010  0011

最小:203.101.123.1010 0001(最小不能为0,从1开始)
最大:203.101.123.1010 1110(不能全为1)

范围:203.101.123.161--- 203.101.123.174

范例:ip地址网络位的计算

#203.101.123.163  nemask:255.255.255.240
网段:203.101.123.10100011  ----240(11110000)
                  11110000
网络位:203.101.123.10100000 ---203.101.123.160

#网络位的作用:判断设备否处于同一网络里面

判断对方主机是否在同一个网段:

用自已的子网掩码分别和自已的IP及对方的IP相与,比较结果,相同则同一网络,不同则不同网段

范例:判断是不是在一个网络里面

A:10.0.0.1/16
B:10.0.2.2/24

A访问B的时候,两者在一个网络里面,B访问A不在一个网络里面。

#A设备访问B设备的时候,会先用自己的ip和子网掩码相与得到网络位,然后用自己的子网掩码和对方的IP地址相与。与出来的结果一样,所以就在同一个网段里面。
#反之B访问A,就认为不在一个网段里面。

#因为A到B和B到A的网络位不一样,所以不在同一个网段。不同网段之间的设备通信需要使用到网关(网关要和他们两再同一个网段)。

公式

主机数计算:2^主机id数 - 2

网络数计算:2^网络位数

网络位计算:ip地址和netmask相与

划分子网

  将一个大的网络(主机数多)划分成多个小的网络(主机数少),主机ID位数变少,网络ID位数变多。
网络位向主机位借位数。借n位,就划分2^n个子网。

合并超网:

将多个小网络合并成一个大网,主机ID位向网络ID位借位,然后剩下的网络位大家都一样。(挑最多的共同点作为新的网络id)
方法:挑选多个ip地址共同的位作为网络id位。

范例:

#8个C类网段
220.78.168.0/24
220.78.169.0/24
220.78.170.0/24
220.78.171.0/24
220.78.172.0/24
220.78.173.0/24
220.78.174.0/24
220.78.175.0/24

220.78.10101 000.0   220.78.168.0/24
220.78.10101 001.0   220.78.169.0/24
220.78.10101 010.0   220.78.170.0/24
......
220.78.10101 110.0   220.78.174.0/24
220.78.10101 111.0   220.78.175.0/24

#合并成一个大网
220.78.168.0/21

有关TCP/IP的Internet层的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  3. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  4. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  5. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

  6. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  7. ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围? - 2

    我想做两件事:将IP地址输入转换为CIDR以下是一些示例输入:1.1.1.1192.168.*.*#=>192.168.0-255.0-255192.168.1.2-201.1.1-10.1-100检查给定的IP地址是否属于任何CIDR。这一定是一个非常快速的查询,因为它是我的网络应用程序中非常常见的查找。我正在考虑做这样的事情:defmatches?(request)valid=@ips.select{|cidr|cidr.contains?(request.remote_ip)}!valid.empty?end我认为将IP范围转换为CIDR将使查找速度比我们现在所做的更快,后者将I

  8. ruby - 如何在 ruby​​ 中获取 ip 地址、referer 和用户代理? - 2

    我想记录用户的ip地址、referer和用户代理。在PHP中,我可以从以下变量中获取它们:$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_REFERER']$_SERVER['HTTP_USER_AGENT']如何在ruby​​中获取它们? 最佳答案 PHP嵌入在网络服务器中。Ruby是一种通用语言:如果您需要Web服务器上下文,则必须自己安装。幸运的是,这很容易。最简单的入门方法之一是使用Sinatra。安装gem:geminstallsinatra然后创建myapp.rb:require'sinatr

  9. ruby-on-rails - 如何使用 Ruby/Tor 更改我的 IP 地址? - 2

    我正在使用Rails4.2.7,并且安装了几个Torgem。gem'tor'gem'tor_requests'gem'tor-privoxy'gem'net-telnet'我启动了我的Tor浏览器(在MacElCapitan上运行),我想定期(每20个请求)更改我的TORWeb请求的来源IP地址。所以我试了一下agent=TorPrivoxy::Agent.new'127.0.0.1','',{8118=>9151}do|agent|sleep1puts"NewIPis#{agent.ip}"end但是,这会导致以下错误。我很困惑我还需要如何配置才能完成上述工作。Errorduring

  10. ruby-on-rails - IP地址过滤 - 2

    我正在考虑为我的RailsSaaS应用实现IP地址过滤。简而言之,我希望管理员能够指定一个或多个IP地址(或一系列IP地址),然后我的应用程序只接受来自指定地址的实例请求。我正在考虑使用IPAddress(http://github.com/bluemonk/ipaddress)来解析/验证每个地址/地址范围。这是合适的还是有更好/更合适的库?有没有人实现过这种过滤,谁能描述一种对他们有用的方法,或者有什么我需要担心的陷阱?或者,是否有一个现有的Ruby库可以自动处理所有这些,但我的谷歌搜索却逃过了一劫?非常感谢,灰 最佳答案 ip

随机推荐