1.五層協議詳解,2.傳輸層詳解,3.什麼是socket,4.基於socket實現簡單套接字通訊,5.在簡單的套接字基礎上加上通訊循環

一 五層協議詳解:網絡

          物理層 電信號: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())
相關文章
相關標籤/搜索