1. 程式人生 > >python————基礎網路知識

python————基礎網路知識

網路協議

客戶端/伺服器架構
在這裡插入圖片描述

瀏覽器端與伺服器端架構
在這裡插入圖片描述

網際網路協議與osi模型

網際網路協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層
在這裡插入圖片描述

每層執行常見的協議
在這裡插入圖片描述

在這裡插入圖片描述

tcp協議和udp協議

在這裡插入圖片描述


  我們知道,一臺擁有IP地址的主機可以提供許多服務,比如Web服務、FTP服務、SMTP服務等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎樣區分不同的網路服務呢?顯然不能只靠IP地址,因為IP 地址與網路服務的關係是一對多的關係。實際上是通過“IP地址+埠號”來區分不同的服務的。

TCP協議

當應用程式希望通過 TCP 與另一個應用程式通訊時,它會發送一個通訊請求。這個請求必須被送到一個確切的地址。在雙方“握手”之後,TCP 將在兩個應用程式之間建立一個全雙工 (full-duplex) 的通訊。

這個全雙工的通訊將佔用兩個計算機之間的通訊線路,直到它被一方或雙方關閉為止。
  在這裡插入圖片描述
  TCP的三次握手

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]

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

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

tcp和udp的對比
TCP—傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。
UDP—使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快

現在Internet上流行的協議是TCP/IP協議,該協議中對低於1024的埠都有確切的定義,他們對應著Internet上一些常見的服務。這些常見的服務可以分為使用TCP埠(面向連線)和使用UDP埠(面向無連線)兩種。
說到TCP和UDP,首先要明白“連線”和“無連線”的含義,他們的關係可以用一個形象地比喻來說明,就是打電話和寫信。兩個人如果要通話,首先要建立連線——即打電話時的撥號,等待響應後——即接聽電話後,才能相互傳遞資訊,最後還要斷開連線——即掛電話。寫信就比較簡單了,填寫好收信人的地址後將信投入郵筒,收信人就可以收到了。從這個分析可以看出,建立連線可以在需要痛心地雙方建立一個傳遞資訊的通道,在傳送方傳送請求連線資訊接收方響應後,由於是在接受方響應後才開始傳遞資訊,而且是在一個通道中傳送,因此接受方能比較完整地收到傳送方發出的資訊,即資訊傳遞的可靠性比較高。但也正因為需要建立連線,使資源開銷加大(在建立連線前必須等待接受方響應,傳輸資訊過程中必須確認資訊是否傳到及斷開連線時發出相應的訊號等),獨佔一個通道,在斷開連線錢不能建立另一個連線,即兩人在通話過程中第三方不能打入電話。而無連線是一開始就傳送資訊(嚴格說來,這是沒有開始、結束的),只是一次性的傳遞,是先不需要接受方的響應,因而在一定程度上也無法保證資訊傳遞的可靠性了,就像寫信一樣,我們只是將信寄出去,卻不能保證收信人一定可以收到。
TCP是面向連線的,有比較高的可靠性, 一些要求比較高的服務一般使用這個協議,如FTP、Telnet、SMTP、HTTP、POP3等。
而UDP是面向無連線的,使用這個協議的常見服務有DNS、SNMP、QQ等。對於QQ必須另外說明一下,QQ2003以前是隻使用UDP協議的,其伺服器使用8000埠,偵聽是否有資訊傳來,客戶端使用4000埠,向外傳送資訊(這也就不難理解在一般的顯IP的QQ版本中顯示好友的IP地址資訊中埠常為4000或其後續埠的原因了),即QQ程式既接受服務又提供服務,在以後的QQ版本中也支援使用TCP協議了。

socket層
Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
在這裡插入圖片描述