本文共 2744 字,大约阅读时间需要 9 分钟。
互联网的本质就是一系列网络协议的集合,统称为互联网协议。这些协议定义了计算机如何接入互联网以及如何进行通信。
互联网协议根据功能的不同,可以按照OSI七层模型或TCP/IP五层模型进行划分。以下从底层到上层逐一阐述各层的功能。
孤立的计算机之间要想互相通信,首先需要完成组网。物理层的主要功能是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0。
单纯的电信号0和1没有任何意义,必须规定电信号的分组方式。以太网协议(Ethernet)定义了电信号的分组方式。每个数据包称为帧,其中报头包含源Mac地址、目标Mac地址和数据类型,数据部分的长度最短为64字节,最长为1518字节。超过最大限制的数据包会被分片发送。
以太网通信采用广播方式,计算机发送数据包时,会在自己的子网内进行广播传输。接收方检查数据包中的目标IP地址是否为自身,如果是,则返回对应的Mac地址。
为了应对互联网的扩展性问题,网络层引入了IP协议。IP地址用于区分不同的子网,通过子网掩码和AND运算确定是否在同一个子网内。IP数据包的头部包含源IP地址和目标IP地址,数据部分直接放入以太网数据包中。
如果不在同一个子网内,目标IP地址会被替换为网关的Mac地址。arp协议通过广播请求目标主机的Mac地址,并返回网关的Mac地址。
网络层的IP协议帮助我们区分子网,以太网层的Mac地址帮助我们找到特定的主机,但这还不够。程序之间的通信需要借助传输层的端口来建立连接。TCP协议定义了面向连接的通信,通过三次握手建立连接,确保数据可靠传输。UDP协议则提供了无连接的通信服务,适用于实时性要求高的场景。
应用层定义了应用程序数据的格式。例如,TCP协议支持多种应用,如Email、WWW、FTP等。这些应用程序协议共同构成了应用层,使得不同应用程序能够与网络进行通信。
import socket# 创建socket对象server = socket.socket(socket.SOCK_STREAM)ip_port = ("192.168.15.73", 8520)server.bind(ip_port)server.listen(3)while True: conn, addr = server.accept() info = "服务端提供服务" conn.sendall(info.encode("utf-8")) while True: recv_msg = conn.recv(1024).decode("utf-8") if recv_msg == "88": break send_msg = input("服务端输入信息: ") conn.sendall(send_msg.encode("utf-8")) conn.close()server.close() import socketclient = socket.socket(socket.SOCK_STREAM)ip_port = ("192.168.15.73", 8520)client.connect(ip_port)while True: info = input("客户端输入请求: ") if info == "88": break client.sendall(info.encode("utf-8")) recv_msg = client.recv(1024).decode("utf-8") print("收到:", recv_msg)client.close() import socketserver = socket.socket(socket.SOCK_DGRAM)ip_port = ("127.0.0.1", 8520)server.bind(ip_port)while True: recv_msg, addr = server.recvfrom(1024) print("收到来自{}的消息:{}".format(addr, recv_msg.decode("utf-8"))) send_msg = input("输入回复内容: ") if not send_msg: continue server.sendto(send_msg.encode("utf-8"), addr) import socketclient = socket.socket(socket.SOCK_DGRAM)client.sendto("给你商城的信息".encode("utf-8"), ("127.0.0.1", 8520))while True: recv_msg, addr = client.recvfrom(1024) print("收到来自服务端的消息:", recv_msg.decode("utf-8")) who = input("请选择聊天对象[Q退出]: ") if who == "Q": break ip_port = ("192.168.12.42", 8520) # 假设多个聊天对象 while True: send_msg = input("输入聊天内容[Q结束]: ") if send_msg == "Q": break if not send_msg: continue client.sendto(send_msg.encode("utf-8"), ip_port) recv_msg, addr = client.recvfrom(1024) print("收到来自{}的消息:{}".format(addr, recv_msg.decode("utf-8"))) 以上代码可以实现简单的UDP聊天工具,支持多个聊天对象。服务端接收客户端消息并反馈,客户端可以选择不同的聊天对象进行对话。
转载地址:http://tylfk.baihongyu.com/