文章目录
??客户端 - 服务器网络编程模型??
“Client - Server”模型的操作概念可以类比我们用淘宝进行购物的操作,每一次的在手机淘宝上的操作都是作为客户端向淘宝服务器发送请求并且拿到响应消息的例子
过程:
- 打开淘宝时,会向淘宝服务器发送一个购买辣条数据请求(请求的格式是严格按照约定格式发送的)
- 淘宝服务器收到这个数据请求后,再按照约定的格式解析这个请求,调用数据库来生成一个购买该辣条的清单
- 淘宝服务器完成这个请求后,会给我们手机客户端返回一个响应,即我们点击购买后跳转的订单待处理/付款界面,然后等待我们的下一步操作
- 这时我们手机客户端收到了这个响应,进行相应处理,如取消订单/前往付款等
在上面这个过程中,作为服务器端需要一直监听着我们的手机,等待发送的请求到来。也就是说,服务器端需要在一开始就监听着一个已知的端口,而且一旦有这样一个已知的端口跟服务器端连接,服务器端就要消耗一定的资源来保持这个连接,以保证能持续接收到客户端的请求。在网络编程中,服务器端和客户端都指的是一个独立的进程。
??IP地址 & 端口号??
这两个名词在平时学习过程中并不少见,简单来说:
- IP地址就好比所在小区的楼栋(比如汤臣一品X栋)
- 端口号就好比所在楼栋的准确房间(X栋XXX)
这两个组合在一起,就锁定了一个唯一的位置。计算机(单一网卡)的IP地址是唯一的,而一个计算机能建立多个连接的基础就是这个端口号,通过不同的端口号,建立不同的连接。
IP地址是一个32位二进制数,通常分割为4个“8位二进制数”,即四个字节。通常以点分十进制的形式表示(x.x.x.x),其中每一个x都是0~255之间的十进制整数
端口号是16位的整数,最多为2^16(65536),当客户端发起连接请求时,客户端的端口一般由操作系统内核临时分配,这些端口有区别于众所周知的端口(即已被协议中使用的端口,如80端口、22端口等)
这里引入一个新概念:套接字对:(客户端IP地址:客户端口号,服务器端IP地址:服务器端口号),每一个连接都由这样的一个套接字唯一确定
??子网掩码??
可以将IP地址进行两段划分:一段为网络,一段为主机。下面以192.168.1.1 ~ 192.168.1.255为例
- 网络:表示例子中相同的部分,如前三个字节的192.168.1
- 主机:表示例子中不同的部分,如最后一个字节的1 和 255
对于A类地址来说,其默认子网掩码为255.0.0.0/8
对于B类地址来说,其默认子网掩码为255.255.0.0/16
对于C类地址来说,其默认子网掩码为255.255.255.0/24
介绍子网掩码之前,先引入一个概念“子网”:主机号中相对于网络类型主机号为1的部分(问题:子网跟子网掩码的关系是什么?)
以上图为例,已知B类网络中,以前两个字节为网络号,后两个字节为主机号,那么对于172.240.0.0/22这个IP地址来说,它属于B类型,但是他的网络位数为22位,那么这个IP的子网就是22-16=4位,也就是B类网络主机号中的前4位。相应的,这个网络就可以划分2^4个子网数
网络位数由子网掩码决定,通过将IP地址与子网掩码进行位与操作,就能得到“网络”的值。比如192.168.78.118与子网掩码255.255.255.0进行位与操作后,得到的192.168.78.0就是该IP地址的“网络”,剩余部分就是该IP地址的主机号
子网掩码并不是只有上面三种,它可以接受任意各位,如255.255.255.252也是一个子网掩码,这个子网掩码能分割出30位的网络和2位的主机,对于这个子网掩码的网络,最多只有四台主机,因为主机号部分的位数就决定了网络中可存在主机数量,当然一般来说实际可用的主机数还要减去广播地址(全为1),不可用地址(全为0)两个。
再回看上面A/B/C三类地址的子网掩码,会发现后面有数字8/16/24,这其实是位了快速辨认该网络的“网络”位数是多少位(即子网掩码前面全为1的个数)
??数据报 & 字节流??
TCP(字节流套接字,Stream Socket);UDP(数据包套接字,Datagram Socket)。
一般分别以“SOCK_STREAM” 和 “SOCK_DGRAM” 分别表示TCP和UDP套接字
TCP是可靠的、双向连接的通讯流。当将“A-B-C” 顺序的字节流输出到套接字上时,发送的字节流顺序与接收的字节流顺序是一致且不会出错的
UDP是无连接的Socket,目的是以最小的开销来达到网络环境中的进程通信目的,是一种不可靠的连接,但具有简单、传输速度快的优点
??PROBLEM??
有两个IP地址(172.16.0.0/12、20.0.0.0/8),请问两个IP地址各自有几个连续的的子网?