1. TCP協議 / UDP協議
1.1 TCP協議
-
1.可靠、慢、全雙工通信
-
2.建立連接的時候 : 三次握手
-
3.斷開連接的時候 : 四次揮手
-
4.在建立起連接之后
-
發送的每一條信息都有回執
-
為了保證數據的完整性,還有重傳機制
-
-
5.長連接 :會一直占用雙方的端口
-
6.IO(input,output)操作,輸入和輸出是相對內存來說的
-
write / send -----> 輸出 output
-
read / recv ------> 輸入 input
-
-
7.能夠傳遞的數據長度幾乎沒有限制
1.2 UDP協議
- 1.無連接的 速度快
- 2.可能會丟消息
- 3.能夠傳遞的數據的長度是有限的,是根據數據傳遞設備的設置有關系
1.3 應用場景
- TCP 文件的上傳下載(發送郵件、網盤、緩存電影)
- UDP 即時通信類的(qq、微信、飛秋)
2. osi七層模型 /osi五層協議
osi七層模型 | osi五層協議 | 協議 | 物理設備 | |
---|---|---|---|---|
應用層 表示層 會話層 (三層總結成一層) |
五層 | 應用層 | http / https / ftp / smtp 協議 python代碼:hello |
|
傳輸層 | 四層 | 傳輸層 | tcp協議 / udp協議 端口 | 四層路由器、四層交換機 |
網絡層 | 三層 | 網絡層 | ipv4 / ipv6 協議 | (三層)路由器、三層交換機 |
數據鏈路層 | 二層 | 數據鏈路層 | mac地址 arp協議 | 網卡、(二層)交換機 |
物理層 | 一層 | 物理層 |
3. socket(套接字)
socket 是一個工作在應用層和傳輸層之間的抽象層。
- 幫助我們完成了所有信息的組織和拼接
- sokcet對於程序員來說 已經是網絡操作的底層了
socket歷史:
- (初期)基於文件通信 -------- 完成同一台機器上的兩個服務之間的通信的
- (現在)基於網路通信 -------- 完成了多台機器之間的多個服務通信
3.1 socket用於TCP協議
# server.py 服務端
import socket
sk = socket.socket()
# socket()參數中:family(基於……通信)=AF_INET(網絡通信), type(協議)=SOCK_STREAM(TCP協議),TCP協議默認不用寫,如果想要寫協議必須是:type=socket.SOCK_STREAM
sk.bind(('192.168.12.25',9000))
sk.listen()
while True:
conn,addr = sk.accept()
while True:
msg = conn.recv(1024)
if msg.decode('utf-8').upper() == 'Q':
break
print(msg.decode('utf-8'))
cont = input('內容(輸入Q斷開):')
conn.send(cont.encode('utf-8'))
if cont.upper() == 'Q':
break
conn.close()
sk.close()
# client.py 客戶端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
msg = sk.recv(1024)
if msg.decode('utf-8').upper() == 'Q':
break
print(msg.decode('utf-8'))
cont = input('內容(輸入Q斷開):')
sk.send(cont.encode('utf-8'))
if cont.upper() == 'Q':
break
sk.close()
sk.accept() 與 sk.connect() 是建立三次握手的過程
3.2 socket用於UDP協議
# server.py 服務端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM) # UDP協議必須加上 type=socket.SOCK_DGRAM
sk.bind(('127.0.0.1',9000))
while True:
msg,client_addr = sk.recvfrom(1024) # recvfrom用於不知道對方ip時,獲取到ip給client_addr
msg = msg.decode('utf-8')
print(msg)
msg1 = input('>>>').encode('utf-8')
sk.sendto(msg1,client_addr)
sk.close()
# client.py 客戶端
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
while True:
inp = input('>>>').encode('utf-8')
sk.sendto(inp,('127.0.0.1',9000))
msg = sk.recv(1024).decode('utf-8') # 這里不需要使用recvfrom,因為知道對方ip地址
print(msg)
sk.close()