1. 程式人生 > >29 網絡相關知識 socket

29 網絡相關知識 socket

mil pytho 視頻 根據 tag 多對一 https 中繼 努力

主要內容:

1 . 網絡基礎相關的知識

  a : 架構

    @C/S架構 : client 客戶端和 server服務器端

    優勢 : 能充分發揮pc機的性能

    @B/S架構 : browser瀏覽器 和server 服務器 隸屬於C/S架構

    優勢 : 統一了應用的接口

  b : 通信的知識

    @ 同一個電腦上兩個py程序通信 : 打開一個文件

    @兩個電腦的通信: 連接一個網線

    @多個電腦通信:

      例如 : 電腦一要找電腦二(過程)

      1) : 電腦首先發送一個請求幀,其中包含(我的ip地址是192.168.10.104,我的mac地址是xxxxx,我要找的ip地址為192.168.12.4),將此要求發給交換機.

      2) :交換機要廣播這條消息,給其他的電腦.

      3) :目標主機接收到交換機傳來的消息後,對比發現自己就是被找的主機, 回復給交換 機信息(我的ip地址是192.168.12.4,我的mac地址是yyyy,請回復給ip地址為192.168.10.104,mac地址為xxxx的主機)

      4) :交換機以單薄形式返給源主機.

  c : 知識點的總結

    @ mac地址 : 是一個物理地址 ,全球唯一 ,類似於身份證

    @ ip地址 : 是一個四點分十進制, 它標識了計算機在網絡中的位置, 類似於學號.

    @ 交換機的通信方式: 廣播 : 吼一嗓子 單薄 : 一對一 組播 : 一對多

    @ arp協議 : 通過目標ip地址獲取目標mac地址的一個協議

    @ 端口 : 操作系統為本機上每一個運行的程序都隨機分配一個端口,其他電腦上的程序可以通過端口獲取到

到這個程序. (ip地址 + 端口 能唯一找到某臺電腦上的某一個服務程序)

    @ 路由器 : 連接不同網段 , 路由

    @ 網關 : 類似於一個局域網的出口和入口

    @ 網段 : 一個局域網內的ip地址範圍

    @ 子網掩碼 : 子網掩碼 & ip地址 可以得到網段

    @ osi 五層模型 :

      應用層 : http / https / ftp

      傳輸層 : tcp / udp 四層交換機 / 四層路由器

      網絡層 : ip協議 路由器 / 三層交換機

      數據鏈路層 : 傳輸電信號 集線器 / 網線 / 光纖

2 . socket 模塊 : 同一臺主機上多個應用程序之間的通信,也被成為進程間通訊 (IPC).套接字包括兩種 :基於文件類型和 網絡類型的套接字

  a : socket 是一個模塊 又叫套接字.

    sk = socket . socket(family = AF_INET , type = SOCK_STREAM)

    family : 一種是:AF_UNIX基於文件類型的套接字 (早期socket 是源自於unix系統而研發的一個功能, 主要是為了同一臺電腦上,多個程序直接通信) unix系統的中心思想是 : 一切皆文件

       一種是 :AF_INET 基於網絡類型的套接字

    type : 一種是基於TCP協議 SOCK_STREAM

       一種是基於UDP協議 DGRAM

  b : TCP/ UDP協議的區別 :

    tcp 協議 : TCP(Transmission Control Protocol)可靠的、面向連接的協議(eg:打電話)、傳輸效率低全雙工通信(發送緩存&接收緩存)、面向字節流。使用TCP的應用:Web瀏覽器;電子郵件、文件傳輸       程序。UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,並盡可能快地把它扔到網絡上

    udp協議 : UDP(User Datagram Protocol)不可靠的、無連接的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。使用UDP的應用:域名 系統 (DNS);視頻流;IP語音(VoIP) udp協議在收發數據前,必須和對方建立可靠的連接。

  c : 基於tcp協議的socket : tcp是基於鏈接的,必須先啟動服務端,然後再啟動客戶端去鏈接服務端

    服務端 :

import socket
sk = socket.socket()   #<socket.socket fd=132, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
print(sk)
sk.bind((‘192.168.12.75‘, 12012))   #把地址綁定到套接字
sk.listen()                          #偵聽客戶的請求
conn, addr = sk.accept()            #接收客戶端的鏈接
ret = conn.recv(1024)               #接收客戶端的信息
print(ret)
print(‘coon:>>>‘,conn)
#<socket.socket fd=464, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=(‘192.168.12.75‘, 12012), raddr=(‘192.168.12.75‘, 13041)>
print(‘addr:>>>‘,addr)
conn.send(b‘qwertyuiop‘)          #向客戶端發送信息
#(‘192.168.12.75‘, 13041)
conn.close()       #關閉客戶端套接字
sk.close()         #關閉服務器套接字

   客戶端 :

import socket
sk = socket.socket()
print(sk)
sk.connect((‘192.168.12.75‘,12012))
sk.send(b‘send information‘)
s = sk.recv(102)
print(s)                            #接收服務器發送的信息
sk.close()

  加入一條socket配置 ,重用ip和端口

#加入一條socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind((‘192.168.12.75‘,8898))  #把地址綁定到套接字
sk.listen()          #監聽鏈接
conn,addr = sk.accept() #接受客戶端鏈接
ret = conn.recv(1024)  #接收客戶端信息
print(ret.decode(‘utf-8‘))       #打印客戶端信息
# conn.send(b‘hi‘)        #向客戶端發送信息
conn.close()       #關閉客戶端套接字
sk.close()        #關閉服務器套接字(可選)

  e : 基於dup協議的socket :udp是無鏈接的,啟動服務之後可以直接接受消息不需要提前建立鏈接

    服務器端 :

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #創建一個服務器的套接字
udp_sk.bind((‘192.168.12.75‘,9000))        #綁定服務器套接字
s = udp_sk.recvfrom(1024)
print(s)
udp_sk.close()

    客戶端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto(b‘serfdf‘,(‘192.168.12.75‘,9000))
sk.close()

3 . 交換機與路由器的區別:

  a : 交換機工作在中繼層,交換機根據MAC地址尋址。路由器工作在網絡層,根據IP地址尋址,路由器可以處理TCP/IP協議,而交換機不可以。

  b : 路由器可以給你的局域網自動分配IP,虛擬撥號,就像一個交通警察,指揮著你的電腦該往哪走,你自己不用操心那麽多了。交換機只是用來分配網絡數據的。

  c : .交換機在中繼層,交換機根據MAC地址尋址。路由器可以把一個IP分配給很多個主機使用,這些主機對外只表現出一個IP。交換機可以把很多主機連起來,這些主機對外各有各的IP。

 

29 網絡相關知識 socket