說下TCP/IP UDP協議 及TCP的連接與關閉

名詞定義


IP

IP層接收由更低層(網絡接口層例如以太網設備驅動程序)發來的數據包,並把該數據包發送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因爲IP並沒有做任何事情來確認數據包是否按順序發送的或者有沒有被破壞,IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。
高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機發送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對於一些TCP和UDP的服務來說,使用了該選項的IP包好像是從路徑上的最後一個系統傳遞過來的,而不是來自於它的真實地點。這個選項是爲了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連接。那麼,許多依靠IP源地址做確認的服務將產生問題並且會被非法入侵。

TCP

TCP是面向連接的通信協議,通過三次握手建立連接,通訊完成時要拆除連接,由於TCP是面向連接的所以只能用於端到端的通訊。
TCP提供的是一種可靠的數據流服務,採用“帶重傳的肯定確認”技術來實現傳輸的可靠性。TCP還採用一種稱爲“滑動窗口”的方式進行流量控制,所謂窗口實際表示接收能力,用以限制發送方的發送速度。
如果IP數據包中有已經封好的TCP數據包,那麼IP將把它們向‘上’傳送到TCP層。TCP將包排序並進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程序和物理介質,最後到接收方。
面向連接的服務(例如TelnetFTPrloginX WindowsSMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發送和接收域名數據庫),但使用UDP傳送有關單個主機的信息。

UDP

UDP是面向無連接的通訊協議,UDP數據包括目的端口號和源端口號信息,由於通訊不需要連接,所以可以實現廣播發送。
UDP通訊時不需要接收方確認,屬於不可靠的傳輸,可能會出現丟包現象,實際應用中要求程序員編程驗證。
UDPTCP位於同一層,但它不管數據包的順序、錯誤或重發。因此,UDP不被應用於那些使用虛電路的面向連接的服務,UDP主要用於那些面向查詢---應答的服務,例如NFS。相對於FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網絡時間協議)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因爲UDP沒有建立初始化連接(也可以稱爲握手)(因爲在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨着更大的危險。

TCP/IP參考模型

TCP/IP參考模型是首先由ARPANET所使用的網絡體系結構。這個體系結構在它的兩個主要協議出現以後被稱爲TCP/IP參考模型(TCP/IP Reference Model)。這一網絡協議共分爲四層:網絡訪問層、互聯網層、傳輸層和應用層,如圖2所示。
圖2 TCP/IP參考模型圖2 TCP/IP參考模型
網絡訪問層(Network Access Layer)在TCP/IP參考模型中並沒有詳細描述,只是指出主機必須使用某種協議與網絡相連。
互聯網層(Internet Layer)是整個體系結構的關鍵部分,其功能是使主機可以把分組發往任何網絡,並使分組獨立地傳向目標。這些分組可能經由不同的網絡,到達的順序和發送的順序也可能不同。高層如果需要順序收發,那麼就必須自行處理對分組的排序。互聯網層使用因特網協議(IP,Internet Protocol)。TCP/IP參考模型的互聯網層和OSI參考模型的網絡層在功能上非常相似。
傳輸層(Tramsport Layer)使源端和目的端機器上的對等實體可以進行會話。在這一層定義了兩個端到端的協議:傳輸控制協議(TCP,Transmission Control Protocol)和用戶數據報協議(UDP,User Datagram Protocol)。TCP是面向連接的協議,它提供可靠的報文傳輸和對上層應用的連接服務。爲此,除了基本的數據傳輸外,它還有可靠性保證、流量控制、多路複用、優先權和安全性控制等功能。UDP是面向無連接的不可靠傳輸的協議,主要用於不需要TCP的排序和流量控制等功能的應用程序。
應用層(Application Layer)包含所有的高層協議,包括:虛擬終端協議(TELNET,TELecommunications NETwork)、文件傳輸協議(FTP,File Transfer Protocol)、電子郵件傳輸協議(SMTP,Simple Mail Transfer Protocol)、域名服務(DNS,Domain Name Service)、網上新聞傳輸協議(NNTP,Net News Transfer Protocol)和超文本傳送協議(HTTP,HyperText Transfer Protocol)等。TELNET允許一臺機器上的用戶登錄到遠程機器上,並進行工作;FTP提供有效地將文件從一臺機器上移到另一臺機器上的方法;SMTP用於電子郵件的收發;DNS用於把主機名映射到網絡地址;NNTP用於新聞的發佈、檢索和獲取;HTTP用於在WWW上獲取主頁。


---------------------TCP的三次握手連接:

儘管TCP和UDP都使用相同的網絡層(IP),TCP卻嚮應用層提供與UDP完全不同的服務。TCP提供一種面向連接的、可靠的字節流服務。

面向連接意味着兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立一個TCP連接。這一過程與打電話很相似,先撥號振鈴,等待對方摘機說“喂”,然後才說明是誰。

先來認識TCP報文格式

下面是TCP報文格式圖:



上圖中有幾個字段需要重點介紹下:

(1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。

(2)確認序號:Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1。

(3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

(A)URG:緊急指針(urgent pointer)有效。

(B)ACK:確認序號有效。

(C)PSH:接收方應該儘快將這個報文交給應用層。

(D)RST:重置連接。

(E)SYN:發起一個新連接。

(F)FIN:釋放一個連接。

需要注意的是:

(A)不要將確認序號Ack與標誌位中的ACK搞混了。

(B)確認方Ack=發起方Req+1,兩端配對。

5、3次握手過程詳解

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示:



(1)第一次握手:

Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

(2)第二次握手:

Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

(3)第三次握手:

Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

SYN攻擊:

在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱爲半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內僞造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些僞造的SYN包將產時間佔用未連接隊列,導致正常的SYN請求因爲隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

#netstat -nap | grep SYN_RECV

6、4次揮手過程詳解

三次握手耳熟能詳,四次揮手估計就少有人知道了。所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:


由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

第一次揮手:

Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

第二次揮手:

Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

第三次揮手:

Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

第四次揮手:

Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

上面是一方主動關閉,另一方被動關閉的情況,實際中還會出現同時發起主動關閉的情況,具體流程如下圖:



流程和狀態在上圖中已經很明瞭了,在此不再贅述,可以參考前面的四次揮手解析步驟。

結語

關於三次握手與四次揮手通常都會有典型的面試題,在此提出供有需求的XDJM們參考:

(1) 三次握手是什麼或者流程?四次握手呢?答案前面分析就是。

(2) 爲什麼建立連接是三次握手,而關閉連接卻是四次揮手呢?

這是因爲服務端在LISTEN狀態下,收到建立連接請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些數據給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發送。


原文鏈接:http://www.jianshu.com/p/a1ebc61ce141

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章