計(jì)算機(jī)與網(wǎng)絡(luò)設(shè)備要相互通信刁岸,雙方就必須基于相同的方法。比如她我,如何探測到通信目標(biāo)虹曙、由哪一邊先發(fā)起通信、使用哪種語言進(jìn)行通信番舆、怎樣結(jié)束通信等規(guī)則都需要事先確定酝碳。
不同的硬件、操作系統(tǒng)之間的通信恨狈,所有的這一切都需要一種規(guī)則疏哗。而我們就把這種規(guī)則稱為協(xié)議(protocol)。
協(xié)議中存在各式各樣的內(nèi)容禾怠。從電纜的規(guī)格到 IP 地址的選定方法返奉、尋找異地用戶的方法、雙方建立通信的順序吗氏,以及 Web 頁面顯示需要處理的步驟芽偏,等等。
像這樣把與互聯(lián)網(wǎng)相關(guān)聯(lián)的協(xié)議集合起來總稱為 TCP/IP弦讽。
也有說法認(rèn)為污尉,TCP/IP 是指 TCP 和 IP 這兩種協(xié)議。還有一種說法認(rèn)為,TCP/IP 是在 IP 協(xié)議的通信過程中十厢,使用到的協(xié)議族的統(tǒng)稱等太。
目錄:
o? 協(xié)議分層
o? 數(shù)據(jù)的封裝與分用
o? 端口號(hào)和DNS
o??TCP/IP 通信傳輸流
o? TCP協(xié)議
o??SYN 攻擊
o??TCP和UDP比較
o? IP協(xié)議
o? ARP協(xié)議
協(xié)議分層
ISO/OSI模型,即開放式通信系統(tǒng)互聯(lián)參考模型(Open System Interconnection Reference Model)蛮放,是國際標(biāo)準(zhǔn)化組織(ISO)提出的一個(gè)試圖使各種計(jì)算機(jī)在世界范圍內(nèi)互連為網(wǎng)絡(luò)的標(biāo)準(zhǔn)框架缩抡,簡稱OSI。
TCP/IP協(xié)議模型(Transmission Control Protocol/Internet Protocol)包颁,包含了一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)的網(wǎng)絡(luò)協(xié)議瞻想,是Internet的核心協(xié)議,通過20多年的發(fā)展已日漸成熟娩嚼,并被廣泛應(yīng)用于局域網(wǎng)和廣域網(wǎng)中蘑险,目前已成為事實(shí)上的國際標(biāo)準(zhǔn)。TCP/IP協(xié)議簇是一組不同層次上的多個(gè)協(xié)議的組合岳悟,通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng)佃迄,與OSI的七層模型相對(duì)應(yīng)。
TCP/IP協(xié)議族按照層次由上到下贵少。最上面的是應(yīng)用層呵俏,第二層則是傳輸層, 第三層是網(wǎng)絡(luò)層滔灶,IP協(xié)議就在這里普碎,它負(fù)責(zé)對(duì)數(shù)據(jù)加上IP地址和其他的數(shù)據(jù)以確定傳輸?shù)哪繕?biāo)。第四層是數(shù)據(jù)鏈路層录平,這個(gè)層次為待傳送的數(shù)據(jù)加入一個(gè)以太網(wǎng)協(xié)議頭麻车,并進(jìn)行CRC編碼,為最后的數(shù)據(jù)傳輸做準(zhǔn)備斗这。再下一層則是硬件層次了动猬,負(fù)責(zé)網(wǎng)絡(luò)的傳輸,這個(gè)層次的定義包括網(wǎng)線的制式(有些并不將其放在tcp/ip協(xié)議族中)表箭。發(fā)送協(xié)議的主機(jī)從上自下將數(shù)據(jù)按照協(xié)議封裝枣察,而接收數(shù)據(jù)的主機(jī)則按照協(xié)議從得到的數(shù)據(jù)包解開,最后拿到需要的數(shù)據(jù)燃逻。
應(yīng)用層
應(yīng)用層決定了向用戶提供應(yīng)用服務(wù)時(shí)通信的活動(dòng)序目。應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。?
TCP/IP 協(xié)議族內(nèi)預(yù)存了各類通用的應(yīng)用服務(wù)伯襟。比如猿涨,F(xiàn)TP(File Transfer Protocol,文件傳輸協(xié)議)和 DNS(Domain Name System姆怪,域 名系統(tǒng))服務(wù)就是其中兩類叛赚。 HTTP 協(xié)議也處于該層澡绩。
傳輸層
傳輸層對(duì)上層應(yīng)用層,提供處于網(wǎng)絡(luò)連接中的兩臺(tái)計(jì)算機(jī)之間的數(shù)據(jù)傳輸俺附。
在傳輸層有兩個(gè)性質(zhì)不同的協(xié)議:TCP協(xié)議和UDP協(xié)議肥卡。主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信。
TCP(Transmission Control Protocol事镣,傳輸控制協(xié)議)為兩臺(tái)主機(jī)提供高可靠性的數(shù)據(jù)通信步鉴。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組璃哟,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等氛琢。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)随闪。為了提供可靠的服務(wù)阳似,TCP采用了超時(shí)重傳、發(fā)送和接收端到端的確認(rèn)分組等機(jī)制铐伴。
UDP(User Data Protocol撮奏,用戶數(shù)據(jù)報(bào)協(xié)議)則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報(bào)的分組從一臺(tái)主機(jī)發(fā)送到另一臺(tái)主機(jī)当宴,但并不保證該數(shù)據(jù)報(bào)能到達(dá)另一端畜吊。一個(gè)數(shù)據(jù)報(bào)是指從發(fā)送方傳輸?shù)浇邮辗降囊粋€(gè)信息單元(例如,發(fā)送方指定的一定字節(jié)數(shù)的信息)即供。UDP協(xié)議任何必需的可靠性必須由應(yīng)用層來提供定拟。
網(wǎng)絡(luò)層 / 互聯(lián)網(wǎng)層 / 網(wǎng)際層(在圖中為網(wǎng)際層)
網(wǎng)絡(luò)層用來處理在網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)包于微。數(shù)據(jù)包是網(wǎng)絡(luò)傳輸?shù)淖钚?shù)據(jù)單位逗嫡。該層規(guī)定了通過怎樣的路徑(所謂的傳輸路線)到達(dá)對(duì)方計(jì)算機(jī),并把數(shù)據(jù)包傳送給對(duì)方株依。
與對(duì)方計(jì)算機(jī)之間通過多臺(tái)計(jì)算機(jī)或網(wǎng)絡(luò)設(shè)備進(jìn)行傳輸時(shí)驱证,網(wǎng)絡(luò)層所起的作用就是在眾多的選項(xiàng)內(nèi)選擇一條傳輸路線。
也稱作互聯(lián)網(wǎng)層恋腕,處理分組在網(wǎng)絡(luò)中的活動(dòng)抹锄,例如分組的選路。在TCP/IP協(xié)議族中荠藤,網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議伙单,ICMP協(xié)議,以及IGMP協(xié)議哈肖。
IP(Internet Protocol吻育,網(wǎng)際協(xié)議)是一種網(wǎng)絡(luò)層協(xié)議,提供的是一種不可靠的服務(wù)淤井,它只是盡可能快地把分組從源結(jié)點(diǎn)送到目的結(jié)點(diǎn)布疼,但是并不提供任何可靠性保證摊趾。同時(shí)被TCP和UDP使用。TCP和UDP的每組數(shù)據(jù)都通過端系統(tǒng)和每個(gè)中間路由器中的IP層在互聯(lián)網(wǎng)中進(jìn)行傳輸游两。
ICMP(Internet Control Message Protocol砾层,Internet互聯(lián)網(wǎng)控制報(bào)文協(xié)議)是IP協(xié)議的附屬協(xié)議。IP層用它來與其他主機(jī)或路由器交換錯(cuò)誤報(bào)文和其他重要信息贱案。
IGMP(Internet Group Management Protocol肛炮,Internet組管理協(xié)議)是Internet組管理協(xié)議。它用來把一個(gè)UDP數(shù)據(jù)報(bào)多播到多個(gè)主機(jī)轰坊。
鏈路層 / 數(shù)據(jù)鏈路層 / 網(wǎng)絡(luò)接口層(在圖中為網(wǎng)絡(luò)接口層和硬件層)
用來處理連接網(wǎng)絡(luò)的硬件部分铸董。包括控制操作系統(tǒng)、硬件的設(shè)備驅(qū) 動(dòng)肴沫、NIC(Network Interface Card粟害,網(wǎng)絡(luò)適配器,即網(wǎng)卡)颤芬,及光纖等 物理可見部分(還包括連接器等一切傳輸媒介)悲幅。硬件上的范疇均在鏈路層的作用范圍之內(nèi)。
也稱作數(shù)據(jù)鏈路層或網(wǎng)絡(luò)接口層站蝠,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)絡(luò)接口卡汰具。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細(xì)節(jié)。ARP(Address Resolution Protocol菱魔,地址解析協(xié)議)和RARP(Reverse Address Resolution Protocol留荔,逆地址解析協(xié)議)是某些網(wǎng)絡(luò)接口(如以太網(wǎng)和令牌環(huán)網(wǎng))使用的特殊協(xié)議,用來轉(zhuǎn)換IP層和網(wǎng)絡(luò)接口層使用的地址澜倦。
數(shù)據(jù)的封裝與分用
當(dāng)應(yīng)用程序用TCP傳送數(shù)據(jù)時(shí)聚蝶,數(shù)據(jù)被送入?yún)f(xié)議棧中,然后逐個(gè)通過每一層直到被當(dāng)作一串比特流送入網(wǎng)絡(luò)藻治。其中每一層對(duì)收到的數(shù)據(jù)都要增加一些首部信息(有時(shí)還要增加尾部信息)碘勉,該過程如下圖所示。
TCP傳給IP的數(shù)據(jù)單元稱作TCP報(bào)文段或簡稱為TCP段(TCP segment)桩卵;UDP數(shù)據(jù)與TCP數(shù)據(jù)基本一致验靡。唯一的不同是UDP傳給IP的信息單元稱作U D P數(shù)據(jù)報(bào)(UDP datagram),而且UDP的首部長為8字節(jié)雏节。IP傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元稱作IP數(shù)據(jù)報(bào)(IP datagram)胜嗓。通過以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀(Frame )。?
當(dāng)目的主機(jī)收到一個(gè)以太網(wǎng)數(shù)據(jù)幀時(shí)钩乍,數(shù)據(jù)就開始從協(xié)議棧中由底向上升辞州,同時(shí)去掉各層協(xié)議加上的報(bào)文首部。每層協(xié)議盒都要去檢查報(bào)文首部中的協(xié)議標(biāo)識(shí)件蚕,以確定接收數(shù)據(jù)的上層協(xié)議孙技。這個(gè)過程稱作分用(Demultiplexing)产禾。協(xié)議是通過目的端口號(hào)、源I P地址和源端口號(hào)進(jìn)行解包的牵啦。
端口號(hào)和DNS
端口號(hào)
服務(wù)器一般都是通過知名端口號(hào)來識(shí)別的亚情。例如,對(duì)于每個(gè)TCP/IP實(shí)現(xiàn)來說哈雏,F(xiàn)TP服務(wù)器的TCP端口號(hào)都是21楞件,每個(gè)Telnet服務(wù)器的TCP端口號(hào)都是23,每個(gè)TFTP (簡單文件傳送協(xié)議)服務(wù)器的UDP端口號(hào)都是69裳瘪。任何TCP/IP實(shí)現(xiàn)所提供的服務(wù)都用知名的1~1023之間的端口號(hào)土浸。這些知名端口號(hào)由Internet號(hào)分配機(jī)構(gòu)(Internet Assigned Numbers Authority, IANA)來管理。知名端口號(hào)介于1~255之間彭羹;256~1023之間的端口號(hào)通常都是由Unix系統(tǒng)占用黄伊,以提供一些特定的Unix服務(wù);1024~5000端口號(hào)用于客戶端分配臨時(shí)端口號(hào)派殷;大于5000的端口號(hào)是為其他服務(wù)器預(yù)留的还最。
DNS
DNS 是計(jì)算機(jī)域名系統(tǒng) (Domain Name System 或Domain Name Service) 的縮寫,它是由解析器以及域名服務(wù)器組成的毡惜。域名服務(wù)器是指保存有該網(wǎng)絡(luò)中所有主機(jī)的域名和對(duì)應(yīng)IP地址拓轻,并具有將域名轉(zhuǎn)換為IP地址功能的服務(wù)器。
TCP/IP 通信傳輸流
利用 TCP/IP 協(xié)議族進(jìn)行網(wǎng)絡(luò)通信時(shí)经伙,會(huì)通過分層順序與對(duì)方進(jìn)行通信扶叉。發(fā)送端從應(yīng)用層往下走,接收端則往應(yīng)用層往上走帕膜。
我們用 HTTP 舉例來說明枣氧,首先作為發(fā)送端的客戶端在應(yīng)用層 (HTTP 協(xié)議)發(fā)出一個(gè)想看某個(gè)Web頁面的 HTTP請(qǐng)求。
接著泳叠,為了傳輸方便作瞄,在傳輸層(TCP 協(xié)議)把從應(yīng)用層處收到的數(shù)據(jù)(HTTP 請(qǐng)求報(bào)文)進(jìn)行分割茶宵,并在各個(gè)報(bào)文上打上標(biāo)記序號(hào)及端口號(hào)后轉(zhuǎn)發(fā)給網(wǎng)絡(luò)層危纫。
在網(wǎng)絡(luò)層(IP 協(xié)議),增加作為通信目的地的 MAC 地址后轉(zhuǎn)發(fā)給鏈路層乌庶。這樣一來种蝶,發(fā)往網(wǎng)絡(luò)的通信請(qǐng)求就準(zhǔn)備齊全了。
接收端的服務(wù)器在鏈路層接收到數(shù)據(jù)瞒大,按序往上層發(fā)送螃征,一直到應(yīng)用層。當(dāng)傳輸?shù)綉?yīng)用層透敌,才能算真正接收到由客戶端發(fā)送過來的 HTTP請(qǐng)求盯滚。
發(fā)送端在層與層之間傳輸數(shù)據(jù)時(shí)踢械,每經(jīng)過一層時(shí)必定會(huì)被打上一個(gè)該層所屬的首部信息。反之魄藕,接收端在層與層傳輸數(shù)據(jù)時(shí)内列,每經(jīng)過一層時(shí)會(huì)把對(duì)應(yīng)的首部消去。
這種把數(shù)據(jù)信息包裝起來的做法稱為封裝(encapsulate)背率。
TCP協(xié)議
TCP 提供一種面向連接的话瞧、可靠的字節(jié)流服務(wù)
在一個(gè) TCP 連接中,僅有兩方進(jìn)行彼此通信寝姿。廣播和多播不能用于 TCP
TCP 使用校驗(yàn)交排,確認(rèn)和重傳機(jī)制來保證可靠傳輸
TCP 給數(shù)據(jù)分節(jié)進(jìn)行排序,并使用累積確認(rèn)保證數(shù)據(jù)的順序不變和非重復(fù)
TCP 使用滑動(dòng)窗口機(jī)制來實(shí)現(xiàn)流量控制饵筑,通過動(dòng)態(tài)改變窗口的大小進(jìn)行擁塞控制
注意:TCP 并不能保證數(shù)據(jù)一定會(huì)被對(duì)方接收到埃篓,因?yàn)檫@是不可能的。TCP 能夠做到的是根资,如果有可能都许,就把數(shù)據(jù)遞送到接收方,否則就(通過放棄重傳并且中斷連接這一手段)通知用戶嫂冻。因此準(zhǔn)確說 TCP 也不是 100% 可靠的協(xié)議胶征,它所能提供的是數(shù)據(jù)的可靠遞送或故障的可靠通知。
【TCP KeepAlive】
TCP 的連接桨仿,實(shí)際上是一種純軟件層面的概念睛低,在物理層面并沒有“連接”這種概念。TCP 通信雙方建立交互的連接服傍,但是并不是一直存在數(shù)據(jù)交互钱雷,有些連接會(huì)在數(shù)據(jù)交互完畢后,主動(dòng)釋放連接吹零,而有些不會(huì)罩抗。在長時(shí)間無數(shù)據(jù)交互的時(shí)間段內(nèi),交互雙方都有可能出現(xiàn)掉電灿椅、死機(jī)套蒂、異常重啟等各種意外,當(dāng)這些意外發(fā)生之后茫蛹,這些 TCP 連接并未來得及正常釋放操刀,在軟件層面上,連接的另一方并不知道對(duì)端的情況婴洼,它會(huì)一直維護(hù)這個(gè)連接骨坑,長時(shí)間的積累會(huì)導(dǎo)致非常多的半打開連接,造成端系統(tǒng)資源的消耗和浪費(fèi)柬采,為了解決這個(gè)問題欢唾,在傳輸層可以利用 TCP 的 KeepAlive 機(jī)制實(shí)現(xiàn)來實(shí)現(xiàn)且警。主流的操作系統(tǒng)基本都在內(nèi)核里支持了這個(gè)特性。
TCP KeepAlive 的基本原理是礁遣,隔一段時(shí)間給連接對(duì)端發(fā)送一個(gè)探測包振湾,如果收到對(duì)方回應(yīng)的 ACK,則認(rèn)為連接還是存活的亡脸,在超過一定重試次數(shù)之后還是沒有收到對(duì)方的回應(yīng)押搪,則丟棄該 TCP 連接。
TCP-Keepalive-HOWTO 有對(duì) TCP KeepAlive 特性的詳細(xì)介紹,有興趣的同學(xué)可以參考。這里主要說一下错邦,TCP KeepAlive 的局限。首先 TCP KeepAlive 監(jiān)測的方式是發(fā)送一個(gè) probe 包厦画,會(huì)給網(wǎng)絡(luò)帶來額外的流量,另外 TCP KeepAlive 只能在內(nèi)核層級(jí)監(jiān)測連接的存活與否滥朱,而連接的存活不一定代表服務(wù)的可用根暑。例如當(dāng)一個(gè)服務(wù)器 CPU 進(jìn)程服務(wù)器占用達(dá)到 100%,已經(jīng)卡死不能響應(yīng)請(qǐng)求了徙邻,此時(shí) TCP KeepAlive 依然會(huì)認(rèn)為連接是存活的排嫌。因此 TCP KeepAlive 對(duì)于應(yīng)用層程序的價(jià)值是相對(duì)較小的。需要做連接辩掷纾活的應(yīng)用層程序淳地,例如 QQ,往往會(huì)在應(yīng)用層實(shí)現(xiàn)自己的心跳功能帅容。
【TCP三次握手】(Three-way Handshake)
所謂三次握手颇象,是指建立一個(gè) TCP 連接時(shí),需要客戶端和服務(wù)器總共發(fā)送3個(gè)包并徘。
三次握手的目的是連接服務(wù)器指定端口遣钳,建立 TCP 連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào)麦乞,交換 TCP 窗口大小信息蕴茴。在 socket 編程中,客戶端執(zhí)行 connect() 時(shí)路幸。將觸發(fā)三次握手荐开。
第一次握手(SYN=1, seq=x):
客戶端發(fā)送一個(gè) TCP 的 SYN 標(biāo)志位置1的包付翁,指明客戶端打算連接的服務(wù)器的端口简肴,以及初始序號(hào) X,保存在包頭的序列號(hào)(Sequence Number)字段里。
發(fā)送完畢后百侧,客戶端進(jìn)入 SYN_SEND 狀態(tài)砰识。
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答能扒。即 SYN 標(biāo)志位和 ACK 標(biāo)志位均為1。服務(wù)器端選擇自己 ISN 序列號(hào)辫狼,放到 Seq 域里初斑,同時(shí)將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶的 ISN 加1,即X+1膨处。 發(fā)送完畢后见秤,服務(wù)器端進(jìn)入 SYN_RCVD 狀態(tài)。
第三次握手(ACK=1真椿,ACKnum=y+1):
客戶端再次發(fā)送確認(rèn)包(ACK)鹃答,SYN 標(biāo)志位為0,ACK 標(biāo)志位為1突硝,并且把服務(wù)器發(fā)來 ACK 的序號(hào)字段+1测摔,放在確定字段中發(fā)送給對(duì)方,并且在數(shù)據(jù)段放寫ISN的+1
發(fā)送完畢后解恰,客戶端進(jìn)入 ESTABLISHED 狀態(tài)锋八,當(dāng)服務(wù)器端接收到這個(gè)包時(shí),也進(jìn)入 ESTABLISHED 狀態(tài)护盈,TCP 握手結(jié)束挟纱。
【TCP四次揮手】(Four-way Handshake)
TCP 的連接的拆除需要發(fā)送四個(gè)包,因此稱為四次揮腐宋,也叫做改進(jìn)的三次握手樊销。客戶端或服務(wù)器均可主動(dòng)發(fā)起揮手動(dòng)作脏款,在 socket 編程中围苫,任何一方執(zhí)行 close() 操作即可產(chǎn)生揮手操作。
第一次揮手(FIN=1撤师,seq=x):
假設(shè)客戶端想要關(guān)閉連接剂府,客戶端發(fā)送一個(gè) FIN 標(biāo)志位置為1的包,表示自己已經(jīng)沒有數(shù)據(jù)可以發(fā)送了剃盾,但是仍然可以接受數(shù)據(jù)腺占。
發(fā)送完畢后,客戶端進(jìn)入 FIN_WAIT_1 狀態(tài)痒谴。
第二次揮手(ACK=1衰伯,ACKnum=x+1):
服務(wù)器端確認(rèn)客戶端的 FIN 包,發(fā)送一個(gè)確認(rèn)包积蔚,表明自己接受到了客戶端關(guān)閉連接的請(qǐng)求意鲸,但還沒有準(zhǔn)備好關(guān)閉連接。
發(fā)送完畢后,服務(wù)器端進(jìn)入 CLOSE_WAIT 狀態(tài)怎顾,客戶端接收到這個(gè)確認(rèn)包之后读慎,進(jìn)入 FIN_WAIT_2 狀態(tài),等待服務(wù)器端關(guān)閉連接槐雾。
第三次揮手(FIN=1夭委,seq=y):
服務(wù)器端準(zhǔn)備好關(guān)閉連接時(shí),向客戶端發(fā)送結(jié)束連接請(qǐng)求募强,F(xiàn)IN 置為1株灸。
發(fā)送完畢后,服務(wù)器端進(jìn)入 LAST_ACK 狀態(tài)擎值,等待來自客戶端的最后一個(gè)ACK蚂且。
第四次揮手(ACK=1,ACKnum=y+1):
客戶端接收到來自服務(wù)器端的關(guān)閉請(qǐng)求幅恋,發(fā)送一個(gè)確認(rèn)包杏死,并進(jìn)入 TIME_WAIT狀態(tài),等待可能出現(xiàn)的要求重傳的 ACK 包捆交。
服務(wù)器端接收到這個(gè)確認(rèn)包之后淑翼,關(guān)閉連接,進(jìn)入 CLOSED 狀態(tài)品追。
客戶端等待了某個(gè)固定時(shí)間(兩個(gè)最大段生命周期玄括,2MSL,2 Maximum Segment Lifetime)之后肉瓦,沒有收到服務(wù)器端的 ACK 遭京,認(rèn)為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接泞莉,進(jìn)入 CLOSED 狀態(tài)哪雕。
SYN 攻擊(SYN Flood)
1. 什么是 SYN 攻擊?
SYN 攻擊是一種典型的 DoS/DDoS 攻擊鲫趁。(SYN = Synchronize Sequence Numbers斯嚎,同步序列編號(hào))
在三次握手過程中,服務(wù)器發(fā)送 SYN-ACK 之后挨厚,收到客戶端的 ACK 之前的 TCP 連接稱為半連接(half-open connect)堡僻。此時(shí)服務(wù)器處于 SYN_RCVD 狀態(tài)。當(dāng)收到 ACK 后疫剃,服務(wù)器才能轉(zhuǎn)入 ESTABLISHED 狀態(tài)钉疫。
SYN 攻擊指的是,攻擊客戶端在短時(shí)間內(nèi)偽造大量不存在的IP地址巢价,向服務(wù)器不斷地發(fā)送SYN包牲阁,服務(wù)器回復(fù)確認(rèn)包固阁,并等待客戶的確認(rèn)。由于源地址是不存在的咨油,服務(wù)器需要不斷的重發(fā)直至超時(shí)您炉,這些偽造的SYN包將長時(shí)間占用未連接隊(duì)列柒爵,正常的SYN請(qǐng)求被丟棄役电,導(dǎo)致目標(biāo)系統(tǒng)運(yùn)行緩慢,嚴(yán)重者會(huì)引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓棉胀。
2. 如何檢測 SYN 攻擊法瑟?
檢測 SYN 攻擊非常的方便,當(dāng)你在服務(wù)器上看到大量的半連接狀態(tài)時(shí)唁奢,特別是源IP地址是隨機(jī)的霎挟,基本上可以斷定這是一次SYN攻擊。在 Linux/Unix 上可以使用系統(tǒng)自帶的 netstats 命令來檢測 SYN 攻擊麻掸。
3. 如何防御 SYN 攻擊酥夭?
SYN攻擊不能完全被阻止,除非將TCP協(xié)議重新設(shè)計(jì)脊奋。我們所做的是盡可能的減輕SYN攻擊的危害熬北,常見的防御 SYN 攻擊的方法有如下幾種:
-? 縮短超時(shí)(SYN Timeout)時(shí)間
-? 增加最大半連接數(shù)
-? 過濾網(wǎng)關(guān)防護(hù)
-? SYN cookies技術(shù)
TCP和UDP比較
UDP 缺乏可靠性。UDP 本身不提供確認(rèn)诚隙,序列號(hào)讶隐,超時(shí)重傳等機(jī)制。UDP 數(shù)據(jù)報(bào)可能在網(wǎng)絡(luò)中被復(fù)制久又,被重新排序巫延。即 UDP 不保證數(shù)據(jù)報(bào)會(huì)到達(dá)其最終目的地,也不保證各個(gè)數(shù)據(jù)報(bào)的先后順序地消,也不保證每個(gè)數(shù)據(jù)報(bào)只到達(dá)一次
UDP 數(shù)據(jù)報(bào)是有長度的炉峰。每個(gè) UDP 數(shù)據(jù)報(bào)都有長度,如果一個(gè)數(shù)據(jù)報(bào)正確地到達(dá)目的地脉执,那么該數(shù)據(jù)報(bào)的長度將隨數(shù)據(jù)一起傳遞給接收方讲冠。而 TCP 是一個(gè)字節(jié)流協(xié)議,沒有任何(協(xié)議上的)記錄邊界适瓦。
UDP 是無連接的竿开。UDP 客戶和服務(wù)器之前不必存在長期的關(guān)系。UDP 發(fā)送數(shù)據(jù)報(bào)之前也不需要經(jīng)過握手創(chuàng)建連接的過程玻熙。
UDP 支持多播和廣播否彩。
UDP信息包的標(biāo)題很短,只有8個(gè)字節(jié)嗦随,相對(duì)于TCP的20個(gè)字節(jié)信息包的額外開銷很小列荔。
小結(jié)TCP與UDP的區(qū)別:
1. 基于連接與無連接敬尺;
2. 對(duì)系統(tǒng)資源的要求(TCP較多,UDP少)贴浙;
3. UDP程序結(jié)構(gòu)較簡單砂吞;
4. 流模式與數(shù)據(jù)報(bào)模式 ;
5. TCP保證數(shù)據(jù)正確性崎溃,UDP可能丟包蜻直,TCP保證數(shù)據(jù)順序,UDP不保證袁串。
IP協(xié)議
按層次分概而,IP(Internet Protocol)網(wǎng)際協(xié)議位于網(wǎng)絡(luò)層。Internet Protocol 這個(gè)名稱可能聽起來有點(diǎn)夸張囱修,但事實(shí)正是如此赎瑰,因?yàn)?b>幾乎所有使用網(wǎng)絡(luò)的系統(tǒng)都會(huì)用到 IP 協(xié)議。TCP/IP 協(xié)議族中的 IP 指的就是網(wǎng)際協(xié)議破镰,協(xié)議名稱中占據(jù)了一半位置餐曼,其重要性可見一斑。
可能有人會(huì)把“IP”和“IP 地址”搞混鲜漩,“IP”其實(shí)是一種協(xié)議的名稱源譬。
IP 協(xié)議的作用是把各種數(shù)據(jù)包傳送給對(duì)方。而要保證確實(shí)傳送到對(duì)方那里宇整,則需要滿足各類條件瓶佳。其中兩個(gè)重要的條件是 IP 地址和 MAC 地址(Media Access Control Address)。
IP 地址指明了節(jié)點(diǎn)被分配到的地址鳞青,MAC 地址是指網(wǎng)卡所屬的固定地址霸饲。IP 地址可以和 MAC 地址進(jìn)行配對(duì)。IP 地址可變換臂拓,但 MAC 地址基本上不會(huì)更改厚脉。
使用 ARP 協(xié)議憑借 MAC 地址進(jìn)行通信
IP 間的通信依賴 MAC 地址。在網(wǎng)絡(luò)上胶惰,通信的雙方在同一局域網(wǎng) (LAN)內(nèi)的情況是很少的傻工,通常是經(jīng)過多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)備中轉(zhuǎn) 才能連接到對(duì)方。而在進(jìn)行中轉(zhuǎn)時(shí)孵滞,會(huì)利用下一站中轉(zhuǎn)設(shè)備的 MAC 地址來搜索下一個(gè)中轉(zhuǎn)目標(biāo)中捆。這時(shí),會(huì)采用 ARP 協(xié)議(Address Resolution Protocol)坊饶。ARP 是一種用以解析地址的協(xié)議泄伪,根據(jù)通信方的 IP 地址就可以反查出對(duì)應(yīng)的 MAC 地址。
IP 網(wǎng)際協(xié)議IP是TCP/IP的心臟匿级,也是網(wǎng)絡(luò)層中最重要的協(xié)議蟋滴。
各種物理網(wǎng)絡(luò)在鏈路層(二層)所傳輸?shù)幕締卧獮閹∕AC幀)染厅,其幀格式隨物理網(wǎng)絡(luò)而異,各物理網(wǎng)絡(luò)的物理地址(MAC地址)也隨物理網(wǎng)絡(luò)而異津函。IP協(xié)議的作用就是向傳輸層(TCP層)提供統(tǒng)一的IP包肖粮,即將各種不同類型的MAC幀轉(zhuǎn)換為統(tǒng)一的IP包,并將MAC幀的物理地址變換為全網(wǎng)統(tǒng)一的邏輯地址(IP地址)尔苦。這樣涩馆,這些不同物理網(wǎng)絡(luò)MAC幀的差異對(duì)上層而言就不復(fù)存在了。正因?yàn)檫@一轉(zhuǎn)換蕉堰,才實(shí)現(xiàn)了不同類型物理網(wǎng)絡(luò)的互聯(lián)凌净。
IP協(xié)議面向無連接悲龟,IP網(wǎng)中的節(jié)點(diǎn)路由器根據(jù)每個(gè)IP包的包頭IP地址進(jìn)行尋址屋讶,這樣同一個(gè)主機(jī)發(fā)出的屬于同一報(bào)文的IP包可能會(huì)經(jīng)過不同的路徑到達(dá)目的主機(jī).
IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層须教;相反皿渗,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的轻腺,因?yàn)镮P并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞乐疆。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。
高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí)贬养,通常假設(shè)包中的源地址是有效的挤土。也可以這樣說,IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ)误算,這些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來的仰美。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing儿礼,可以用來指定一條源地址和目的地址之間的直接路徑咖杂。對(duì)于一些TCP和UDP的服務(wù)來說,使用了該選項(xiàng)的IP包好像是從路徑上的最后一個(gè)系統(tǒng)傳遞過來的蚊夫,而不是來自于它的真實(shí)地點(diǎn)诉字。這個(gè)選項(xiàng)是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進(jìn)行平常是被禁止的連接知纷。那么壤圃,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問題并且會(huì)被非法入侵。
ARP協(xié)議
IP 間的通信依賴 MAC 地址琅轧。在網(wǎng)絡(luò)上伍绳,通信的雙方在同一局域網(wǎng)(LAN)內(nèi)的情況是很少的,通常是經(jīng)過多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)設(shè)中轉(zhuǎn)才能連接到對(duì)方鹰晨。而在進(jìn)行中轉(zhuǎn)時(shí)墨叛,會(huì)利用下一站中轉(zhuǎn)設(shè)備的 MAC地址來搜索下一個(gè)中轉(zhuǎn)目標(biāo)止毕。這時(shí),會(huì)采用 ARP 協(xié)議(Address Resolution Protocol)漠趁。ARP 是一種用以解析地址的協(xié)議扁凛,根據(jù)通信方的 IP 地址就可以反查出對(duì)應(yīng)的 MAC 地址。