29 網絡相關知識 socket
主要內容:
1 . 網絡基礎相關的知識
a : 架構
@C/S架構 : client 客戶端和 server服務器端
優勢 : 能充分發揮pc機的性能
@B/S架構 : browser瀏覽器 和server 服務器 隸屬於C/S架構
優勢 : 統一了應用的接口
b : 通信的知識
@ 同一個電腦上兩個py程序通信 : 打開一個文件
@兩個電腦的通信: 連接一個網線
@多個電腦通信:
例如 : 電腦一要找電腦二(過程)
1) : 電腦首先發送一個請求幀,其中包含(我的ip地址是192.168.10.104,我的mac地址是xxxxx,我要找的ip地址為192.168.12.4),將此要求發給交換機.
2) :交換機要廣播這條消息,給其他的電腦.
3) :目標主機接收到交換機傳來的消息後,對比發現自己就是被找的主機, 回復給交換 機信息(我的ip地址是192.168.12.4,我的mac地址是yyyy,請回復給ip地址為192.168.10.104,mac地址為xxxx的主機)
4) :交換機以單薄形式返給源主機.
c : 知識點的總結
@ mac地址 : 是一個物理地址 ,全球唯一 ,類似於身份證
@ ip地址 : 是一個四點分十進制, 它標識了計算機在網絡中的位置, 類似於學號.
@ 交換機的通信方式: 廣播 : 吼一嗓子 單薄 : 一對一 組播 : 一對多
@ arp協議 : 通過目標ip地址獲取目標mac地址的一個協議
@ 端口 : 操作系統為本機上每一個運行的程序都隨機分配一個端口,其他電腦上的程序可以通過端口獲取到
到這個程序. (ip地址 + 端口 能唯一找到某臺電腦上的某一個服務程序)
@ 路由器 : 連接不同網段 , 路由
@ 網關 : 類似於一個局域網的出口和入口
@ 網段 : 一個局域網內的ip地址範圍
@ 子網掩碼 : 子網掩碼 & ip地址 可以得到網段
@ osi 五層模型 :
應用層 : http / https / ftp
傳輸層 : tcp / udp 四層交換機 / 四層路由器
網絡層 : ip協議 路由器 / 三層交換機
數據鏈路層 : 傳輸電信號 集線器 / 網線 / 光纖
2 . socket 模塊 : 同一臺主機上多個應用程序之間的通信,也被成為進程間通訊 (IPC).套接字包括兩種 :基於文件類型和 網絡類型的套接字
a : socket 是一個模塊 又叫套接字.
sk = socket . socket(family = AF_INET , type = SOCK_STREAM)
family : 一種是:AF_UNIX基於文件類型的套接字 (早期socket 是源自於unix系統而研發的一個功能, 主要是為了同一臺電腦上,多個程序直接通信) unix系統的中心思想是 : 一切皆文件
一種是 :AF_INET 基於網絡類型的套接字
type : 一種是基於TCP協議 SOCK_STREAM
一種是基於UDP協議 DGRAM
b : TCP/ UDP協議的區別 :
tcp 協議 : TCP(Transmission Control Protocol)可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸 程序。UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,並盡可能快地把它扔到網絡上
udp協議 : UDP(User Datagram Protocol)不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。使用UDP的應用:域名 系統 (DNS);視頻流;IP語音(VoIP) udp協議在收發數據前,必須和對方建立可靠的連接。
c : 基於tcp協議的socket : tcp是基於鏈接的,必須先啟動服務端,然後再啟動客戶端去鏈接服務端
服務端 :
import socket sk = socket.socket() #<socket.socket fd=132, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0> print(sk) sk.bind((‘192.168.12.75‘, 12012)) #把地址綁定到套接字 sk.listen() #偵聽客戶的請求 conn, addr = sk.accept() #接收客戶端的鏈接 ret = conn.recv(1024) #接收客戶端的信息 print(ret) print(‘coon:>>>‘,conn) #<socket.socket fd=464, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘192.168.12.75‘, 12012), raddr=(‘192.168.12.75‘, 13041)> print(‘addr:>>>‘,addr) conn.send(b‘qwertyuiop‘) #向客戶端發送信息 #(‘192.168.12.75‘, 13041) conn.close() #關閉客戶端套接字 sk.close() #關閉服務器套接字
客戶端 :
import socket sk = socket.socket() print(sk) sk.connect((‘192.168.12.75‘,12012)) sk.send(b‘send information‘) s = sk.recv(102) print(s) #接收服務器發送的信息 sk.close()
加入一條socket配置 ,重用ip和端口
#加入一條socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) sk.bind((‘192.168.12.75‘,8898)) #把地址綁定到套接字 sk.listen() #監聽鏈接 conn,addr = sk.accept() #接受客戶端鏈接 ret = conn.recv(1024) #接收客戶端信息 print(ret.decode(‘utf-8‘)) #打印客戶端信息 # conn.send(b‘hi‘) #向客戶端發送信息 conn.close() #關閉客戶端套接字 sk.close() #關閉服務器套接字(可選)
e : 基於dup協議的socket :udp是無鏈接的,啟動服務之後可以直接接受消息,不需要提前建立鏈接
服務器端 :
import socket udp_sk = socket.socket(type=socket.SOCK_DGRAM) #創建一個服務器的套接字 udp_sk.bind((‘192.168.12.75‘,9000)) #綁定服務器套接字 s = udp_sk.recvfrom(1024) print(s) udp_sk.close()
客戶端:
import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.sendto(b‘serfdf‘,(‘192.168.12.75‘,9000)) sk.close()
3 . 交換機與路由器的區別:
a : 交換機工作在中繼層,交換機根據MAC地址尋址。路由器工作在網絡層,根據IP地址尋址,路由器可以處理TCP/IP協議,而交換機不可以。
b : 路由器可以給你的局域網自動分配IP,虛擬撥號,就像一個交通警察,指揮著你的電腦該往哪走,你自己不用操心那麽多了。交換機只是用來分配網絡數據的。
c : .交換機在中繼層,交換機根據MAC地址尋址。路由器可以把一個IP分配給很多個主機使用,這些主機對外只表現出一個IP。交換機可以把很多主機連起來,這些主機對外各有各的IP。
29 網絡相關知識 socket