python基礎之socket編程

python基礎之socket編程

1、客戶端和服務器架構

c/s架構和b/s架構編程

  1. c:client(客戶端) s:server(服務器端) 好比電腦上安裝的qq,微信
  2. b:browser(瀏覽器) s:server(服務器端) 好比,京東,天貓網頁(這裏不上app)
  3. s(服務器)端:有固定的ip,穩定一直在運行,支持併發(多線程)
  4. b/s架構也是c/s架構的一種
  5. c/s架構分爲:硬件c/s架構(打印機)和軟件c/s架構

1.1 學習網絡編程的目的

學習網絡編程的目的就是爲了寫一個cs架構的軟件瀏覽器

  1. c(客戶端)----------------網絡-----------------s(服務器端)
  2. 就是完成c/s架構的開發

2、osi七層協議

  1. 網絡:網絡鏈接介質+網絡協議(osi七層)服務器

  2. 網絡協議:osi七層協議:應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層微信

  3. 五層協議:應用層,傳輸層,網絡層,數據層,物理層網絡

  4. 四層協議多線程

2.1五層協議分析

  1. 物理層:010101這種電信號架構

  2. 數據鏈路層:併發

    1. 把物理層的電信號分組,每一組叫一個數據報/數據幀。每個數據幀分紅:報頭head和數據data倆部分
      1. 每個數據報,都有報頭和數據部分。
        • 報頭:固定的18個字節 ,6個字節是發送者的地址,6個字節是接收者的地址,6個字節是數據類型
      2. mac地址:發送者、接收者的地址,就是mac地址
        • 每塊網卡都有一個惟一的mac地址,12位16進制數表示(前6位是廠商編號,後六位是流水編號)
      3. 廣播:同一個局域網裏進行通訊,容易產生廣播風暴
  3. 網絡層app

    1. ip:ipv4:32位2進製表示,點分十進制表示,從0.0.0.0到255.255.255.255,範圍是有限的,不能表示出全部的網路設備,因此出現了ipv6

    2. 子網掩碼:經過子網掩碼和ip判斷倆個ip是否處於同一個網段,經過ip地址和子網掩碼作按位與運算

      ip地址:  172.16.10.1:      10101100.00010000.00001010.000000001
      子網掩碼:255.255.255.0:     11111111.11111111.11111111.000000000
      按位與運算:172.16.10.0      10101100.00010000.00001010.000000000
      172.16.10.0/24包含了ip地址和子網掩碼
    3. ip跟mac有轉換的關係

      1. 主機176.16.10.10.10/24訪問172.16.10.11/24

      2. ARP協議:廣播的方式發售那個數據包,獲取目標主機的mac地址

      3. mac地址:查找學習mac地址和ip地址的映射表

        • 第一次接收到就會在ip/mac映射表中添加一條數據{’172.16.10.11「:ddsadfgegsdgsdg}
    4. 任何一種協議都是由頭部和內容的

  4. 傳輸層

    tcp協議:

    1. 三次握手,四次揮手(重點),鏈接如何創建,發送數據如何保證可靠,斷開如何斷開,在創建鏈接過程當中由狀態。

    2. 服務的若是看到大量的syn_rcvd狀態,請求同步收到狀態

    3. dos和ddos攻擊:拒絕服務攻擊,分佈式的拒絕服務攻擊

    4. 端口號:端口號的範圍0~65535,0-1023位系統佔用端口

    udp協議:

    1. 發送,不須要響應,因此數據不可靠(好比看視頻的 時候會花屏)
    2. 端口
      • 經過ip和子網掩碼惟一肯定一臺設備
      • 經過ip和子網掩碼維一以及端口號惟一肯定一個軟件。
  5. 應用層

3、上網流程分析

  1. 在瀏覽器輸入www.baidu.com
  2. 會取dns服務器經過域名解析成ip地址
  3. 向ip+端口號這個地址發送請求,就會訪問到百度的服務器

socket:在應用層和傳輸層之間的一個抽象層:它把TCP/TP層複雜的操做抽象爲幾個簡單的接口供應用層調用已經實進程在網絡中的通訊。

4、簡單的通訊

#服務端
#導入一個socket模塊
import socket

#想象成買手機打電話:socket.SOCK_STREAM 表示創建tcp鏈接 ,udp鏈接socket.SOCK_DGRAM
#買了個手機
soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#插電話卡:綁定ip地址  傳元組:(ip,端口號)
soc.bind(('192.168.11.146',8080))  #若是寫本機ip,局域網外部能夠訪問
# soc.bind(('127.0.0.1',8080))    #若是寫127.0.0.1,只能本身訪問

#開機,監聽,這個5 是半鏈接池的大小
soc.listen(5)
#等待別人給我打電話
print('xxxx')
conn,addr=soc.accept()
print('yyyy')
print(addr)
# conn 就是通路
#接收1024個字節
data=conn.recv(1024)
print('我收到客戶端發的',data)
#conn.send  發送數據,數據必須是bytes格式
conn.send(b'xxxxx')

#掛斷電話
conn.close()
#銷燬手機
soc.close()
#客戶端
import socket
#建立一個socket對象
soc=socket.socket()
#鏈接服務端
soc.connect(('192.168.11.146',8080))
#發送消息
soc.send(b'xxx')

data=soc.recv(1024)
print('我收到服務端回的',data)
#關閉鏈接
soc.close()
相關文章
相關標籤/搜索