标签:bin api from osi模型 .so 模型 广播 技术分享 用户
一、ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。 二、在网络通信中,主机和主机通信的数据包需要依据OSI模型从上到下进行数据封装,当数据封装完整后,再向外发出。所以在局域网的通信中,不仅需要源目IP地址的封装,也需要源目MAC的封装。 三、一般情况下,上层应用程序更多关心IP地址而不关心MAC地址,所以需要通过ARP协议来获知目的主机的MAC地址,完成数据封装。 ARP协议通过"一问一答"实现交互,但是"问"和"答"都有讲究,"问"是通过广播形式实现,"答"是通过单播形式。
传输层:TCP与UDP协议
TCP(传输控制协议)是一种可靠的通信协议,需要经过三次握手的环节,确立连接关系之后,才可以进行传输;终止连接(四次挥手);为确保正确地接收数据,TCP要求在目标计算机成功收到数据时发回一个确认(即ACK),如果在某个时限内未收到相应的 ACK,将重新传送数据包。
UDP(用户数据报协议)不一定提供可靠的数据传输,不需要建立连接关系,它只管传输。
TCP与UDP区别: 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接; 2、TCP提供可靠的服务;也就是说,通过TCP连接传输的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,但不保证可靠交付; 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等); 4、每一条TCP连接只能是点到点的;UDP支持一对一、一对多、多对一和多对多的交互通信; 5、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
socket是一种操作系统提供的进程间通信机制;在操作系统中,通常会为应用程序提供一组应用程序接口(API),称为套接字接口(socket API);应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。
基于TCP协议的socket
tcp是基于连接的,必须先启动服务端,再启动客户端去连接服务端。
server端
import socket sk = socket.socket() # 比喻买手机 sk.bind(("127.0.0.1", 8080)) # 把地址绑定到套接字;比喻绑定手机卡,接收的是元祖("ip", "port") sk.listen() # 监听链接;比喻等着他人给我打电话 conn, addr = sk.accept() # 接收客户端链接;比喻接受他人的电话,定义接收变量conn(链接)/addr(对方地址) ret_client = conn.recv(1024) # 接收客户端信息;比喻听他人说话,必须有参数(一般为1024的整数倍) print(ret_client) # 打印客户端信息 conn.send(b"i‘m server") # 向客户端发送信息 ret_client = conn.recv(1024).decode("utf-8") # 接收中文信息 print(ret_client) conn.send(bytes("我就是,有屁快放。", encoding="utf-8")) conn.close() # 关闭客户端套接字;比喻挂电话 sk.close() # 关闭服务器套接字(可选);比喻关手机
client端
import socket sk = socket.socket() # 比喻买手机 sk.connect(("127.0.0.1", 8080)) # 比喻播他人的电话 sk.send(b"i‘m client") ret_server = sk.recv(1024) print(ret_server) sk.send(bytes("喂喂喂,我找server。", encoding="utf-8")).decode("utf-8") ret_server = sk.recv(1024) print(ret_server) sk.close()
使用while循环可持续对话
# server端 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen() conn, addr = sk.accept() while True: ret_client = conn.recv(1024).decode("utf-8") if ret_client == "拜拜": break print(ret_client) my_info = input(">>>") conn.send(bytes(my_info, encoding="utf-8")) conn.close() sk.close() # client端 import socket sk = socket.socket() sk.connect(("127.0.0.1", 8080)) while True: my_info = input(">>>") sk.send(bytes(my_info, encoding="utf-8")) ret_server = sk.recv(1024).decode("utf-8") print(ret_server) if ret_server == "拜拜": break sk.close()
小练习:
client 每隔10秒把时间戳发给server
server 接收时间戳,将其转换成格式化时间
# server端 import socket import time sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen() conn, addr = sk.accept() while True: ret_client = conn.recv(1024).decode("utf-8") if ret_client: print(time.ctime(float(ret_client))) # client端 import socket import time sk = socket.socket() sk.connect(("127.0.0.1", 8080)) while True: timestamp = time.time() sk.send(bytes(str(timestamp), encoding="utf-8")) time.sleep(10)
基于UDP协议的socket
server端
import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) # 创建一个服务器的套接字 ip_port = ("127.0.0.1", 8888) udp_sk.bind(ip_port) # 绑定服务器套接字 msg, addr = udp_sk.recvfrom(1024) print(msg) udp_sk.sendto(b"i‘m server", addr) # 对话(接收与发送) udp_sk.close() # 关闭服务器套接字
client端
import socket ip_port = ("127.0.0.1", 8888) udp_sk = socket.socket(type=socket.SOCK_DGRAM) udp_sk.sendto(b"i‘m client", ip_port) msg, addr = udp_sk.recvfrom(1024) print(msg)
基于UDP协议的socket实现聊天
# server端 import socket ip_port = ("127.0.0.1", 8888) udp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_server_sock.bind(ip_port) while True: msg, addr = udp_server_sock.recvfrom(1024) print("来自[%s:%s]的一条消息:\033[36;1m%s\033[0m" % (addr[0], addr[1], msg.decode("utf-8"))) reply_msg = input("回复消息: ").strip() udp_server_sock.sendto(reply_msg.encode("utf-8"), addr) # client端 import socket ip_port = ("127.0.0.1", 8888) udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: msg = input("请输入消息,回车发送,输入q结束聊天: ").strip() if msg.lower() == "q": break else: udp_client_socket.sendto(msg.encode("utf-8"), ip_port) accp_msg, addr = udp_client_socket.recvfrom(1024) print("来自[%s:%s]的一条消息:\033[36;1m%s\033[0m" % (addr[0], addr[1], accp_msg.decode("utf-8")))
123
标签:bin api from osi模型 .so 模型 广播 技术分享 用户
原文地址:https://www.cnblogs.com/believepd/p/9690487.html