IP 地址的组成部分(网络位 + 主机位)
IP地址采用分层结构;
IP地址是由网络号(net ID)与主机号(host ID)两部分组成的。
根据不同的取值范围,IP地址可以分为五类;IP地址中的前5位用于标识IP地址的类别:
A类地址的第一位为0;
B类地址的前两位为10;
C类地址的前三位为110;
D类地址的前四位为1110;
E类地址的前五位为11110。
实际大多通过子网掩码来区分网络位和主机位,子网掩码跟IP地址一一对应,子网掩码为1的是网络位,为0的是主机位。
如:192.168.1.2 掩码255.255.255.0 。网络位192.168.1 主机位是2
举个例子:比如172.16.2.160/255.255.255.0:
这个IP地址的【网络号】就是172.16.2.0 主机号为 0.0.0.160
划分子网情况
如:172.16.2.160/255.255.255.192(IP地址/掩码)
1010 1100 0001 0000 0000 0010 1010 0000 (二进制)
1111 1111 1111 1111 1111 1111 1100 0000 (子网掩码)
------------------------------------------相"与"(理解成相乘)
1010 1100 0001 0000 0000 0010 1000 0000(172.16.2.128这就是子网号)
1010 1100 0001 0000 0000 0010 1000 0001(172.16.2.129是第一个主机)
1010 1100 0001 0000 0000 0010 1011 1110(172.16.2.190最后一个主机)
1010 1100 0001 0000 0000 0010 1011 1111 广播地址 172.16.2.191
子网掩码的作用:
1,将一类ip地址(也就是只确定的网络号的ip)划分为更加小的子网络 (通常得到一个c类ip,如:212.26.220.0最后一组是主机号(最大255),用子网掩码分成更小的网段) 因为掩码的值是连续的1,那么子网掩码的值也就是有规律的: 比如 1000 0000 ---> 128 1100 0000 ---> 192 1110 0000 ---> 224 1111 0000 ---> 240 1111 1000 ---> 248 1111 1100 ---> 252 1111 1110 ---> 254 2,将相邻的网络地址合并成同一逻辑网络比如: 两个C类IP地址215.60.30.0与215.60.31.0与子网掩码255.255.254.0 11010111.00111100.00011110.00000000-->215.60.30.0 11010111.00111100.00011111.00000000-->215.60.31.0 11111111.11111111.11111110.10000000-->255.255.254.0//掩码 11010111.00111100.00011110.00000000-->215.60.30.0//都是该网段
注意:一个错误的理解:子网掩码主要目的是增加了ip数量!!!其实并没有增加!!!
(也不能说没有增加,比如相同的ip不同子网掩码,实际公网是不存在相同的ip,,如果说是两个局域网这种情况,不知道算不算增加了)
补充:
1,只知道ip地址那么只能知道是属于哪一类ip。或者认为没有子网络,比如c类ip,那么前3组是网络号,后面一组是主机号
2,只有知道子网掩码和ip,才能知道具体的网段和主机号
3,相同子网掩码未必是同一网段ip,同一网段的ip必然有相同的子网掩码。
“IP地址/ 数字” 是什么意思?例如 192.168.5.12 / 21
数字是子网掩码位(数),说明子网掩码由21个1组成,即 子网掩码是: 11111111 11111111 11111000 00000000 ,也就是255.255.248.0.
推荐阅读
-
IP 地址的组成部分(网络位 + 主机位)
-
go语言Socket编程-Socket编程 什么是Socket Socket,英文含义是插座、插孔,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket,该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 套接字的内核实现较为复杂,不宜在学习初期深入学习,了解到如下结构足矣。 套接字通讯原理示意 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+端口号”就对应一个socket。欲建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。因此可以用Socket来描述网络连接的一对一关系。 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 网络应用程序设计模式 C/S模式 传统的网络应用设计模式,客户机(client)/服务器(server)模式。需要在通讯两端各自部署客户机和服务器来完成数据通信。 B/S模式 浏览器(Browser)/服务器(Server)模式。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。 优缺点 对于C/S模式来说,其优点明显。客户端位于目标主机上可以保证性能,将数据缓存至客户端本地,从而提高数据传输效率。且,一般来说客户端和服务器程序由一个开发团队创作,所以他们之间所采用的协议相对灵活。可以在标准协议的基础上根据需求裁剪及定制。例如,腾讯所采用的通信协议,即为ftp协议的修改剪裁版。 因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。如,知名的网络游戏魔兽世界。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。 C/S模式的缺点也较突出。由于客户端和服务器都需要有一个开发团队来完成开发。工作量将成倍提升,开发周期较长。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的安全性构成威胁。这也是很多用户不愿使用C/S模式应用程序的重要原因。 B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作开发量较小。只需开发服务器端即可。另外由于其采用浏览器显示数据,因此移植性非常好,不受平台限制。如早期的偷菜游戏,在各个平台上都可以完美运行。 B/S模式的缺点也较明显。由于使用第三方浏览器,因此网络应用支持受限。另外,没有客户端放到对方主机上,缓存数据不尽如人意,从而传输数据量受到限制。应用的观感大打折扣。第三,必须与浏览器一样,采用标准http协议进行通信,协议选择不灵活。 因此在开发过程中,模式的选择由上述各自的特点决定。根据实际需求选择应用程序设计模式。 简单的C/S模型通信 Server端:Listen函数 func Listen(network, address string) (Listener, error) network:选用的协议:TCP、UDP, 如:“tcp”或 “udp” address:IP地址+端口号, 如:“127.0.0.1:8000”或 “:8000” Listener 接口: type Listener interface { Accept (Conn, error) Close error Addr Addr } Conn 接口: type Conn interface { Read(b byte) (n int, err error) Write(b byte) (n int, err error) Close error LocalAddr Addr RemoteAddr Addr SetDeadline(t time.Time) error SetReadDeadline(t time.Time) error SetWriteDeadline(t time.Time) error } 参看 [<u>https://studygolang.com/pkgdoc</u>](https://studygolang.com/pkgdoc) 中文帮助文档中的demo: 示例代码:TCP服务器.go package main import ( "net" "fmt" ) func main { // 创建监听 listener, err:= net.Listen("tcp", ":8000") if err != nil { fmt.Println("listen err:", err) return } defer listener.Close // 主协程结束时,关闭listener fmt.Println("服务器等待客户端建立连接...") // 等待客户端连接请求 conn, err := listener.Accept if err != nil { fmt.Println("accept err:", err) return } defer conn.Close // 使用结束,断开与客户端链接 fmt.Println("客户端与服务器连接建立成功...") // 接收客户端数据 buf := make(byte, 1024) // 创建1024大小的缓冲区,用于read n, err := conn.Read(buf) if err != nil { fmt.Println("read err:", err) return } fmt.Println("服务器读到:", string(buf[:n])) // 读多少,打印多少。 }
-
ARP 协议有什么作用--ARP(AddressResolutionProtocol,地址解析协议)地址解析协议用于将计算机的网络地址(32 位 IP 地址)转换为物理地址(48 位 MAC 地址)[RFC826]。ARP 协议属于链路层协议,在以太网网络中,数据帧从一台主机传送到网络中的另一台主机时,是根据 48 位以太网地址(硬件地址)来确定接口的,而不是根据 32 位 IP 地址。内核(如驱动程序)必须知道目的地的硬件地址,才能发送数据。当然,点对点连接不需要 ARP 协议。 ARP 协议示例
-
南邮OJ Web任务大揭秘:层层挑战剖析 1. 挑战一:迷宫般的目录探索 题目作者似乎穷举了所有可能的目录组合,最终在404.php中的