標籤:cti 三層交換器 三層交換 不同 檔案傳輸 物理地址 物理 127.0.0.1 tcp/ip協議
一、軟體開發的架構
1: C/S架構
Client與Server 用戶端與伺服器端,這裡的用戶端一般泛指用戶端應用EXE,程式需要先安裝後,才能運行在使用者的電腦上,對使用者的電腦作業系統環境依賴較大。
2: B/S架構
Browser與Server 瀏覽器端與伺服器端。
Browser瀏覽器,其實也是一種Client用戶端,只是這個用戶端不需要去安裝什麼應用程式,只需在瀏覽器上通過HTTP請求伺服器端相關的資源。
二、網路基礎
IP地址:指互連網協議地址。
IP地址是IP協會提供的一種統一的地址格式,它為互連網上的每一個網路和每一台主機分配一個邏輯地址,以此來屏蔽物理地址的差異。
IP地址是一個32位的位元,通常被分割為4個‘8位位元’。
IP地址通常用“點分十進位”表示(a,b,c,d)的形式,其中,a,b,c,d都是0~255之間的十進位整數。
連接埠可以認為是裝置與外界通訊交流的出口。
因此IP地址可以精確到具體的一台電腦,而連接埠精確到具體的程式。
通過子網路遮罩,我們就能判斷,任意兩個IP地址是否處在同一個子網路。方法是將兩個IP地址與子網路遮罩分別進行AND運算(兩個位元都是1,則結果1,反之0),然後比較結果是否相同,如果是的話,就表示它們在同一個子網路中,否則就不是。
總結一下,IP協議的作用主要有兩個:一個是為每一台電腦分配IP地址,另一個是確定哪些地址在同一個子網路。
TCP協議
TCP---傳輸控制通訊協定,提供的是連線導向、可靠的位元組流服務。當客戶與伺服器彼此交換資料前,必須先在雙方之間建立一個TCP串連,之後才能傳輸資料。TCP提供逾時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳輸到另一端。
可靠的、連線導向的協議(eg:打電話)、傳輸效率低全雙工系統通訊(發送緩衝&接收緩衝)、面向位元組流。使用TCP的應用:Web瀏覽器;電子郵件、檔案傳輸程式。
TCP是網際網路中的傳輸層協議,使用三向交握協議建立串連。當主動方發出SYN串連請求後,等待對方回答SYN+ACK[1],並最終對對方的 SYN 執行 ACK 確認。這種建立串連的方法可以防止產生錯誤的串連。[1] TCP三向交握的過程如下:用戶端發送SYN(SEQ=x)報文給伺服器端,進入SYN_SEND狀態。伺服器端收到SYN報文,回應一個SYN (SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀態。用戶端收到伺服器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀態。三向交握完成,TCP用戶端和伺服器端成功地建立串連,可以開始傳輸資料了。
tcp的三向交握
建立一個串連需要三向交握,而終止一個串連要經過四次握手,這是由TCP的半關閉(half-close)造成的。(1) 某個應用進程首先調用close,稱該端執行“主動關閉”(active close)。該端的TCP於是發送一個FIN分節,表示資料發送完畢。(2) 接收到這個FIN的對端執行 “被動關閉”(passive close),這個FIN由TCP確認。注意:FIN的接收也作為一個檔案結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他資料之後,因為,FIN的接收意味著接收端應用進程在相應串連上再無額外資料可接收。(3) 一段時間後,接收到這個檔案結束符的應用進程將調用close關閉它的通訊端。這導致它的TCP也發送一個FIN。(4) 接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)確認這個FIN。[1] 既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。注意:(1) “通常”是指,某些情況下,步驟1的FIN隨資料一起發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合并成一個分節。[2] (2) 在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動資料是可能的,這稱為“半關閉”(half-close)。(3) 當一個Unix進程無論自願地(調用exit或從main函數返回)還是非自願地(收到一個終止本進程的訊號)終止時,所有開啟的描述符都被關閉,這也導致仍然開啟的任何TCP串連上也發出一個FIN。無論是客戶還是伺服器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由伺服器執行主動關閉。[2]
tcp的四次揮手
UDP協議
UDP---使用者資料包通訊協定,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個串連,且沒有逾時重發等機制,故而傳輸速度很快。
不可靠的、不需連線的服務,傳輸效率高(發送前時延小),一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。使用UDP的應用:網域名稱系統 (DNS);視頻流;IP語音(VoIP)。
互連網協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層
每層運行常見的物理裝置
傳輸層——> 四層交換器、四層的路由器
網路層——>路由器、三層交換器
資料連結層——>橋接器、乙太網路交換器、網卡
物理層——>中繼器、集線器、雙絞線
每層運行常見的協議
應用程式層——>。。。
傳輸層——>TCP與UDP協議
網路層——>ip協議
資料連結層——>arp協議
物理層——>。。。
三、socket
Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
基於檔案類型的通訊端家族
通訊端家族的名字:AF_UNIX
unix一切皆檔案,基於檔案的通訊端調用的就是底層的檔案系統來取資料,兩個通訊端進程運行在同一機器,可以通過訪問同一個檔案系統間接完成通訊
基於網路類型的通訊端家族
通訊端家族的名字:AF_INET
(還有AF_INET6被用於ipv6,還有一些其他的地址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有地址家族中,AF_INET是使用最廣泛的一個,python支援很多種地址家族,但是由於我們只關心網路編程,所以大部分時候我麼只使用AF_INET)
基於TCP協議的socket
tcp是基於連結的,必須先啟動服務端,然後再啟動用戶端去連結服務端
import socketsk = socket.socket()sk.bind((‘127.0.0.1‘,8898)) #把地址綁定到通訊端sk.listen() #監聽連結conn,addr = sk.accept() #接受用戶端連結ret = conn.recv(1024) #接收用戶端資訊print(ret) #列印用戶端資訊conn.send(b‘hi‘) #向用戶端發送資訊conn.close() #關閉用戶端通訊端sk.close() #關閉伺服器通訊端(可選)
服務端
import socketsk = socket.socket() # 建立客戶通訊端sk.connect((‘127.0.0.1‘,8898)) # 嘗試串連伺服器sk.send(b‘hello!‘)ret = sk.recv(1024) # 對話(發送/接收)print(ret)sk.close() # 關閉客戶通訊端
用戶端
python---網路編程