標籤:encode make tcp 擷取 區域網路 問題 電訊號 連網 udp協議
作業系統是管理和控制電腦的硬體與軟體資源的電腦程式。互連網的本質就是一系列的網路通訊協定。互連網協議按照功能能分為七層:應、表、會、傳、網、數、物
每層常見物理裝置:
傳輸層——》四層交換器、四層路由器
網路層——》路由器,三層交換器
資料連結層——》橋接器、以太交換器,網卡
物理層——》中繼器,集線器,雙絞線
物理層
物理層功能:主要基於電器特性發送高低電壓訊號
資料連結層
資料連結層規定了電訊號多少位一組,每組的意思。(即定義了電訊號的分組方式)
乙太網路協議(ethernet)規定:
。一組電訊號構成一個資料報,也叫“幀”
。每一資料幀分為前序和資料data兩部分,
前序(head):
。源地址,6位元組
。目標地址,6位元組
。資料類型,6位元組
資料data:
最短46位元組,最長1500位元組,head長度+data長度=最短64位元組,最長1518位元組,超過最大限制就分區發送
Mac地址:
head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網卡,發送端和接收端的地址便是指網卡的地址,即mac地址
mac地址:每塊網卡出廠時都被燒制上一個世界唯一的mac地址,長度為48位2進位,通常由12位16進位數表示(前六位是廠商編號,後六位是流水線號)
廣播:
有了mac地址,同一網路內的兩台主機就可以通訊了(一台主機通過arp協議擷取另一台主機的mac地址)
Arp協議是廣播的方式發送資料包,擷取目標主機的mac地址。
協議的工作方式是每台主機的ip都是已知的。
例如:主機172.16.10.10/24訪問172.16.10.11/24
一:首先通過ip地址和子網路遮罩區分出自己所處的子網
情境 資料包地址
同一子網 目標主機mac,目標主機ip
不同子網 網關mac, 目標主機ip
二:分析172.16.10.10/24與172.16.10.11/24處於同一網路(如果不是同一網路,那麼下表中目標ip為172.16.10.1,通過arp擷取的是網關的mac)
源mac 目標mac 源ip 目標ip 資料部分
發送端主機 發送端mac FF:FF:FF:FF:FF:FF 172.16.10.10/24 172.16.10.11/24 資料
三:這個包會以廣播的方式在發送端所處的自網內傳輸,所有主機接收後拆開包,發現目標ip為自己的,就響應,返回自己的mac
網路層
世界範圍的互連網是由彼此隔離的小的區域網路組成的,乙太網路只能在同一區域網路內發送,一個區域網路是一個廣播域,乙太網路的廣播包只能在一個廣播域內發送,跨廣播域通訊只能通過路由轉寄。
問題是必須找到一種方法區分電腦在哪個廣播域內?
採用路由的方式(向不同的廣播域/子網分發資料包),mac是無法區分的,它只與廠商有關。網路層功能:引入一套新的地址用於區分不同廣播域/子網,這就是網路地址。
Ip地址分為:
網路部分:標識子網
主機部分:標識主機
IP資料包分為head和data兩部分,無需為ip包定義單獨的欄位,直接放入乙太網路包的data部分。Head長度為20到60位元組,data的長度為65515位元組,而乙太網路資料包的資料部分最長只有1500位元組,因此如果ip資料包過長就會被分割成幾個資料包分開發送。
注意:單純的ip位址區段只是標識了ip地址的種類,從網路部分或主機部分都無法辨識一個ip所處的子網
例:172.16.10.1與172.16.10.2並不能確定二者處於同一子網
子網路遮罩:
子網路遮罩就是表示子網特徵的一個參數。它在形式上等同於IP地址,也是一個32位位元字,它的網路部分全部為1,主機部分全部為0。比如,IP地址172.16.10.1,如果已知網路部分是前24位,主機部分是後8位,那麼子網路遮罩就是11111111.11111111.11111111.00000000,寫成十進位就是255.255.255.0。
通過子網路遮罩我們就能通過AND方法判斷任意兩個IP地址是否處於同一子網。
IP協議的作用就是:一是為每台電腦分配IP地址,另一個是確定那些地址在同一子網。
傳輸層
網路層的ip用來區分子網,乙太網路的mac用於找主機,而標識一台機器上的某一應用程式就要用連接埠,連接埠即應用程式與網卡關聯的編號。
連接埠範圍是0-65535 ,0-1023為系統佔用的連接埠
TCP協議是可靠傳輸,TCP資料包是沒有長度限制的,理論上可以是無限長,但是為了網路效率,通常TCP資料包長度不會超過IP資料包長度。
UDP協議是不可靠傳輸,前序只有8位元組,總長不超過65535位元組,正好放進ip資料包。
TCP協議:乙太網路頭 IP頭 TCP頭 資料
UDP協議:乙太網路頭 IP頭 UDP頭 資料
應用程式層
應用程式層的作用在於規定應用程式的資料格式。
Socket(通訊端)
Socket是在應用程式層和傳輸層之間的一個抽象層,把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用程式層調用以實現進程在網路中通訊。
通訊端有兩種,分為基於檔案型和基於網路型。
伺服器端:先初始化socket,然後與連接埠綁定(bind),對連接埠進行監聽(listen),調用accept阻塞,等待客戶機串連。這時如果用戶端初始化一個socket,然後串連伺服器(connect),如果串連成功,這時用戶端與伺服器之間的串連就建立了。用戶端發送資料,服務端接受並處理請求,然後把回應資料發送到用戶端,用戶端讀取資料,關閉串連,一次互動結束。
服務端通訊端函數
s.bind() 綁定(主機,連接埠號碼)到通訊端
s.listen() 開始TCP監聽
s.accept() 被動接受TCP客戶的串連,(阻塞式)等待串連的到來
用戶端通訊端函數
s.connect() 主動初始化TCP伺服器串連
s.connect_ex() connect()函數的擴充版本,出錯時返回出錯碼,而不是拋出異常
公用用途的通訊端函數
s.recv() 接收TCP資料
s.send() 發送TCP資料(send在待發送資料量大於己端緩衝區剩餘空間時,資料丟失,不會發完)
s.sendall() 發送完整的TCP資料(本質就是迴圈調用send,sendall在待發送資料量大於己端緩衝區剩餘空間時,資料不丟失,迴圈調用send直到發完)
s.recvfrom() 接收UDP資料
s.sendto() 發送UDP資料
s.getpeername() 串連到當前通訊端的遠端的地址
s.getsockname() 當前通訊端的地址
s.getsockopt() 返回指定通訊端的參數
s.setsockopt() 設定指定通訊端的參數
s.close() 關閉通訊端
面向鎖的通訊端方法
s.setblocking() 設定通訊端的阻塞與非阻塞模式
s.settimeout() 設定阻塞通訊端操作的逾時時間
s.gettimeout() 得到阻塞通訊端操作的逾時時間
面向檔案的通訊端的函數
s.fileno() 通訊端的檔案描述符
s.makefile() 建立一個與該通訊端相關的檔案
TCP是基於串連的,必須先啟動伺服器,然後再啟動用戶端串連伺服器。
UDP是不需連線的,無論先啟動哪一端都不會報錯。
伺服器
import socket
inp_port=(‘127.0.0.1‘,8080)
BUFSIZE=1024
udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server.bind(inp_port)
while True:
msg,addr=udp_server.recvfrom(BUFSIZE)
print(msg,addr)
udp_server.sendto(msg.upper(),addr)
用戶端
import socket
ip_port=(‘127.0.0.1‘,8080)
BUFSIZE=1024
udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg=input(‘>>‘).strip()
if not msg:
continue
udp_client.sendto(msg.encode(‘utf-8‘),ip_port)
msg,addr=udp_client.recvfrom(BUFSIZE)
print(msg.decode(‘utf-8‘),addr)
Python之網路編程