1. 程式人生 > >傳輸模型與套接字

傳輸模型與套接字

傳輸模型

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()#關閉連線