網絡的目的是什麼?
用于資訊傳輸、接受 能把各個點、面、體的資訊連結到一起 實作資源的共享
OSI模型:
應用層:提供程式服務
表示層:資料加密、優化、壓縮
會話層:建立連結、傳輸服務
傳輸層:提供資料傳輸服務
網絡層:路由選擇 網路互聯
連表層:連結交換
實體層:硬體、接口、網卡規定等
特點:
将功能分開來達到高内聚低耦合
讓開發更為清晰
什麼是網絡協定?
是為了完成計算機網絡通訊而制定的規則、約定、标準
各模型使用的協定:
應用層:TFTP(檔案傳輸)、HTTP(超文本傳輸協定)、DNS(域名解析)、SMTP(郵件傳輸)
傳輸層:TCP(面向有連結的可靠的傳輸服務)、UDP(面向無連接配接的不可的傳輸靠服務)
網絡層:IP(IP位址)常用IPV4:點分十進制 取值0~256之間(32位) IPV6::128位
實體層:IEEE
特殊IP:
127.0.0.1 本機IP
0.0.0.0 自動使用本地可用網卡IP
192.168.1.0 代表網段
192.168.1.1 通常為網關位址
192.198.1.255 廣播位址
端口:
取值範圍1~65535之間
1~255 一些通用端口
256~1023 系統端口
1024~65535 自用端口
Linux指令:
ifconfig 檢視本機IP
ping IP 檢視延遲
ps -aux 檢視系統程序資訊
chmod 設定檔案權限
nice -9 ./hello.py 以9的優先級運作
pstree 檢視程序樹
ps -ajx 檢視父子程序ID
Linux下檔案類型:
bcd -lsp
b(快 裝置檔案)
c(字元裝置檔案)
d(目錄)
-(普通檔案)
l(連結檔案)
s(套接字檔案)
p(管道檔案)
ps -aux 查詢結果的 STAT表示程序狀态:
D 等待态 阻塞 不可中斷等待态
S 等待态 睡眠 可中斷等待态
T 等待态 暫停 暫停執行
R 運作态(就緒态)
Z 僵屍
+ 前台程序(在終端運作)
< 有較高優先級的程序
N 較低優先級的程序
s 回話組
l 有子程序連結
程序優先級:
取值範圍:-20~19 -20最高
Python socket子產品
socket.gethostname() 擷取本機名
socket.gethostbyname("主機名") 利用主機名擷取IP
soccket.gethostbtname(“IP”) 擷取本地IP
IP的十六進制轉換:
socket.inet_aton(IP) 十進制轉十六進制
socket.inet_atoa(十六進制) 十六進制轉十進制
socket.gethostbyaddr('127.0.0.1')
傳回值:元組(主機, 别名,ip位址)
socket.getservbyname("程式名") 擷取程式端口
套接字:是通過程式設計語言提供的套接字程式設計借口
傳輸層服務:
tcp:(SOCK_STREAM)
面向有連結的可靠的傳輸服務 流式套接字
1.建立套接字:
socket = socket.socket()
2.綁定位址:
socket.bind
3.設定監聽:
socket.listen()
4.等待用戶端連結:
socket.accept()
5.消息收發:
socket.recv(4096)
socket.send(“”)
6.關閉套接字:
socket.close()
用戶端:
1.建立套接字
socket.socket.socket()
2.發起連結
socket.connect(位址)
3.消息收發
socket.recv(1024) 收消息
socket.send("") 發消息
socket.sendall():
事物發消息 成功傳回None 失敗異常
4.關閉套接字
socket.close()
recv特性:
建立連結的另一端被斷開,會傳回一個空字元串 從緩沖區取内容
send特性:
另一端不純在産生一個pipe Broken 異常 向緩沖區寫内容
緩沖區:
減少和和磁盤互動協調資料收發 提高效率
粘包:
由于tcp是資料流套接字的原因每次發送的資料間
沒有邊界一次取不完下次取資料時會形成粘包
udp:(SOCK_DGRAM)
面向無連接配接的不可靠的傳輸服務 資料報套接字
socket = socket.socket(AF_INET,SOCK_DGRAM)
socket.bind()
3.收發消息:
socket.recvfrom()
socket.sento()
4.關閉套接字:
1.建立套接字:
socket = socket.socket()
2.收發消息;
socket.recvform()
socket.sendto(“”, 位址)
3.關閉套接字:
socket.close()
sys.argv() 指令行擷取參數
傳回值:
元組:sys.argv[0] 開始 空格隔開 引号隔開
套接字屬性方法:
套接字的屬性:
socket.type
位址類型:
socket.family
套接字IO描述符:
socket.fileno()
系統IO描述符:
sys.stdin = 0
sys.stdout = 1
sys.stderr = 2
擷取套接字位址:
socket.getsockname()
擷取套接字用戶端位址:
socket.getpeername()
設定端口重用:
socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
擷取套接字選項值:
socket.getsockopt()
設定為非阻塞狀态:
socket.setblocking(False)
逾時檢測:
socket.settimeout(sec)
HTTP協定(超文本傳輸協定):
網站浏覽器擷取網頁的一種協定
并且所有的www.檔案都必須遵守這個标準
HTTP請求:
1.請求行:
說明具體的請求類别和内容
GET /index.html /HTTP/1.1
請求類别 請求内容 協定版本
請求類别:
GET: 擷取網絡資源
POST: 送出一定的附加資料
HEAD: 擷取響應頭
PUT: 更新伺服器資源
DELETE: 删除伺服器資源
CONNECT: 未使用
TRACE: 用于測試
OPTIONS: 擷取伺服器性能資訊
2.請求頭:
對請求的具體描述
3.空行
4.請求體:
具體的參數或送出的内容
HTTP響應:
1.響應行:回報具體的響應情況
HTTP/1.1 20 OK
版本協定 響應碼 附加資訊
響應嗎:
1xx:提示資訊,表示請求已經接收
2xx:響應成功
3xx:響應需要定向(重新記載連結第三方連結)
4xx:用戶端錯誤
5xx:伺服器端錯誤
2.響應頭:
對響應内容的具體描述
4.響應體:
将用戶端請求内容進行傳回
IO:
在記憶體中存在資料交換的操作可以認為是IO操作(輸入輸出)
IO密集程式:
大量的IO操作,消耗CPU較少
CPU密集程式:
大量的記憶體CPU運算,IO相對較少
IO分類:
阻塞IO:
因為某些條件沒有達成 導緻程式堵塞 如:input函數
非阻塞IO:
改變阻塞函數的狀态不讓其阻塞
IO多路複用:
通過一個監測
監控多個IO事件的行為,
哪個IO事件準備就緒就執行哪個IO事件
IO準備就緒:
IO事件即将發生時的臨界狀态
select子產品
監控IO事件
rs, ws, xs = select(rlist, wlist, xlist[, timeout])
rlist: 等待處理的IO
wlist: 主動處理的IO
xlist: 出錯希望去處理的IO
位運算:
按照二進制位進行位運算操作
& 按為與 | 按位或 ^ 按位異或 << 左異 >>右移
poll方法實作IO多路複用:
1.建立poll對象:
p = select.poll
2.注冊關注的IO:
p.register(s, POLLIN | PLLERR)
不關注:
p.unregister(s)
事件類别:
POLLIN POLLOUT POLLERR POLLHUP POLLPRI
rlist wlist xlist 斷開 緊急處理
3.監控IO:
events = p.poll()
功能:監控關注的IO事件
傳回值:
傳回發生IO事件
events是一個清單[(fileno, evnet), (), ()....]
每個就緒IO對應一個元組(描述符,就緒事件)
IO地圖:{s.fileno():s}
4.處理IO事件
本地套接字:
作用:
用于本地檔案不同程式間進行資料傳輸
本地套接字傳輸流程:
1.建立本地套接字對象
sockfd = socket(AF_UNIX, SOCK_STREAM)
2.綁定套接字檔案,如果檔案不存在則自動建立 存在則報錯
sockfd.bind(file)
3.監聽
listen
4.消息收發
recv send
多任務程式設計:
通過程式利用計算機的多個核心達到同時執行多個任務的目的
是以達到提升程式運作效率的目的
并行:
多個計算機核心在同時處理多個任務,
這時多個任務之間是并行關系
并發:
同時運作多個任務,核心在多個任務之間的不斷切換,
達到多個任務都會執行的處理效果
此時多個任務之間是并發關系
程式:
可執行檔案,是靜态的,隻占有磁盤
程序:
是一個動态過程 程式的運作過程
CPU時間片:
如果有個程序占有CPU此時我們稱為該程序占有CPU的時間片
多個程序任務或輪流占有CPU時間片并形成并發效果
程序特征:
程序是作業系統配置設定資源的最小單元
每個程序擁有自己獨立的運作空間(4個G的虛拟記憶體空間)
程序之間互相獨立各不影響
程序的狀态:
三态:
就緒狀态:
程序具備執行條件,等待系統配置設定處理器資源進入運作态
運作态:
程序占有CPU處于運作狀态
等待态:
程序暫時不具備運作條件,需要阻塞等待
五态:
在三态的基礎上增加建立和終止态
建立:
建立一個新的程式,擷取系統資源的過程
終止:
程序執行結束,釋放資源的過程
OS子產品:
判斷一個檔案是否存在:
os.path.exists(file)
删除檔案:
os.remove(file)
os.unlink(file)
建立程序:
os.fork()
擷取程序id:
os.getpid()
擷取父程序id:
os.getppid()
退出一個程序:
os.exit()
sys.exit(退出提示)
sys.exit() 可以通過捕獲 SystemExit異常退出
孤兒程序:
當父程序優先于子程序退出,此時子程序就會成為孤兒程序
孤兒程序會被系統指定程序收養 退出後會自動處理
僵屍程序:
當子程序優先于父程序退出,父程序沒有處理子程序的退出狀态
就會變成僵屍程序 僵屍程序會滞留PCB 消耗記憶體資源
如何避免僵屍程序的産生:
1.父程序先退出
2.父程序處理子程序狀态
處理僵屍程序:
PID,status = os.wait():
wait 在父程序中阻塞等待處理子程序的退出
傳回退的子程序的怕pid和退出狀态
pid,status = os.waitpid(pid,option):
waitpid 在父程序阻塞等待處理子程序的退出
參數 :
pid -1 表示等待任意子程序退出
>0 表示等待對應PID号的子程序退出 option
0 表示阻塞等待 WNOHANG 表示非阻塞
利用二級子程序:
父程序建立子程序等待程序退出
子程序建立下一個程序,然後立即退出
二級子程序成為孤兒程序 處理具體工作
multiprocessing子產品
process()
功能:
建立程序對象
參數:
target:函數對象
name 給程序新名稱()
args:元組 用來給target函數位置傳參
kwargs:字典 用來給target函數鍵值傳參
啟動程序:
p.start()
調用綁定函數有子程序運作
等待子程序退出:
p.join([逾時檢測])
不使用join回收可能後産生僵屍程序
使用multiprocessing建立程序子程序同樣複制父程序的全部記憶體空間
之後有自己的獨立空間 執行上互不幹擾 子程序也有自己的PID特有資源等
使用multiprocessing建立子程序,一般父程序功能就是隻用來建立子程序
回收子程序,傳回事件交給子程序完成