1. 程式人生 > 其它 >網路程式設計 | tcp協議 | udp協議 | 三次握手與四次揮手

網路程式設計 | tcp協議 | udp協議 | 三次握手與四次揮手

目錄

網路程式設計

為什麼要用網路程式設計

你現在已經學會了寫python程式碼,假如你寫了兩個python檔案a.py和b.py,分別去執行,你就會發現,這兩個python的檔案分別執行的很好。但是如果這兩個程式之間想要傳遞一個數據,你要怎麼做呢?

這個問題以你現在的知識就可以解決了,我們可以建立一個檔案,把a.py想要傳遞的內容寫到檔案中,然後b.py從這個檔案中讀取內容就可以了。
但是當你的a.py 和 b.py 分別在不同電腦上的時候,你要怎麼辦呢?

類似的機制有計算機網盤,qq等等。我們可以在我們的電腦上和別人聊天,可以在自己的電腦上向網路中上傳、下載內容。這些都是兩個程式在通訊。

![GIF 2022-1-11 17-25-45](E:\gif檔案\GIF 2022-1-11 17-25-45.gif)

軟體開發的結構

我們瞭解的涉及到兩個程式之間通訊的應用大致可以分為兩種:

第一種是應用類:qq、微信、網盤、優酷這一類是屬於需要安裝的桌面應用。

第二種是web類: 比如百度,知乎,京東,部落格園,等使用瀏覽器訪問就可以直接使用的應用。

這些應用的本質其實都是兩個程式之間的通訊。而這兩個分類又對應兩個軟體開發的架構。

1、 C/S架構

C/S即:Client(客戶端)與Server(服務端) ,中文意思:客戶端與伺服器端架構。這種架構也是從使用者層面(也可以是物理層面)來劃分的。

這裡的客戶端一般泛指客戶端應用程式.exe,程式需要先安裝後,才能執行在使用者的電腦上,對使用者的電腦作業系統環境依賴較大。

2、B/S架構

B/S即 :Browser(瀏覽器)與Server(服務端),這種架構是從使用者層面來劃分的。

Browser瀏覽器,其實也是一種Client客戶端,只是這個客戶端不需要大家去安裝什麼應用程式,只需要在瀏覽器上通過HTTP請求伺服器端相關的資源,客戶端Browser瀏覽器就能進行增刪改查。

網路基礎

一個程式如何在網路上找到另一個程式?

首先,程式必須要啟動,其次,必須有這臺機器的地址,我們都知道我們人的地址大概就是國家\省\市\區\街道\樓\門牌號這樣。那麼每一臺連網的機器在網路上也有自己的地址,他的地址是怎麼表示的呢?
在網路中:ip地址精確到具體的一臺電腦,而埠精確到具體的程式。

ip地址

IP地址是指網際網路協議地址(英語:Internet Protocol Address,又譯為網際協議地址),是IP Address的縮寫。IP地址是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址,以此來遮蔽實體地址的差異。

IP地址是一個32位的二進位制數,通常被分割為4個“8位二進位制數”(也就是4個位元組)。IP地址通常用“點分十進位制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進位制整數。例:點分十進IP地址(100.4.5.6),實際上是32位二進位制數(01100100.00000100.00000101.00000110)。

什麼是埠

"埠"是英文port的意譯,可以認為是裝置與外界通訊交流的出口。

遠端資料傳輸發展史

網路程式設計其實研究的就是程式之間的資料通訊。

網路程式設計的由來: 基於遠端傳輸資料的技術最早誕生於美國軍方(前沿計數通常都是由軍事產生)

1.有線電話 :通過電話線互聯 
2.無線電話 :訊號發射器
3.打屁股電腦 :網線
4.膝上型電腦 :網絡卡
...
故: 要想實現遠端資料互動的前提是必須要有物理連線介質。
除了有物理連線介質之外還應該有一些能夠保證資料彼此無障礙互動的東西
這個就是OSI七層協議

OSI七層網路模型

前言

我們知道一個完整的計算機系統是由硬體、作業系統、應用軟體三者組成,具備了這三個條件,一臺計算機系統就可以自己運作了,自己和自己玩。(打一個單機遊戲呀。檔案之間的備份呀。)
如果你要跟別人一起玩那怎麼辦呢?相與別人傳輸資料怎麼辦呢?
這裡就要介紹幾個通訊的介質。
1、交換機:能夠使接入該機器的所有計算機之間彼此互聯
2、區域網 :由交換機組成的網路。 區域網(Local Area Network,LAN)是指在某一區域內由多臺計算機互聯成的計算機組。一般是方圓幾千米以內。區域網可以實現檔案管理、應用軟體共享、印表機共享、工作組內的日程安排、電子郵件和傳真通訊服務等功能。區域網是封閉型的,可以由辦公室內的兩臺計算機組成,也可以由一個公司內的上千臺計算機組成。

基於mac地址的資料傳輸,mac地址不能跨區域網傳輸

mac地址

head中包含的源和目標地址由來:ethernet規定接入internet的裝置都必須具備網絡卡,傳送端和接收端的地址便是指網絡卡的地址,即mac地址。

  mac地址:每塊網絡卡出廠時都被燒製上一個世界唯一的mac地址,長度為48位2進位制,通常由12位16進位制數表示(前六位是廠商編號,後六位是流水線號)

路由器

路由器:能夠連線多個區域網並實現區域網之間的資料傳輸
路由器(Router),是連線因特網中各區域網、廣域網的裝置,它會根據通道的情況自動選擇和設定路由,以最佳路徑,按前後順序傳送訊號。 路由器是網際網路絡的樞紐,"交通警察"。目前路由器已經廣泛應用於各行各業,各種不同檔次的產品已成為實現各種骨幹網內部連線、骨幹網間互聯和骨幹網與網際網路互聯互通業務的主力軍。路由和交換機之間的主要區別就是交換機發生在OSI參考模型第二層(資料鏈路層),而路由發生在第三層,即網路層。這一區別決定了路由和交換機在移動資訊的過程中需使用不同的控制資訊,所以說兩者實現各自功能的方式是不同的。
  路由器(Router)又稱閘道器裝置(Gateway)是用於連線多個邏輯上分開的網路,所謂邏輯網路是代表一個單獨的網路或者一個子網。當資料從一個子網傳輸到另一個子網時,可通過路由器的路由功能來完成。因此,路由器具有判斷網路地址和選擇IP路徑的功能,它能在多網路互聯環境中,建立靈活的連線,可用完全不同的資料分組和介質訪問方法連線各種子網,路由器只接受源站或其他路由器的資訊,屬網路層的一種互聯裝置。
3、網際網路 :可以簡單理解為是多個區域網之間彼此互聯。

osi七層網路層具體研究

#  所有計算機都必須要有這七層
應用層
表示層
會話層
傳輸層
網路層
資料鏈路層
物理連線層
# 開發層面可以歸納為五層
應用層
傳輸層
網路層
資料鏈路層
物理連線層

建議記住七層

osi七層協議具體研究

 從底層到上層進行研究

1、物理連線層

提供一個物理連線口 : 網線口 無線網絡卡等等

2、資料鏈路層

1、規定了電訊號的分組方式

2、乙太網協議
	規定了計算機必須有一塊網絡卡 並且網絡卡上面要有一個固定的一串數字
	12位 16禁止數
		前六位:產商編號
		後六位:流水線號
	上述的數字就是計算機的mac地址(類似於身份證號)

廣播

3)廣播
有了mac地址,同一網路內的兩臺主機就可以通訊了(一臺主機通過arp協議獲取另一臺主機的mac地址)
Ethernet採用最原始的方式,廣播的方式進行通訊,即計算機通訊基本靠吼。

3、網路層

網路層的由來:有了Ethernet、Mac地址、廣播的傳送方式,世界上的計算機就可以彼此通訊了,但世界範圍的網際網路是由一個個彼此隔離的小的區域網組成的,那麼如果所有的通訊都採用乙太網的廣播方式,那麼一臺機器傳送的包全世界都會收到,這不僅效率低,更是災難。

網路層功能:引入一套新的地址來區分不同的廣播域/子網,這套地址即網路地址。
Ip協議:規定了接入網際網路的計算機都必須由一個ip地址用於唯一標識。
	IPV4版本
    	最小	0.0.0.0
        最大  255.255.255.255
    IPV6版本
    	能夠表示出地球上每一粒沙子
 
ip地址:能夠唯一標識接入網際網路中的一臺獨一無二的計算機。

公網ip與私網ip
	公網ip需要花錢購買並申請  (相當於百度網頁 人人都可以訪問)
	私網ip自帶的但是無法直接基於網際網路訪問 (別人是無法直接訪問到的)

ARP協議

arp協議: 將ip地址轉換為mac地址(基於網路請求)

是根據IP地址獲取實體地址的一個TCP/IP協議。
主機發送資訊時將包含目標IP地址的ARP請求廣播到網路上的所有主機,並接收返回訊息,以此確定目標的實體地址。
A訪問B的IP地址 :B解析mac地址發回給A。

其實就是A發請求 請求B的mac地址。

傳輸層

TCP協議

可靠傳輸,tcp資料包沒有長度限制,理論上可以無限長,但是為了保證網路的效率,通過TCP資料包的長度不會超過IP資料包的長度,以確保單個TCP資料包不必再分割。
TCP協議是流式協議
當應用程式想通過TCP協議實現遠端通訊時,彼此之間必須先先建立雙向通訊通道,基於該雙向通道實現資料的遠端互動,該雙向通道直到任意一方主動斷開才會失效
重要狀態:
	listen監聽態:等待對方發請求
	syn_rcvd態 :忙於恢復確認建立請求

三次握手

建立雙向通道的過程稱之為三次握手,建立通道的發起者可以是客戶端也可以是服務端,下面我們就以客戶端先主動發起為例

客戶端會朝服務端傳送一個請求詢問服務端:"我能不能挖一條通往你家的地道"

服務端收到請求,回覆說:"好吧 你挖吧",由於TCP是雙向通道,客戶端挖向服務端的通道只能給客戶端朝服務端發訊息使用,服務端要向給客戶端發訊息是沒辦法走這一條通道的,需要自己挖一條通往客戶端的通道

所以服務端在回覆同意客戶端挖通道的同時還會問一句:"那我能不能也挖一條通往你家的通道"

客戶端收到服務端請求後客戶端到服務端的通道就挖成功了,然後也會同意服務端的請求,服務端挖向客戶端的通道也會成功

#  下圖總結三次握手。

四次揮手

建立一個連線需要三次握手,而終止一個連線要經過四次握手

1、當服務端或者客戶端不想再與對方進行通訊之後,雙方任意一方都可以主動發起斷開連結的請求,我們還是以客戶端主動發起為例

2、客戶端由於已經沒有任何需要傳送給服務端的訊息了,所以發起斷開客戶端到服務端的通道請求

3、服務端收到該請求後同意了 至此客戶端到服務端的單項通道斷開

4、服務端這個時候不會立刻朝客戶端發器請求說那我也斷開到你家的通道吧,服務端需要想想我手上還有沒有需要傳送給客戶端的訊息,如果還有的話,那我不能立馬斷開,先把資料發完才能斷

5、等服務端檢查完畢之後傳送也沒有資料要給客戶端了,這個時候就會朝客戶端發起斷開服務端到客戶端的通道請求

客戶端同意該請求,至此四次揮手完成
總結:揮手必須是四次,中間的兩次不能合併成一次,原因就在於需要檢查是否還有資料需要給對方傳送(有一個真空期)。

UDP協議

當應用程式希望通過UDP與一個應用程式通訊時,傳輸資料之前源端和終端不建立連線。

當它想傳送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。

TCP和UDP類似於

TCP:打電話(你一句我一句,你儂我儂)

UDP: 發簡訊(管你看不看,發了就不關我事了)

早期的QQ使用的就是UDP

埠協議

#  計算機在管理應用程式的時候 其實就是用埠來管理的
埠號 :能夠唯一標識一臺計算機上面正在執行的一款應用程式。

範圍 : 0 ~ 65535
特性 : 動態分配
	eg :第一次執行微信,系統隨機取一個埠號2222
		然後關閉微信重新啟動,系統隨機取一個埠號
		
埠號的基本使用:
	0 ~ 1024 系統預設需要使用的埠號。
	1024 ~ 8000 常見軟體的埠號 (酷狗的埠為5000)
	故:以後我們再開發軟體的時候最好使用8000之後的埠號。

# 埠號在同一臺計算機同一時刻不能重複。

其實我們訪問的瀏覽器就是IP+埠,只不過進行的域名解析。
	eg :202.108.22.5 也可以訪問到百度。
	埠可以不跟 :因為這個伺服器就只跑的百度一個埠。
	

比喻說明

比如你去健身房,前臺都會給你一個手牌(5),用來放衣服什麼的。
這個手牌是隨機的,你走了之後把這個手牌再給前臺。
下一個人來,前臺給的手牌也可能是其他的手牌 ,也可能是你上次使用的手牌(5)

總結

IP + port 

能夠唯一標識世界上某一臺接入網際網路的計算機上面的某一個正在執行的應用程式

應用層

都是人為自定義的協議標準 可遵循可不遵循
HTTP協議 FTP協議 ...