1. 程式人生 > >TCP/IP 運輸層 和Http協議

TCP/IP 運輸層 和Http協議

運輸層

   運輸層的任務主要是負責主機中兩個程序之間的通訊。

    運輸層的功能主要有:

(1)複用與分用

(2)差錯控制(完整性控制)

(3)可靠傳輸(按序交付,無丟失,不重複)

  (4)擁塞控制(收發雙方的協調一致)

流量控制(全域性上的通訊流量調節)

網路層與運輸層的區別:

(1)運輸層為應用程序之間提供端到端的邏輯通訊。

(2)網路層為主機之間提供端到端的物理通訊

(3)運輸層對收到的報文進行差錯檢測,包括首部和資料部分。

(4)網路層IP資料報首部中的檢驗和欄位,只檢驗首部是否出現差錯而不檢驗資料部分。

(5)運輸層有兩種不同的運輸協議,即面向連結的TCP(傳輸控制協議)和無連線的UDP(使用者資料報協議)。

(6) 網路層無法同時實現這兩種協議。

分用(Demultiplexing):即將運輸層的報文段中的資料交付到正確的套接字的工作。

複用(Multiplexing):是在源主機的不同套接字中收集資料塊,併為每個資料塊封裝上首部資訊(將在分用的時候使用),從而生成報文段/資料報,然後將報文段/資料報傳遞到網路層工作。

埠:為了進行分用和複用,需要給應用層的每個程序賦予一個非常明確的標誌,在協議層就採用了協議埠號,簡稱埠。

UDP和TCP都使用了與應用層介面處的埠與上層的應用程序進行通訊。埠也就是運輸層的服務訪問點(TSAP),其作用就是讓應用層的各種應用程序都能將其資料通過埠交付給運輸層,以及讓運輸層知道將其報文中的資料向上通過埠交付給應用層相應的程序。

UDP協議:

UDP是一種無連線的, 即傳送資料前不需要建立連線,因此減小的開銷和傳送資料的延遲。

UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連線狀態表。

UDP是面向報文的,

UDP沒有擁塞控制,因此網路出現的擁塞不會使主機的傳送率降低。

UDP支援一對一,一對多,多對一和多對多的互動通訊。

UDP首部開銷小,只有8位元組,比TCP的20個位元組的首部要短。

TCP協議:

TCP提供了一種可靠的面向連線的位元組流運輸層服務。

TCP將使用者資料打包成報文段,它傳送後啟動一個定時器,另一端收到的資料進行確認,對失序的資料重新排序,丟棄重複資料,TCP提供端到端的流量控制,並計算和驗證一個強制性的端到端的檢驗和。

許多流行的應用程式如:Telnet,Rlogin, FTP,SMTP 都使用TCP。

TCP的一些主要特點:

TCP是面向連線的運輸層協議

每一條TCP連線只能有兩個端點,每一條TCP連線只能是點對點的

TCP提供可靠交付的服務

TCP提供全雙工通訊

面向位元組流的。

面向位元組流的含義:雖然應用程式和TCP互動是一次一個資料塊,但TCP把應用程式交下來的資料僅僅是一連串的無結構的位元組流

TCP是面向連線的,無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線。在TCP/IP協議中,TCP協議提供可靠的連線服務,連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 TCP視窗大小資訊。這就是面試中經常會被問到的TCP三次握手。只是瞭解TCP三次握手的概念,對你獲得一份工作是沒有任何幫助的,你需要去了解TCP三次握手中的一些細節。

1.    第一次握手:建立連線。客戶端傳送連線請求報文段,將SYN位置為1,Sequence Number為x;然後,客戶端進入SYN_SEND狀態,等待伺服器的確認;

2.    第二次握手:伺服器收到SYN報文段。伺服器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認,設定Acknowledgment Number為x+1(Sequence Number+1);同時,自己自己還要傳送SYN請求資訊,將SYN位置為1,Sequence Number為y;伺服器端將上述所有資訊放到一個報文段(即SYN+ACK報文段)中,一併傳送給客戶端,此時伺服器進入SYN_RECV狀態;

3.    第三次握手:客戶端收到伺服器的SYN+ACK報文段。然後將Acknowledgment Number設定為y+1,向伺服器傳送ACK報文段,這個報文段傳送完畢以後,客戶端和伺服器端都進入ESTABLISHED狀態,完成TCP三次握手。

完成了三次握手,客戶端和伺服器端就可以開始傳送資料

當客戶端和伺服器通過三次握手建立了TCP連線以後,當資料傳送完畢,就要要斷開TCP連線的了。那對於TCP的斷開連線,這裡就有了神祕的“四次分手”。

1.第一次分手:主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機2傳送一個FIN報文段;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;

2.第二次分手:主機2收到了主機1傳送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我“同意”你的關閉請求;

3.第三次分手:主機2向主機1傳送FIN報文段,請求關閉連線,同時主機2進入LAST_ACK狀態;

4.第四次分手:主機1收到主機2傳送的FIN報文段,向主機2傳送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連線;此時,主機1等待2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。

至此,TCP的四次分手就這麼愉快的完成了。這就是著名的三次握手,四次分手。

那麼為什麼需要三次握手呢?

(1)為了防止已失效的連線請求報文段突然又傳送到了服務端,因而產生錯誤。

(2)“已失效的連線請求報文段”的產生在這樣一種情況下:client發出的第一個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用“三次握手”,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用“三次握手”的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。”

(3)主要的原因是:為了防止伺服器端的一直等待而浪費資源。

那麼又是為什麼要採用四次分手呢?

TCP協議是一種面向連線的、可靠的、基於位元組流的運輸層通訊協議。TCP是全雙工模式,這就意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要傳送了,主機1告訴主機2,它的資料已經全部發送完畢了;但是,這個時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文段時,表示它已經知道主機1沒有資料傳送了,但是主機2還是可以傳送資料到主機1的;當主機2也傳送了FIN報文段時,這個時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次TCP連線。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。

FIN_WAIT_1: 這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連線,向對方傳送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態。而當對方迴應ACK報文後,則進入到FIN_WAIT_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態一般是比較難見到的,而FIN_WAIT_2狀態還有時常常可以用netstat看到。(主動方)

FIN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連線,也即有一方要求close連線,但另外還告訴對方,我暫時還有點資料需要傳送給你(ACK資訊),稍後再關閉連線。(主動方)

CLOSE_WAIT:這種狀態的含義其實是表示在等待關閉。怎麼理解呢?當對方close一個SOCKET後傳送FIN報文給自己,你係統毫無疑問地會迴應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以 close這個SOCKET,傳送FIN報文給對方,也即關閉連線。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連線。(被動方)

LAST_ACK: 這個狀態還是比較容易好理解的,它是被動關閉一方在傳送FIN報文後,最後等待對方的ACK報文。當收到ACK報文後,也即可以進入到CLOSED可用狀態了。(被動方)

TIME_WAIT: 表示收到了對方的FIN報文,併發送出了ACK報文,就等2MSL後即可回到CLOSED可用狀態了。如果FINWAIT1狀態下,收到了對方同時帶FIN標誌和ACK標誌的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。(主動方)

CLOSED: 表示連線中斷。

這就是為什麼會採用四次握手啦

一.HTTP協議

HTTP:HyperText Transfer Protocal,超文字傳輸協議。它是Web的核心。  HTTP協議由兩部分程式實現:一個客戶機程式和一個伺服器程式,它們執行在不同的端系統中,通過交換HTTP報文進行會話。   

HTTP定義了這些報文的格式,以及客戶機和伺服器是如何進行報文交換的,即:Web客戶機是如何向Web伺服器請求Web頁面,以

及伺服器如何將Web頁面傳送給客戶機。 

HTTP是一個無狀態協議(stateless protocal)   

(1)伺服器向客戶機發送被請求的檔案時,並不儲存任何關於該客戶機的狀態資訊。   

(2)假如某個特定的客戶機在短短的幾秒鐘內兩次請求同一個物件,伺服器並不會因為剛剛為該使用者提供了該物件就不再做出反應,

    而是重新發送該物件,就像該伺服器已經完全忘記不久之前所做過的事一樣。 

(3)正因為一個HTTP伺服器並不儲存關於客戶機的任何資訊,所以我們說HTTP是一個無狀態協議。 

非持久連線(non-persistent connection)和持久連線(persistentconnection)  (1)在許多因特網應用中,客戶機和伺服器進行長時間的通訊,其中客戶機發出一系列請求,伺服器對每個請求進行響應。 

(2)根據不同的應用程式以及應用程式使用的方式,這一系列請求,可以週期性地一個接一個地發出,也可以間斷性地發出。 

(3)當這種客戶機/伺服器的互動運行於TCP協議之上時,應用程式的研製者需要確定每個請求/響應對,是經一個 單獨的TCP連

         接 傳送,還是所有的請求及相應的響應經 相同的TCP連線 傳送。 

(4) 如果每個請求/響應對,都是經一個 單獨的TCP連線 傳送,該應用程式被稱為 使用 非持久連線;如果所有的請求及相應的響  應都經 相同的TCP連線 傳送,則該應用程式被稱為 使用 持久連線。 (5)HTTP既可以使用非持久連線,也可以使用持久連線,預設方式下,HTTP使用持久連線。  非持久連線的缺點:          (1)非持久連線必須為每一個請求的物件建立和維護一個全新的連線。          

對於這樣的連線,在客戶機和伺服器都要分配TCP的緩衝區和變數,這給伺服器帶來了嚴重的負擔,因為一臺Web伺服器 可能同時服務於數以百計的客戶機請求。          (2)每一個物件的傳輸時延為兩個RTT(Round-TripTime,往返時間),即一個RTT用於建立TCP,另一個RTT用於請求和接  收一個物件。傳輸時延太大。          在持久連線的情況下,伺服器在傳送響應後保持該TCP連線開啟。 

  在相同的客戶機和伺服器之間的後續請求和響應報文,可通過相同的連線進行傳送。特別是一個完整的Web頁面(如基本的

HTML檔案,加上10個圖形),可以用單個持久的TCP連線進行傳送。 

        更有甚者,位於同一臺伺服器的多個Web頁面,在從該伺服器傳送給同一個客戶機時,可以在單個持久的TCP連線上進行。對

這些物件的請求可一個接一個地發出,而不必等待未決請求的回答,像流水線一樣進行。         

  一般來說,如果一個連線經過一定時間間隔(一個可配置的超時間隔)仍未被使用,HTTP伺服器就關閉該連線。          HTTP的預設模式使用了流水線方式的持久連線。          HTTP報文格式          HTTP報文有兩種:請求報文和響應報文。 

 二.FTP協議

   FTP:File Transfer Protocol,檔案傳輸協議。       在典型的FTP會話中,使用者坐在一臺主機(本地主機)前面,向一臺遠端主機上傳檔案或從遠端主機下載檔案。 使用者通過一個

FTP使用者介面與FTP互動。使用者首先提供遠端主機的主機名,使本地主機的FTP客戶機程序建立一個到遠端主機FTP伺服器程序的

TCP連線。          然後,為使使用者能訪問遠端主機的賬戶,使用者必須提供一個使用者標識和口令,作為FTP命令的一部分在該TCP連線上傳送。一

旦該伺服器向該使用者授權,使用者就能從本地檔案系統向遠端檔案系統傳送檔案,反之亦然。   

三、HTTP與FTP的異同點          1. 同:          (1)都是應用層協議;          (2)都執行在TCP上,即都使用TCP(而不是UDP)作為其支撐的運輸層協議。          2. 異:          (1)HTTP是超文字傳輸協議,是面向網頁的;FTP是檔案傳輸協議,是面向檔案的。          (1)HTTP協議預設埠:80號埠。FTP協議預設埠:21號埠。          (3)FTP的控制資訊是帶外(out-of-band)傳送的,而HTTP的控制資訊是帶內(in-band)傳送的。          FTP使用兩個並行的TCP連線來傳輸檔案,一個是控制連線(control connection),一個是 資料連線(data connection)。          控制連線用於在兩個主機之間傳輸控制資訊,如使用者標識、口令、改變遠端目錄的命令以及“put”和“get”檔案的命令。          資料連線用於實際傳輸一個檔案。          因為FTP協議使用一個分離的控制連線,因此稱FTP的控制資訊是帶外傳送的。          

  而HTTP協議是在傳輸檔案的TCP連線中傳送請求和響應首部行的,因此其控制資訊是帶內傳送的。          (4)FTP伺服器必須在整個會話期間保留使用者的狀態(state)資訊,而HTTP是無狀態的。          FTP伺服器必須把特定的使用者賬戶與控制連線聯絡起來,隨著使用者在遠端目錄樹上移動,伺服器必須追蹤使用者在遠端目錄樹上

       的當前位置。對每個活動著的使用者會話的狀態進行追蹤,可以對FTP會話總數進行限制。          (5)FTP的控制連線是持久連線,資料連線是非持久連線;而HTTP既可以使用非持久連線,也可以使用持久連線,預設方式 下,HTTP使用持久連線。          (6)當用戶主機與遠端主機開始一個FTP會話前,FTP的客戶機(使用者)首先在21號埠上發起一個用於控制的與伺服器(遠 程主 機)的TCP連線。FTP的客戶機通過該控制連線,傳送使用者的標識和口令,也傳送改變遠端目錄的命令。          

FTP的PORT(主動式)工作方式:當需要傳送資料時,客戶端在控制連線鏈路上用PORT命令告訴伺服器:“我打開了XXXX埠,

你過來連線我”。於是伺服器從20埠向客戶端的XXXX埠傳送連線請求,建立一條資料連線鏈路來傳送資料。  FTP的PASV(被動式)工作方式:當需要傳送資料時,伺服器在控制連線鏈路上用PASV命令告訴客戶端:“我打開了XXXX埠,

你過來連線我”。於是客戶端向伺服器的XXXX埠傳送連線請求,建立一條資料連線鏈路來傳送資料。          如果在同一個會話期間,使用者還需要傳輸另一個檔案,FTP則開啟另一個數據連線。          因此,FTP的控制連線貫穿了整個使用者會話期間,但是針對會話中的每一次檔案傳輸,都需要建立一個新的資料連線。故,控

制連線是持久連線,而資料連線是非持久連線。