一、TCP協議
TCP的目的是提供可靠的數據傳輸,並在相互進行通信的設備或服務之間保持一個虛擬連接。TCP在數據包接收無序、丟失或在交付期間被破壞時,負責數據恢復。它通過為其發送的每個數據包提供一個序號來完成此恢復。記住,較低的網絡層會將每個數據包視為一個獨立的單元,因此,數據包可以沿完全不同的路徑發送,即使它們都是同一消息的組成部分。這種路由與網絡層處理分段和重新組裝數據包的方式非常相似,只是級別更高而已。
為確保正確地接收數據,TCP要求在目標計算機成功收到數據時發回一個確認(即 ACK)。如果在某個時限內未收到相應的 ACK,將重新傳送數據包。如果網絡擁塞,這種重新傳送將導致發送的數據包重復。但是,接收計算機可使用數據包的序號來確定它是否為重復數據包,並在必要時丟棄它。
1. TCP三次握手建議過程
- 若server端需與client端斷開連接,則在收到client發來的syn包后,即返回一個RST包,以拒絕client端發來的建議連接請求。
- 若client端發送syn包后,沒有收到server發來的回應,則client端會在一段時間后重新發送syn包。若多次重發的syn包都未收到回應,則此次建立連接過程失敗。
- 若server端在接到client端發來的syn包並返回自己的syn包給client后,server端會維護此未完成建立的SYN連接。若此時client端未及時發送ack確認server端的syn,這種情況下服務器端一般會重試(再次發送SYN+ACK給客戶端)並等待一段時間后丟棄這個未完成的連接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鍾的數量級(大約為30秒-2分鍾);一個用戶出現異常導致服務器的一個線程等待1分鍾並不是什么很大的問題,但如果有一個惡意的攻擊者大量模擬這種情況,服務器端將為了維護一個非常大的半連接列表而消耗非常多的資源----數以萬計的半連接,即使是簡單的保存並遍歷也會消耗非常多的CPU時間和內存,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。實際上如果服務器的TCP/IP棧不夠強大,最后的結果往往是堆棧溢出崩潰---即使服務器端的系統足夠強大,服務器端被惡意攻擊占用過多連接,達到其最大連接數,則會丟棄所有其他連接建立請求。此時從正常客戶的角度看來,服務器失去響應,這種情況我們稱作:服務器端受到了SYN Flood攻擊。當超過建立連接的最大時間時,server會結束此次連接過程。
2. TCP四次揮手斷開連接過程
- 當一端斷開連接后,連接呈半連接狀態。在半連接狀態下,仍可進行單向地傳輸數據。
二、UDP協議
UDP 與 TCP 的主要區別在於 UDP 不一定提供可靠的數據傳輸。事實上,該協議不能保證數據准確無誤地到達目的地。UDP 在許多方面非常有效。當某個程序的目標是盡快地傳輸盡可能多的信息時(其中任意給定數據的重要性相對較低),可使用 UDP。ICQ 短消息使用 UDP 協議發送消息。
許多程序將使用單獨的TCP連接和單獨的UDP連接。重要的狀態信息隨可靠的TCP連接發送,而主數據流通過UDP發送。
* TCP與UDP的選擇
如果比較UDP包和TCP包的結構,很明顯UDP包不具備TCP包復雜的可靠性與控制機制。與TCP協議相同,UDP的源端口數和目的端口數也都支持一台主機上的多個應用。一個16位的UDP包包含了一個字節長的頭部和數據的長度,校驗碼域使其可以進行整體校驗。(許多應用只支持UDP,如:多媒體數據流,不產生任何額外的數據,即使知道有破壞的包也不進行重發。)
很明顯,當數據傳輸的性能必須讓位於數據傳輸的完整性、可控制性和可靠性時,TCP協議是當然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以至於此前的連接過程成為整個流量主體的情況下,UDP也是一個好的選擇,如:DNS交換。把SNMP建立在UDP上的部分原因是設計者認為當發生網絡阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會導致不可預料的性能低下,但是我們相信在不遠的將來,TCP可靠的點對點連接將會用於絕大多數的網絡應用。
三、ARP協議
ARP協議是“Address Resolution Protocol”(地址解析協議)的縮寫。在局域網中,網絡中實際傳輸的是“幀”,幀里面是有目標主機的MAC地址的。在以太網中,一個主機要和另一個主機進行直接通信,必須要知道目標主機的MAC地址。但這個目標MAC地址是如何獲得的呢?它就是通過地址解析協議獲得的。所謂“地址解析”就是主機在發送幀前將目標IP地址轉換成目標MAC地址的過程。ARP協議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC地址,以保證通信的順利進行。
1. ARP協議的利用及相關原理:
1) 交換網絡的嗅探
ARP協議並不只在發送了ARP請求才接收ARP應答。當計算機接收到ARP應答數據包的時候,就會對本地的ARP緩存進行更新,將應答中的IP和MAC地址存儲在ARP緩存中。因此,在上面的假設網絡中,B向A發送一個自己偽造的ARP應答,而這個應答中的數據為發送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本來應該是CC-CC-CC-CC-CC-CC,這里被偽造了)。當A接收到B偽造的ARP應答,就會更新本地的ARP緩存,將本地的IP-MAC對應表更換為接收到的數據格式,由於這一切都是A的系統內核自動完成的,A可不知道被偽造了。
2) IP地址沖突
我們知道,如果網絡中存在相同IP地址的主機的時候,就會報告出IP地址沖突的警告。這是怎么產生的呢?
比如某主機B規定IP地址為192.168.0.1,如果它處於開機狀態,那么其他機器A更改IP地址為192.168.0.1就會造成IP地址沖突。其原理就是:主機A在連接網絡(或更改IP地址)的時候就會向網絡發送ARP包廣播自己的IP地址,也就是freearp。如果網絡中存在相同IP地址的主機B,那么B就會通過ARP來reply該地址,當A接收到這個reply后,A就會跳出IP地址沖突的警告,當然B也會有警告。
因此用ARP欺騙可以來偽造這個ARPreply,從而使目標一直遭受IP地址沖突警告的困擾。
3) 阻止目標的數據包通過網關
比如在一個局域網內通過網關上網,那么連接外部的計算機上的ARP緩存中就存在網關IP-MAC對應記錄。如果,該記錄被更改,那么該計算機向外發送的數據包總是發送到了錯誤的網關硬件地址上,這樣,該計算機就不能夠上網了。
這里也主要是通過ARP欺騙進行的。有兩種辦法達到這樣的目的。
第一種:向目標發送偽造的ARP應答數據包,其中發送方的IP地址為網關的地址,而MAC地址則為一個偽造的地址。當目標接收到該ARP包,那么就更新自身的ARP緩存。如果該欺騙一直持續下去,那么目標的網關緩存一直是一個被偽造的錯誤記錄。當然,如果有些了解的人查看ARP-a,就知道問題所在了。
第二種:這種方法非常狠,欺騙網關。向網關發送偽造的ARP應答數據包,其中發送方的IP地址為目標的IP地址,而MAC地址則為一個偽造的地址。這樣,網關上的目標ARP記錄就是一個錯誤的,網關發送給目標的數據報都是使用了錯誤的MAC地址。這種情況下,目標能夠發送數據到網關,卻不能接收到網關的任何數據。同時,目標自己查看ARP-a卻看不出任何問題來。
2. 防止ARP欺騙的手段
很多基於ARP的攻擊都是通過ARP欺騙實現的。至於ARP欺騙的防范,還是盡可能使用靜態的ARP。對於WIN,使用arp-s來進行靜態ARP的設置。當然,如果能夠完全使用靜態的IP+MAC對應,就更好了,因為靜態的ARP緩存只是相對的。當然,可以有一些方法來實現ARP欺騙的檢測。設置一個ARP的嗅探器,其中維護着一個本地網絡的IP-MAC地址的靜態對應表,查看所有經過的ARP數據,並檢查其中的IP-MAC對應關系,如果捕獲的IP-MAC對應關系和維護的靜態對應關系對應不上,那么就表明是一個欺騙的ARP數據包了。