一 五層協議詳解:網絡
物理層 電信號:01010101101 a - 97socket
數據鏈路層 對電信號 分組 使數字有意義 分組協議 = Ethernet協議 = 以太網協議 -> 網卡 mac地址(惟一的) mac(同一個子網)
head(18字節 = 6 源地址(mac) 6 目標地址(mac) 6 數據的描述) + data mac_head + ip_head + data
以太網的工做模式: 廣播 --> 以太網基於mac地址的廣播的方式來完成數據的傳遞 --> 只能在局域網完成 局域網才能找對對方
ARP 協議 把ip地址解析成mac地址
網絡層: IPv4 IPv6 head(IP頭 源地址+目的地址) + data iphead+data ip(哪個子網) iphead + heac(tcp/udp) + data
ip + mac 就能找到全世界中惟一的計算機 ip->找到哪個子網 mac->找到具體哪一臺機器
傳輸層 tcp + udp 格式: head(tcp/udp) + data tcp/udp 基於端口工做的 端口:0 - 65535 一個軟件一個端口 0-1024給操做系統使用的
ip+端口 就能找到全世界範圍內的惟一一個軟件 head(tcp) + head(應用頭) + data
服務端最好一直對外提供 服務端的端口和ip要捆綁固定 不能隨便變 客戶端的端口可隨便變
應用層 暴風 qq ... 軟件 格式: head(應用頭)+data 應用協議:http/ftp..
五層串起來:--->: 應用層產生數據head(固定長度)+data -> 傳輸層 -> 網絡層 - > 數據鏈路層 -> 物理層
總結:用快遞來講明這個列子 一個產品就是物理層, 快遞單就是圓通仍是中通,也就是tcp和udp協議 發快遞必須有快遞單 ip頭,本身地址和對方地址就是data數據 tcp
地區分爲上海。。。那就是以太網報頭 規定是18個字節,包裹數據就是data數據,物理層就是快遞設備spa
二 傳輸層詳解:操作系統
tcp:流式協議: 像流水同樣 發數據 管道數據 雙向管道 c ----> s c <----- s 沒有數據前 ,先創建管道code
挖管道:server
1. client 發個請求數據包 建立一條管道數據 # tcp = 1blog
2.server 迴應了,也要建立一條數據管道 確認+請求ip
3.client 迴應了,能夠 # c ----- s s ------- c 三次握手utf-8
tcp: 是可靠傳輸 s 獲得包以後迴應收到 c 確認沒有收到 就在傳一遍 因此叫可靠傳輸
upd: client 一直髮數據,不須要對方迴應,無論出現什麼狀況,都一直髮,因此不可靠
總結: tpc 效率低,可是可靠
upd 效率高,可是不可靠 不須要管道, 不須要等待對方迴應 64k
三 什麼是socket
socket 是什麼?
socket 理解就是ip+端口
套接字2種:
1. 基於文件套接字 AF_UNIX
2. 基於網絡套接字 AF_INET
套接字流程:
四 基於socket實現簡單套接字通訊
1.服務端.py
1 import socket 2 3 # 1.買手機 4 # socket.AF_INET 基於網絡通訊 socket.SOCK_STREAM 基於tcp協議 5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 # print(phone) 7 # 2.綁定手機卡 8 phone.bind(("127.0.0.1", 8081)) # 0-1024給系統使用的 9 10 # 3.開機 11 phone.listen(5) # 監聽系統最大連接數爲5 12 13 # 4.等電話連接 14 # res = phone.accept() 15 conn, clinet_addr = phone.accept() 16 17 # 5.收發消息 18 data = conn.recv(1024) # bytes 2.1024表明最大接受1024個bytes 19 print("客戶端的數據", data) 20 21 conn.send(data.upper()) 22 23 # 6.掛電話 24 conn.close()
2.客戶端.py
import socket # 1.買手機 # socket.AF_INET 基於網絡通訊 socket.SOCK_STREAM 基於tcp協議 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # print(phone) # 2.撥號 phone.connect(("127.0.0.1", 8081)) # 發,收消息 phone.send("hello".encode("utf-8")) data = phone.recv(1024) print("客戶端收到服務端的數據:", data) # 關閉 phone.close()
5.在簡單的套接字基礎上加上通訊循環
客戶端:
# 發,收消息 while True: msg = input(">>:").strip() phone.send(msg.encode("utf-8")) data = phone.recv(1024) print("客戶端收到服務端的數據:", data)
服務端:
# 5.收發消息 while True: data = conn.recv(1024) # bytes 2.1024表明最大接受1024個bytes print("客戶端的數據", data) conn.send(data.upper())