愿浪飒精神伴你左右,网络安全之路任重而道远。

【Python“偷懒”入门专栏】网络编程

安全开发 alsly 2年前 (2022-11-14) 351次浏览 0个评论
文章目录[隐藏]

前提知识

什么是网络编程?首先我们需要了解什么叫做网络通信,什么是网络通信?首先我们需要了解什么叫做计算机网络,那什么叫做计算机网络?

计算机网络:

就是将计算机及其外部设备通过通信线路连接起来,通过一系列的操作,实现资源共享和信息传递的计算机系统。

网络通信:

就是让他们实现资源共享和资源传递。那通信需要解决什么问题?通信需要准确定位到网络上的目标,然后找到了该怎么通信的问题。

定位的实现的方式就是,通过ip和端口号。ip很好理解就是定位计算机,那端口是什么意思,端口是定位程序的进程。也就是通信,我们既要知道他计算机在哪里,同时也要知道要和哪个程序通信(因为我们知道一台计算机可以运行多个程序/软件)。

通信的实现的方式是通过制定网络通信协议。

了解以上两个概念,我们就可以来说一说什么是网络编程了,网络编程就是通过编程的方式来实现这个资源共享和信息传递的过程。清楚以上的概念,对于后续的编程理解能起到很关键的作用,我们从这里就可以推测,实现的编程的过程,要设定目标(通过ip和端口号),然后还得选择通信的协议。

再进一步的了解,大家可以去了解一下TCP/IP协议,以及建立连接的方式,TCP/IP三次握手。如果大家都不是很清楚,可以在下方留言,我之后再专门写一篇这方面的知识。

说到网络编程,我们不得不说另一个概念——Socket。Socket叫做套接字,套接字是一种具有“通信端点”的网络数据结构。简单的说,Socket,就像是我们的插座,我们要通电,得先插上插座才能通电。而要开始网络通信,就必须先创建套接字。

Python网络编程

好的,元规正传我们开始讲基于Python的网络编程。Python支AF_UNIX,AF_NETLINK和AF_INET三种,其中AF_INET是基于网络套接字,我们网络编程中基本都是使用这个套接字。

\P******ython使用socket模块实现网络编程****

1、导入模块:

From socket import *

2、创建套接字

S = socket(AF_INET,SOCK_STREAM),其中AF_INET是基于网络套接字,SOCK_STREAM是TCP类型,保证数据顺序以及可靠性。

第二个参数含有以下类型:

SOCK_STREAM是TCP类型,保证数据顺序以及可靠性;

SOCK_DGRAM是UDP类型,不保证数据接收的顺序,非可靠连接;

SOCK_RAW是原始类型,允许对底层协议如IP、ICMP进行直接访问,基本不会用到。

3、常用功能函数

bind() 应用于服务端,可以绑定socket的指定ip地址和端口,用于后续连接的建立

listen() 使用服务端开启TCP监听,监听客户端的请求

accept() 用于在TCP服务端接收连接,接收连接后返回一个新的套接字对象和ip地址,新的对象可以用于接收和发送数据

connect() 用于TCP客户端去连接服务端用的,参数为ip加端口,如果连接出错,返回socket.error错误

send() 用于使用TCP时,发送数据,返回发送的字节数量,但是可能发送不全

sendall() 用于使用TCP时,发送数据,成功返回None,失败抛出异常,会发送全部数据

recv() 用于使用TCP时,接收数据,参数包含能够接收的最大字节数,如:recv(1024)

sendto() 使用UDP时发送数据,每次发送都要指定地址

recvfrom() 使用UDP时接收数据

close() 关闭socket

4、理解连接的建立过程

*以TCP为例*

服务端:创建套接字->bind()绑定ip地址->listen()监听请求连接->accept()接收连接->send()/sendall()、recv()开始互相传送数据->任务结束close()关闭套接字

客户端:创建套接字->connect()向服务器请求连接->连接成功send()/sendall()、recv()开始互相传送数据->任务结束close()关闭套接字

可以看到,我们服务器的等待客户端的连接,他们的差别在于服务器时监听和接收连接,而客户端时请求连接。其他的内容基本一致。

简单的实例

服务端代码:

# coding=utf-8

from socket import *

host = '127.0.0.1' #指定本地回环地址作为服务端ip

port = 6666 # 指定6666端口为服务端的端口

s = socket() #创建socket,socket()未输入参数存在默认值,相当于socket(AF_INET,SOCK_STREAM)

s.bind((host,port)) #绑定ip和端口

s.listen() #等待客户端连接

while True:

print('等待连接中...')

c,addr = s.accept() #建立连接

print('连接过来的地址为:'+ str(addr))

c.send('欢迎与服务器建立连接!'.encode("UTF-8")) #发送数据

message = c.recv(1024) #接收数据

print('客户端发送的数据为:' + message.decode("UTF-8"))

c.close() #关闭套接字

客户端代码:

#coding=utf-8

from socket import *

host = '127.0.0.1' #指定本地回环地址作为服务端ip

port = 6666 # 指定6666端口为服务端的端口

s = socket() #创建socket,socket()未输入参数存在默认值,相当于socket(AF_INET,SOCK_STREAM)

s.connect((host,port)) #向服务端发起请求

print(s.recv(1024).decode("UTF-8")) #打印服务器发送的内容

s.send('你好,我是客户端'.encode("UTF-8")) #发送数据

s.close() #关闭套接字

运行情况:

运行服务端监听等待客户端连接

img

客户端发起连接,建立连接,接收连接,服务器继续监听等待连接

img

再次运行客户端,发现又建立了一次连接

img

小结

以上就建立了一个简单的连接,如果会使用有会使用虚拟机的,可以尝试修改服务器的地址,尝试使用不同虚拟机建立请求和连接。同时,可以尝试更加强大的功能,如:

1、建立连接后,想要发送的内容为我们手动输入的内容就像是短信这样

2、然后会发现只能你发一条,我发一条。或者有一方单方面的接收,这显然不是我们想要的。思考一下,如何建立能够像短信、qq这种即时通信一样,想发就能发,不受这个限制,效果如下(*提示:使用多线程*)。

img

3、建立连接后,可以发送信息进行命令执行,就和反弹shell类似,如下图

img

该操作可以回顾一下,【Python“偷懒”入门专栏】节约时间的文章,看看里面是怎么执行命令的。

Ok!本次文章到这里结束了,更多场景功能欢迎下方评论。


本文标题:【Python“偷懒”入门专栏】网络编程
本文链接:https://blog.langsasec.cn/index.php/2022/11/14/pyrmwlbc/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
喜欢 (2)
[]
分享 (0)
alsly
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址