1.可靠、慢、全雙工通訊python
2.創建鏈接的時候 : 三次握手程序員
3.斷開鏈接的時候 : 四次揮手緩存
4.在創建起鏈接以後微信
發送的每一條信息都有回執網絡
爲了保證數據的完整性,還有重傳機制socket
5.長鏈接 :會一直佔用雙方的端口tcp
6.IO(input,output)操做,輸入和輸出是相對內存來講的code
write / send -----> 輸出 outputserver
read / recv ------> 輸入 inputip
7.可以傳遞的數據長度幾乎沒有限制
osi七層模型 | osi五層協議 | 協議 | 物理設備 | |
---|---|---|---|---|
應用層 表示層 會話層 (三層總結成一層) |
五層 | 應用層 | http / https / ftp / smtp 協議 python代碼:hello |
|
傳輸層 | 四層 | 傳輸層 | tcp協議 / udp協議 端口 | 四層路由器、四層交換機 |
網絡層 | 三層 | 網絡層 | ipv4 / ipv6 協議 | (三層)路由器、三層交換機 |
數據鏈路層 | 二層 | 數據鏈路層 | mac地址 arp協議 | 網卡、(二層)交換機 |
物理層 | 一層 | 物理層 |
socket 是一個工做在應用層和傳輸層之間的抽象層。
socket歷史:
# 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() 是創建三次握手的過程
# 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()