傳輸模型與套接字
阿新 • • 發佈:2018-12-31
傳輸模型
1.概念:
OSI模型:用來協調程序間通訊標準的制訂,並沒有提供一個實現的方法,事實上的標準就是tcp/ip參考模型
tcp/ip模型:tcp/ip協議不是tcp和ip兩個協議的合稱,而是指因特網整個tcp/ip協議族
2.模型對比:
osi七層模型 tcp/ip
應用層 應用層
表示層
會話層
傳輸層:終端裝置 傳輸層
網路層:路由器 網路層
資料鏈路層:交換機 網路介面層
物理層:網絡卡,網線等
tcp協議
1.概念:(傳輸控制協議) tcp是一種面向連線的,可靠地,基於位元組流的傳輸層通訊協議 2.要點: tcp/ip模型(常用):網路介面層,網路層,傳輸層,應用層 tcp協議:傳輸層的通訊協議包括:http協議,ftp協議,smtp協議,應用層傳輸協議 tcp協議是面向連線的 三次握手:建立連線
四次揮手:斷開連線
3.udp
網際網路的傳輸資料主要有兩個協議,tcp,udp
udp是無連線的,只管發,不考慮收不收得到,傳輸效率差,傳送效率高
資料完整性安全:tcp
完整性不高,效率高:udp(直播,實時視訊,監控)
ip地址和埠
ip
1.概念: ip地址是指網際網路協議地址,ip是給網際網路上的電腦的一個編號,用來表示它實際的實體地址 - 2.ip地址的格式 ip地址是32位的二進位制數,通常分隔成四個八位二進位制數,也就是四個位元組,通常用“點分十進位制”表示成(a.b.c.d),其中a,b,c,d都是0-255 之間的十進位制整數,如:192.168.1.1 ip地址包含兩個部分,一個網路ID,一個主機id - 3.按照網路規模分類: - A類地址:大型網路255*255*255 - B類地址:中255*255 - C類地址:小255 4.用途; - 公有地址:在網際網路上使用的地址 - 私有地址:在區域網內使用的地址
埠:
1.概念:裝置與外界交流的出口,埠可分為虛擬埠和物理埠 物理埠:又叫介面,是可見埠,計算機背板的rj45網口,交換機路由器集線器等rj45埠 虛擬埠:計算機內部或交換機路由器內的埠,通過軟體虛擬出來的,不可見,如80埠,21埠,23埠等。 - 我們主要學虛擬埠 - 計算機中有2^16個埠,埠是整數,範圍:0-65535 - 埠只能被一個應用程式所佔用 電腦中的各種程式去提供對外的服務 2.分類:(擴充套件) 1.周知埠 眾所周知的埠,範圍0-1023,系統服務用的埠,不要隨意改動和使用 2.動態埠 範圍49152-65535 之所以稱之為動態埠,因為它一般不分配給固定的服務,由系統隨機動態的指定,比如多執行緒 3.註冊埠 1024-49151 分配給使用者程序或應用程式使用的埠 這些程序主要是使用者選擇安裝的一些應用程式,而不是已經分配好了公認埠的常用程式 這些埠在沒有被伺服器資源佔用的時候,可以用使用者端動態選用為源埠
套接字*
本質上是介面,封裝了tcp/udp,提供了傳送,接收的功能,大大地簡化了我們開發程式的難度
socket基於tcp或udp
python來實現tcp_server
#建立套接字socket
import socket
#server = socket.socket(
#family=socket.AF_INET,
#type=socket.SOCK_DGRAM #代表了udp
#type=socket.SOCK_STREAM #tcp 預設
- 建立tcp伺服器
1.建立socket
2.繫結埠
3.監聽
4.接收連線
5.收發資料
6.迴圈4,5
編寫一個tcp的服務端
import socket
#1.建立socket物件
tcp_server = socket.socket()
#2.繫結ip埠
#ip可以是127.0.0.1 代表只監聽本地
#ip可以寫區域網ip,當前區域網的其他電腦可以來訪問
#ip可以寫成‘ ’或者‘0.0.0.0’ ,這臺電腦的所有的網絡卡來的資料都可以
tcp_server.bind((' ',6969))
#3.監聽
#backlog代表等待佇列
tcp_server.listen(5)
while True:
#4.等待連結
print("等待連線")
conn,addr = tcp_server.accept() #阻塞
#建立一個對等的socket物件,用來和客戶端進行資料互動
#5.收發資料
print("有客戶%s連線進來了"%addr[0])
while True:
#先接受
data = conn.recv(1024) #也是阻塞,一般設定1024位元組
#收到的也是位元組型別
print(data.decode("utf-8"))
info = "xiaoge"
if data:
print("從%s接受了:%s" % (addr[0],data.decode("utf-8")))
conn.send(data) #傳送的也是位元組資料
else:
conn.close()
print("客戶%s關閉了"%addr[0])
break
#客戶端,服務端收發資料的規則,流程,這個其實就是我們常說的應用協議,http,ftp,收發是最底層
建立tcp客戶端
import socket
1.建立socket
client = socket.socket()
2.連線
client.connect(("127.0.0.1",6969))#訪問本地
while True:
data = input(">>>:")
if data == "q":
break
3.發資料
client.send(data.encode())#傳送位元組型別的資料
4.收資料
res = client.recv(1024)
print(res.decode("utf-8"))
client.close()#關閉連線