网络通信原理
一.操作系统基础
操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,
是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
注:计算机(硬件)->os->应用软件
二.网络通信原理
网络通讯的基本要素 1.物理介质 网线 光纤 无线网络 2.通讯协议 用于规定双方如何交换数据 OSI七层模型(其中应用层,表示层,会话层合并成应用层) OSI五层(一般掌握五层) 应用层 传输层 网络层 数据链路层 物理层
2.1物理层
物理层能够传输01101二进制 (物理层传送电信号) 00001020120 102102102101021 02102100210201021020 102102102002102 1020120102121020 单纯的二进制是没有意义的 必须得知道如何解析这些二进制 这就有了数据链路层
2.2数据链路层
工作在数据;链路层的协议是以太网协议 以太协议的主要功能 1.定义电信信号的分组方式 一组有几个 那个部分代表什么含义 一组电信号最大为 1518 必须包含 head 和data [head,data] 2.每个计算机必须具备网卡 网卡具备一个全球唯一的mac地址 可以用来表示唯一的一台计算机 3.由于不知道对方的mac地址 以太网通过广播的方式来进行通讯
2.3网络层
工作在网络层是ip协议 会给每个计算机分配一个ip地址 四位的点分十进制 0.0.0.0 - 255.255.255.255 192.168.1.2 前三位称之为网络号 最后一位称为主机号 由于c类地址是共享的 所以 单独使用网络号 是无法区分子网 所以引入了子网掩码 专门用来验证两个ip地址是否属于同一个子网 子网掩码 只是区分而已 具体如何找 得靠网络号 通过路由协议来找到对方的网关 有了ip协议之后 可以通过网络号来定位全球范围内的某个局域网 通过主机号 来定位局域网中具体的某台计算机 虽然可以定位到以太计算机 但是 无法定位到某个应用程序
2.4传输层
工作在传输层的两个协议 TCP/UDP 传输层要求必须为每一个需要联网应用程序绑定一个端口号 用于区分是哪一个应用程序 端口号就是一个整数 最大不超过65535 端口号在同一台计算机中不能重复 0 - 1024 是系统保留的端口 注意:不要使用常见的程序已经占用的端口 比如apache 的8080 mysql的 3306 FTP 21 这一堆网络协议 其实本质的就做两个事情 1.如何找到对方 2.数据如何发送 ip用来 标识一个局域网中的一台电脑 端口用于标识某个应用程序 至此 我们就可以准确的定位到某个计算机中的某个程序 TCP 是一种可靠的传输协议 可以保证数据传输是完整的 如何保证数据传输的完整的? TCP在传输数据前 会经过一个三次握手的过程 来验证数据传输是否可靠 在断开连接前 会经过四次挥手的过程 来保证数据完整传输了 在三次握手时 的确保证了数据传输是可靠 但是后续 有可能 由于种种原因 例如网络中断 ,,丢包等等 导致数据不完整 所以 TCP的解决方案 每次发送数据报 都需要对方返回一个确认信息 如果一段时间后 对方没有返回 就重复发送 直到重试的次数 超过某个指定的值 就判断连接已经丢失 TCP的优点: 可以保证数据完整性 由于需要接收确认信息 所以整体传输效率较低
基于tcp协议的套接字通信
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 买电话 AF_INET基于网络通信的套接字 # SOCK_STREAM流氏协议(tcp) SOCK_DGRAM报氏协议(udp) phone.bind(('127.0.0.1',8081)) #插手机卡,补充:0-65535 0-1024给系统用的 phone.listen(5) # 开机 这个5是控制最大的请求数,不是链接数,同一时间能来的请求数只有5 print('start...') conn,client_addr=phone.accept() # 等电话连接 print('连接来了:',conn,client_addr)#conn是一个套接字对象,定制了一个打印格式 # 收发消息 msg=conn.recv(1024) #收消息,1024是一个最大的限制 1024个字节 print('客户端的消息: ',msg) conn.send(msg+b'SB') # 挂电话 conn.close() # 关机 phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 phone.send('你好'.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
加上通信循环与连接循环
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8081)) phone.listen(5) print('start...') while True: # 连接循环 conn,client_addr=phone.accept() print('客户端 ',client_addr) while True: # 通信循环 try: msg=conn.recv(1024) print('客户端的消息: ',msg) conn.send(msg+b'SB') except ConnectionResetError: break conn.close() phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买电话 phone.connect(('127.0.0.1',8081)) # 拨电话,地址为服务端的ip和端口 while True: msg=input('>>>: ').strip() phone.send(msg.encode('utf-8')) # 发消息b'hello' data=phone.recv(1024) #收消息 print(data.decode('utf-8')) phone.close()
2.5远程执行命令的的程序
from socket import * import subprocess server=socket(AF_INET,SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) while True: conn,client_addr=server.accept() #(连接对象,客户端的ip和端口) print(client_addr) while True: try: cmd=conn.recv(1024) obj=subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout=obj.stdout.read() stderr=obj.stderr.read() # 先发送数据的长度 conn.send(stdout+stderr) except ConnectionResetError: break conn.close() server.close()
from socket import * client=socket(AF_INET,SOCK_STREAM) client.connect(('127.0.0.1',8080)) # print(client) while True: cmd=input('>>>: ').strip() client.send(cmd.encode('utf-8')) res=client.recv(1024) print(res) print(res.decode('gbk')) client.close()
三.网络通信实现
pass
四.网络通信流程
pass

浙公网安备 33010602011771号