物理層規定物理介質的相關規範 好比網線接口是什麼樣的 有幾根線程序員
問題:沒法理解單純的二進制數據服務器
工做在這一層的是以太網網絡
規定一組電信號有多少位架構
每一組電信號包含什麼樣的內容socket
每一臺電腦必須擁有一個全球惟一的mac地址(能夠有多個) ide
經過廣播的方式來找到對方的mac地址函數
問題:不可能 全球廣播 會形成廣播風暴(廣播太多 網絡癱瘓)學習
工做在這一層的是ip地址spa
網絡地址協議code
給每一給計算機分配一個ip地址
一般是ipv4
0.0.0.0-255.255.255.255
前三段爲網絡號
後一段爲主機號
子網掩碼來判斷是否處於同一個局域網
arp協議把ip轉成mac地址的協議
ip協議主要的目的就是 找到全球範圍內的某一個局域網存在某一臺具體的計算機
問題:一個數據包到達對方計算機後到底交給哪一個應用程序來處理
TCP UDP
用於規範數據傳輸方式,以及識別應用程序(端口號)
TCP:可靠,效率低 由於其須要不斷的發送確認信息
適用於:對數據完整性高的程序 好比支付數據 文字信息
UDP:不可靠傳輸,效率高於TCP 徹底不關心 對方是否收到數據發送到網絡中就完事
適用於:視頻聊天 語音 即時對戰遊戲
至關於對講機 bp機
主要用於規定雙方應用程序之間以什麼形式來傳輸數據
這一層的數據形式是有程序員本身制定的常見有HTTP FTP EMAIL等等
封裝了傳輸層一堆協議的模塊
何時使用
當你須要開發一款 C/S架構的應用程序的時候 就須要它
基於C/S架構的應用程序 須要分別開發服務器和客戶端程序
學習的重點就是 如何使用socket編寫服務器程序以及如何使用socket編寫客戶端程序
一般應該先開發服務器
import socket ''' 1.買一個手機 2.買一個手機卡 3.開機待機 4.接通電話 5.嘮嗑 6.掛電話 7.關機 ''' # 1.買一個手機 # 默認狀況下建立的是基於強羅的TCP協議的socket對象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 參數1:協議家族 網絡的爲AF_INET # 參數2:type 用於設置採用的傳輸協議 TCP的爲SOCK_STREAM UDP的爲SOCK_DGRAM # 其他參數默認便可 # 端口號取值 0-65535 0-1023 是系統保留的 # 重用端口號當你已經關閉了服務器 可是仍是報異常說 端口占用 時 可使用 s.setsockopt() s.bind(('192.168.14.56', 8006))#也是一個阻塞的函數會一直等到 s.listen() # 監聽客戶端的鏈接 # c_client 當接收到請求時會返回一個表示客戶端的socket對象 # 客戶端的socket對象就負責 這個客戶端的數據收發 # c_address同時返回對方的ip和端口 打包成元組 c_client, c_address = s.accept() # 接收客戶端的鏈接請求 該函數會阻塞 直到有鏈接 # 開始收發數據 # recv接收數據 # buffersize緩衝區大小 data = c_client.recv(1024) print(data) # 斷開與這個客戶端的鏈接 c_client.close() # 關閉服務器 socket 後續的客戶端就沒法子啊鏈接到服務器了 # 通常正常服務器時不關的 s.close() # 關機
'''
服務器程序的大體流程
1.建立socket獨享
2.綁定ip和port
3.監聽鏈接
4.接受請求
5.接收數據
6.斷開鏈接
'''
import socket # 建立socket對象 c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 與服務器創立鏈接 傳入服務器的ip和端口 c.connect(('127.0.0.1', 8006)) # 收發數據 只能發送bytes類型的數據(任何數據都能發) c.send('hello'.encode('utf-8')) # 斷開與服務器來鏈接 c.close()
import socket s = socket.socket() s.bind(('127.0.0.1', 8888)) s.listen() while True: c, address = s.accept() print('收到請求') while True: try: data = c.recv(1024) if not data: print('客戶端下線了!') break print('收到一個數據', data.decode('utf-8')) data += b'dsb' c.send(data) except ConnectionResetError: print('對方異常斷開鏈接!') break
import socket s = socket.socket() s.connect(('127.0.01', 8888)) while True: res = input('>>>(退出):').strip() if res == 'q': break if not res: continue s.send(res.encode('utf-8')) data = s.recv(1024) print(data)