IP、子网掩码、网关、DNS、端口号
详细内容参考这里
补充说明子网划分与子网掩码的关系:参考这里的子网划分以及之后的内容
笔记:1.这部分内容为什么32要减去2,原因是主机号不能全部为0或者1,因此每个机房主机号为全0和全1的ip地址都被移除,得到的ip地址范围。
2.ip一般是由网络号和主机号构成,网络号位于前几位,主机号位于后几位,具体是需要子网掩码来进行确定。当两个机器之间想要直接进行通信(不借助网关),则要求两个机器的网络号(ip与子网掩码的&运算)一致才行。
3.子网掩码应该根据网络的规模进行设置。如果一个网络的规模不超过254台电脑,采用“255.255.255.0”作为子网掩码就可以了,现在大多数局域网都不会超过这个数字,因此“255.255.255.0”是最常用的IP地址子网掩码;假如在一所大学具有1500多台电脑,这种规模的局域网可以使用“255.255.0.0”。
4.如果子网掩码是四个位置都是255或者000,例如255.255.255.000而不是255.255.255.224这种,则表示没有子网(同一子网(网络号)下的机器能够直接进行通信),但不是代表没有局域网,二者概念不一致。
局域网、广域网、WLAN、WiFi的联系与区别
笔记:设置不同大小的网络原因主要是为了节省ipv4数量的使用,不同局域网下的ip地址可能相同(局域网的ip地址可以通过DHCP进行动态分配),但是每个局域网用来访问外网的ip地址一定是不同的,是需要向网络运营商进行拨号申请的。
TCP/IP协议介绍和局部使用
首先,什么是TCP/IP协议,这是一个总称的概念(参考这里对内部众多通信协议的简介),这里主要是介绍我学习过程中遇到的一些代码层面的知识。
下面内容的参考文章
这里使用的是python的zmq包,这个包相比较单一的通信协议py包,功能更加强大,总结以下:
- ØMQ (ZeroMQ) 是一个基于消息队列的多线程网络库,它封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。
- ZeroMQ是一个高效的消息传输库,支持许多不同的传输协议和消息模式。与像TCP和HTTP等协议不同,ZeroMQ的目标是为应用程序之间的通信提供一种非常简单和快速的方式。它提供了比HTTP或TCP更高层次的抽象,允许开发人员直接在应用程序之间透明地传递消息,而无需自己构建完整的通信协议。
- ZeroMQ提供了简单的API,可用于许多流行的编程语言,包括Python。它可以用于构建分布式系统或多线程应用,可以从中获取更高级别的抽象。
- zmq包支持三种工作模式,分别为request-reply(请求回应模式),Publish/Subscribe(订阅-发布模式 )和Push/Pull(流水线模式)
这里介绍的是request-reply()(请求响应模式),首先来看两个经典代码示例,由代码示例来开始普及。
Client端(req端)Python代码实现:
#client.py
import zmq
context = zmq.Context()
# Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
socket.send(b"Hello")
# Get the reply.
message = socket.recv()
print(f"Received reply [ {message} ]")
Server端(rep端)python实现
#server.py
import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
# Wait for next request from client
message = socket.recv()
print("Received request: %s" % message)
# Do some 'work'
time.sleep(1)
# Send reply back to client
socket.send(b"World")
- 首先是Client端代码,zmq.Context(),.socket()和.connect()是zmq建立通信的初始化函数,其中参数zmq.REQ则是建立request-reply模式。
- 参数
"tcp://localhost:5555"
是Tcp通信地址,由两大部分组成ip地址和端口号(port)组成,接下里这部分内容参考文章1和文章2。- localhost是什么,干什么用如下图所示
- 端口号是什么,有什么用
- localhost是什么,干什么用如下图所示
- Server端中代码同理,其中socket.bind()的参数中
*
的含义是通配符作用,意思也就是服务端监听所有地址下5555端口的请求。因此可以拓展多个客户端,只需要将socket.connect("tcp://localhost:5555")
中的地址改成“tcp://127.0.0.2:5555”即可再次建立一个新的地址下的通信(这里的127.系列都属于本地虚拟网口ip地址,上文图片有提及)。 - 同时运行服务端代码程序和客户端代码程序即可实现本地TCP通信。纵使是多个客户端代码同时运行,只要地址不冲突都是可以的。