http://blog.csdn.net/galdys/article/details/6620620
TCP/IP的通訊協(xié)議 這部分簡要介紹一下TCP/IP的內(nèi)部結(jié)構(gòu),為討論與互聯(lián)網(wǎng)有關(guān)的安全問題打下基礎(chǔ)。TCP/IP協(xié)議組之所以流行,部分原因是因為它可以用在各種各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說,TCP/IP協(xié)議是一組包括TCP協(xié)議和IP協(xié)議,UDP(User Datagram Protocol)協(xié)議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議組。 TCP/IP整體構(gòu)架概述 TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應用層。而TCP/IP通訊協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。這4層分別為: 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠程訪問協(xié)議(Telnet)等。 傳輸層:在此層中,它提供了節(jié)點間的數(shù)據(jù)傳送服務,如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又?,這一層負責傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達并接收。 互連網(wǎng)絡(luò)層:負責提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達目的主機(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。 網(wǎng)絡(luò)接口層:對實際的網(wǎng)絡(luò)媒體的管理,定義如何使用實際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。 TCP/IP中的協(xié)議 以下簡單介紹TCP/IP中的協(xié)議都具備什么樣的功能,都是如何工作的: 1. IP 網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。 IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因為IP并沒有做任何事情來確認數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。 高層的TCP和UDP服務在接收數(shù)據(jù)包時,通常假設(shè)包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎(chǔ),這些服務相信數(shù)據(jù)包是從一個有效的主機發(fā)送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對于一些TCP和UDP的服務來說,使用了該選項的IP包好象是從路徑上的最后一個系統(tǒng)傳遞過來的,而不是來自于它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進行平常是被禁止的連接。那么,許多依靠IP源地址做確認的服務將產(chǎn)生問題并且會被非法入侵。 2. TCP 如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進行錯誤檢查,同時實現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動程序和物理介質(zhì),最后到接收方。 面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫),但使用UDP傳送有關(guān)單個主機的信息。 3.UDP UDP與TCP位于同一層,但對于數(shù)據(jù)包的順序錯誤或重發(fā)。因此,UDP不被應用于那些使用虛電路的面向連接的服務,UDP主要用于那些面向查詢---應答的服務,例如NFS。相對于FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網(wǎng)落時間協(xié)議)和DNS(DNS也使用TCP)。 欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統(tǒng)間沒有虛電路),也就是說,與UDP相關(guān)的服務面臨著更大的危險。 4.ICMP ICMP與IP位于同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關(guān)通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機通向其他系統(tǒng)的更準確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務。 5. TCP和UDP的端口結(jié)構(gòu) TCP和UDP服務通常有一個客戶/服務器的關(guān)系,例如,一個Telnet服務進程開始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶使用Telnet客戶程序與服務進程建立一個連接??蛻舫绦蛳蚍者M程寫入信息,服務進程讀出信息并發(fā)出響應,客戶程序讀出響應并向用戶報告。因而,這個連接是雙工的,可以用來進行讀寫。 兩個系統(tǒng)間的多重Telnet連接是如何相互確認并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個信息中的如下四項進行確認: 源IP地址 發(fā)送包的IP地址。 目的IP地址 接收包的IP地址。 源端口 源系統(tǒng)上的連接的端口。 目的端口 目的系統(tǒng)上的連接的端口。 端口是一個軟件結(jié)構(gòu),被客戶程序或服務進程用來發(fā)送和接收信息。一個端口對應一個16比特的數(shù)。服務進程通常使用一個固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號是‘廣為人知’的,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。 http://blog.sina.com.cn/s/blog_60e96a410100mz6o.html
在掌握計算機網(wǎng)絡(luò)時,學的時候應該從最底層開始結(jié)束于應用層,但等學完之后,融會貫通的時候,應該從最高層向最底層開始。
1 現(xiàn)代計算機網(wǎng)絡(luò)中,都采用存儲轉(zhuǎn)發(fā)分組交換技術(shù),分組交換又采用數(shù)據(jù)報和虛電路兩種形式,實際上數(shù)據(jù)報方式就是我們通常所說的面向無連接的,也就是UDP方式,而虛電路實際上就是我們通常所說的面向連接的,也就是TCP采用的方式。
采用存儲轉(zhuǎn)發(fā)的優(yōu)點:
- 通信子網(wǎng)中的路由器可以存儲報文,所以多個報文可以共享通信信道,線路的利用率高。
- 路由器具有路由選擇功能,可以動態(tài)選擇報文通過通信子網(wǎng)的最佳路徑。
采用分組的優(yōu)點
- 由于分組的長度比較短,在傳輸出錯時發(fā)現(xiàn)錯誤容易,并且重發(fā)需要花費的時間少,這樣就有利于提高存儲轉(zhuǎn)發(fā)節(jié)點的存儲空間利用率與傳輸效率。
- 數(shù)據(jù)報方式特點是,每個分組可能經(jīng)過的路由不一樣,而且到達目的節(jié)點的次序也不一定,而且每個 分組都必須帶有目的地址和源地址信息。
- 虛電路方式特點是,每個分組經(jīng)過相同的路由,而且不加任何目的地址和源地址的信息,到達目的節(jié)點時是有序到達。
2.無論TCP還是UDP傳遞給網(wǎng)絡(luò)層的時候都要進行分組。
3.ICMP協(xié)議時網(wǎng)絡(luò)層非常重要的一個協(xié)議。它負責網(wǎng)絡(luò)層的差錯和控制,
ICMP的差錯控制功能表現(xiàn)如下:
- 目的站不可達,當路由器不能為數(shù)據(jù)包找到路由器或者主機交付時,就丟棄該數(shù)據(jù)報,然后該路由器會向源主機發(fā)出ICMP差錯報告報文。
- 不能交付數(shù)據(jù)報,有可能是,目的主機沒有開機或者機器故障,
- 或者是目的主機號不存在,
- 還有可能是路由器找不到去往目的主機的路徑。
- 路由器知道目的網(wǎng)絡(luò)存在,但是無法到達。
- 如果找到了目的網(wǎng)絡(luò)和目的主機,但是到達目的主機后發(fā)現(xiàn)自己IP數(shù)據(jù)報攜帶的是TCP協(xié)議而對方采用的UDP協(xié)議。
- 如果目的網(wǎng)絡(luò),目的主機,協(xié)議,都相同,但是目的主機的端口號不對。
- 源站抑制,每個發(fā)送端都向路由器和目的節(jié)點發(fā)送數(shù)據(jù)分組,這樣導致路由器和目的節(jié)點緩沖區(qū)隊列溢出,或者路由器和目的節(jié)點的處理速度遠遠小于源節(jié)點的發(fā)送速度。這樣路由器和目的節(jié)點就會丟棄數(shù)據(jù)報,而且給源節(jié)點發(fā)送ICMP數(shù)據(jù)。
- 超時,路由表出現(xiàn)問題,整個網(wǎng)絡(luò)的轉(zhuǎn)發(fā)會出現(xiàn)錯誤,極端的情況是造成數(shù)據(jù)包在某些路由器之間循環(huán),使得數(shù)據(jù)包在網(wǎng)絡(luò)中無休止的傳輸。為了對付這些問題,IP協(xié)議會在數(shù)據(jù)包頭中設(shè)置生存時間(TTL),二是設(shè)置定時時間,只對這兩種情況ICMP這是了超時報文。針對第一種情況,當路由器轉(zhuǎn)發(fā)數(shù)據(jù)報時,講TTL-1后等于0時,就丟掉數(shù)據(jù)報,而且向源主機發(fā)送超時報文。第二種情況,當組成一個數(shù)據(jù)報的所有分組未能在某一限定時間內(nèi)到達目的主機,目的主機就不能將接受的分片重新組裝成數(shù)據(jù)報,而一個數(shù)據(jù)的部分分片將長期占用主機的緩沖區(qū),如果多個數(shù)據(jù)包都出現(xiàn)這種情況,就會造成目的主機既不能接受新的數(shù)據(jù)報,又已接受的數(shù)據(jù)分片不能組裝成數(shù)據(jù)報而出現(xiàn)死鎖。因此當某一個數(shù)據(jù)包的第一個數(shù)據(jù)分片到達時,目的主機就啟動計時器,當計時器時間到了,目的主機還沒有接收到一個數(shù)據(jù)包的所有分片,他會將接受的分片丟棄,并向源主機發(fā)送超時報文。
- 改變路由,發(fā)送數(shù)據(jù)包的源主機和路由器都有一張路由表。主機的路由表采用靜態(tài)的,主機通過ICMP獲得正確的路由信息(例如A向B通信,正確的是路由器2但卻發(fā)給了路由器1,路由器1知道正確的路由應當是路由器2,于是路由器1將正確的路信息),當網(wǎng)絡(luò)的拓撲結(jié)構(gòu)發(fā)生變化時,各個路由器間通過ICMP交換動態(tài)路由信息。
- 傳輸層中的兩個重要協(xié)議TCP和UDP
- QoS,服務質(zhì)量,衡量傳輸層QoS的參數(shù)有:(1)建立連接的延遲(2)建立連接失敗的概率(3)吞吐率(吞吐率是指每秒鐘傳輸?shù)挠脩魯?shù)據(jù)的字節(jié)數(shù),他是在某個時間間隔內(nèi)測量的到的數(shù)據(jù))(4)傳輸延遲(5)恢復功能
- UDP,UDP采用面向無連接的,并且只提供有限的差錯控制,因此協(xié)議簡單,在一些特定的應用中協(xié)議運行效率高。如:IP電話,視頻會議,F(xiàn)TP,DNS,SNMP,他們要求源主機以恒定的速度發(fā)送數(shù)據(jù),而且在網(wǎng)絡(luò)出現(xiàn)擁塞時,可以丟棄一些數(shù)據(jù),但是希望延遲不大。
- TCP,TCP,采用面向連接的,高可靠,全雙工(因此釋放鏈接的時候,要四次揮手),提供流量控制與擁塞控制。
- 窗口(用來實現(xiàn)流量控制),大小可變的窗口是TCP協(xié)議進行流量與擁塞控制的重要方法,當一個傳輸鏈接建立時,連接的每段都要分配一塊緩沖區(qū)來存儲接收到的數(shù)據(jù),并將緩沖區(qū)的大小發(fā)送給另外一段,窗口大小的單位是BYTE(這樣編程起來是很方便的),發(fā)送窗口在連接建立時由雙方商定,TCP報文頭部的窗口域?qū)懭氲臄?shù)值就是當前雙方設(shè)置的窗口數(shù)值,但是在通信的過程中,接受端可以根據(jù)自己的資源情況,隨時動態(tài)調(diào)整對方發(fā)送窗口的增大或減小,這種有接收端控制發(fā)送端的做法在網(wǎng)絡(luò)經(jīng)常使用,當數(shù)據(jù)到達時,接收端發(fā)送確認,其中包括自己剩余的緩沖區(qū)大小,接收端發(fā)送的每個確認都包含一個窗口通告。實現(xiàn)流量控制并非僅僅為了使接收端來的及接受,如果發(fā)送端發(fā)出的報文過多,會使網(wǎng)絡(luò)通信負荷過重,由此引起報文段的延時增大,報文延時增大,將使主機不能及時的收到確認,就會重傳更多的報文,而這又會進一步加劇網(wǎng)絡(luò)的擁塞,為了避免發(fā)生擁塞,主機應當降低發(fā)送速率。因此發(fā)送端的主機在發(fā)送數(shù)據(jù)時,既要考慮到接收端的接收能力,又要使網(wǎng)絡(luò)不要發(fā)生擁塞。通知窗口由接收端根據(jù)其接受能力確定的窗口值,是來自接收端的流量控制,擁塞窗口是發(fā)送端根據(jù)網(wǎng)絡(luò)擁塞情況確定的窗口值,它由發(fā)送端的流量控制算法決定(如果發(fā)送端在重傳計時器到期前,沒有收到對報文段的確認,就可以認為出現(xiàn)擁塞)。在沒有發(fā)生擁塞的穩(wěn)定工作狀態(tài)下,接收端的通知窗口和發(fā)送方的擁塞窗口應該保持一致。如果網(wǎng)絡(luò)中出現(xiàn)傳輸錯誤,報文丟失的可能性比傳輸過程中誤碼的可能性大(目前的通信信道質(zhì)量已經(jīng)明顯改善,由于通信線路帶來的的誤碼,而造成分組丟失的概率很低)。
- TCP差錯控制,
-
- 傳輸出錯報文段(TCP通過報頭的檢驗和來判斷是否發(fā)生傳輸錯誤,傳輸錯誤也叫受損報文段,TCP接受端采用丟棄不給予確認的機制),
- 丟失的報文段(被中間某一個節(jié)點丟失的),
- 重復報文段(TCP接收端將重復的分組丟棄一個即可),
- 確認丟失(TCP發(fā)送端發(fā)了3個報文段,TCP接受方成功接收后,發(fā)送確認,發(fā)送確認報文1,2,3,但是確認報文2沒有收到,但是確認報文段3收到了,發(fā)送發(fā)TCP就忽略沒有收到確認報文2,后面的收到了前面的你肯定也受到了)。由于TCP采用全雙工通信,也就是說發(fā)送方給接收方發(fā)送數(shù)據(jù)的同時,接收方也可能給發(fā)送方發(fā)送數(shù)據(jù),但是無論誰給誰發(fā),都要有確認信息。TCP采用捎帶技術(shù)發(fā)送確認信息,就是說,接收方成功接受數(shù)據(jù)后,這時候接收方也有數(shù)據(jù)發(fā)給發(fā)送方,那么接收方就把確認信息附加在發(fā)送給發(fā)送方的數(shù)據(jù)里面。
- TCP計時器,
-
- 重傳計時器(由于全雙工,收發(fā)雙發(fā)都有計時器),
- 堅持計時器(當接收端的處理速度小于發(fā)送端的發(fā)送速率時,接收端TCP發(fā)送一個0窗口,于是發(fā)送端TCP就停止發(fā)送,等待一個非0窗口的到來,但是接受方TCP發(fā)送一個非0窗口確認,然而這個確認丟失。接收端TCP發(fā)送完確認數(shù)據(jù)報后,就等待發(fā)送端發(fā)送數(shù)據(jù),但是他不知道確認數(shù)據(jù)報已經(jīng)丟失了。發(fā)送端TCP由于沒有收到確認,就等待接收方發(fā)送確認來通知窗口大小,這樣雙方TCP處于死鎖。為了避免出現(xiàn)死鎖,TCP為每個連接使用一個堅持計時器,當發(fā)送端收到一個窗口大小為0的確認時,就需要啟動堅持計時器。當時間到,發(fā)送端的TCP就發(fā)送一個特殊的探測報文,該報文只有1B大小,探測數(shù)據(jù)報提醒接受方的TCP:確認窗口報文已丟失,必須重傳),
- 保持計時器(如果客戶建立到服務器的連接,發(fā)送一些數(shù)據(jù),然后停止傳送,可能這個客戶端出現(xiàn)故障,這種情況下,這個連接將永遠處于打開狀態(tài)。為了避免此類事件,服務器端設(shè)置一個激活計時器。服務器已接受到客戶的信息后就將計時器復位,如果服務器超過激活計時器規(guī)定的時間還沒有收到客戶的信息,就每隔一個時間發(fā)送一個探測報文,如果發(fā)送10個探測報文后還沒有響應,就判斷客戶端出現(xiàn)故障,服務器終止連接),
- 時間等待計時器(當TCP釋放一次連接時,例如四次揮手中,第四次的報文丟失,TCP規(guī)定被動釋放鏈接的一方,在同意釋放鏈接報文發(fā)出后,啟動時間等待計時器,如果時間到達前收到了應答,則釋放鏈接,如果規(guī)定時間內(nèi)沒有收到應答,則重新傳送允許釋放鏈接的報文)
- TCP,誰發(fā)送數(shù)據(jù)在誰的一方就有個重發(fā)定時器等待確認。
posted on 2017-01-14 10:11
思月行云 閱讀(423)
評論(0) 編輯 收藏 引用 所屬分類:
C\C++