TCP/IP 协议简单分析(建立连接握手过程)
原文:http://hi.baidu.com/wuguoyana/blog/item/38c04d3bcf047ce43a87ce55.html
首先TCP和IP是兩種不同的協議,它們來七層網絡模型中分別在不同的層次,IP協議是網絡層的協議,TCP是更高一層的傳輸層的協議,TCP是建立在IP協議之上的,所以一般把TCP和IP連在一起說TCP/IP協議。
Windows系統的TCP協議棧的數據包默認是1460字節大小,如果一次傳輸的數據大于這個長度,會把分割成幾個長度都不大于1460字節的TCP數據包,每個數據包都會被賦予一個sequnce number(相當于每個數據包的順序號,憑這個接收端可以知道數據包的前后順序)
之后TCP的數據包再被包裹上一層IP的數據的頭,形成IP數據包在網上傳輸(其實最后還要包一層以太網數據包,網絡上最終傳輸的都是以太網數據包)。
IP數據包到了目的地后,接收端首先把IP數據包的包頭去掉,取出TCP的包。接收端每收到一個TCP的數據包都需要返回給發送端一個ACK的數據包告訴發送端已接到此數據包,如果接收端在一定的時間內沒有收到某個數據包的ACK響應,會再次發送這個數據包,這樣就保證了數據都能被接收端接收到(因特網上丟數據包是很正常的事,如果沒有數據包重發機制,很難保證發送的數據都能被接收端完整的收到)。
每個TCP數據包也是由包頭和實際數據組成,包頭包含如下主要內容:
l??????? Source port(2字節)
發送端的端口號
l??????? Destination port(2字節)
接收端的端口號
TCP包頭中只包含雙方的端口號,雙方的IP地址在IP包的包頭,所以在TCP數據包的包頭中沒有IP地址。
l??????? Sequence number(4字節)
數據的順序號,表示當前數據包中的數據起始順序號,比如前一個數據包的SEQ為十六進制的:df d5 aa 3d,數據包的實際數據長度為16字節,那么下一個數據包的SEQ就要在前一個數據包的SEQ基礎上加上16,為:df d5 aa 4d
l??????? Acknowledgement number(4字節)
接收到對方的某個數據包后的回應順序號。如果接收到了對方主動發送來的某個數據包,必須要返回對方一個ACK回應數據包,數據包的頭部的Acknowledgement number部分根據對方發送數據的SEQ和實際數據長度,返回SEQ +實際數據長度,表示已經接收到這個數據包。對方收到這個回應,根據數值計算后知道這個數據包已經被對方接收。如果接收不到ACK的回應,就意味著這個數據包已經在網上被丟失,需要重新發送此數據包。
l??????? Header length(1字節)
表示TCP數據包的包頭長度,整個TCP數據包的長度減包頭長度就能得到TCP數據包的實際傳送的數據長度。
l??????? Flags(1字節)
標志字節,每一位都是一個標志,以下是幾個主要標志:
ACK–表示數據包是個ACK回應數據包,表示接收到了對方的某個數據包,具體哪個包由包頭的Acknowledgement number部分指示。
PSH–表示這是個有實際數據的包。
SYN–表示這是個建立連接的數據包,通訊雙方要通訊,總是由客戶端先發送SYN數據包到服務端以建立TCP的連接。
FIN–表示通訊結束,拆除連接的數據包。
下面描述一次TCP傳送數據的完整過程,以一個客戶端向服務端發送一些數據為例。
?
Figure 1.一次完整的TCP通訊的過程
1、建立連接
TCP是面向連接的協議,客戶端和服務端要通訊就必須先建立一個連接。首先通訊雙方都有地址,就是IP地址加端口號(IP:Port)標識通訊的每一端,客戶端的IP:Port跟服務器IP:Port之間就構成一個socket套接字。所謂建立連接就是在客戶端的IP:Port跟服務器IP:Port之間建立一個通道,初始化一些通訊的基礎設置,以便以后的數據通訊的正常進行。
1.1.?? 客戶端發送SYN
總是客戶端發起連接,首先客戶端發送SYN數據包到服務端以建立TCP連接。
SYN數據包只有TCP包頭,沒有實際數據。
Flags標志字節的SYN位置位,表示是SYN數據包。
Sequence number由客戶端隨機生成一個4字節的數據,作為本次連接通訊客戶端數據的起始順序號,以后客戶端發往服務端的數據包的Sequence number都在此基礎上加上每次傳送的實際數據長度依次相加遞增,這樣根據每個數據包的Sequence number就能判斷出數據包的前后順序,以便接收方根據數據包的順序拼接數據包。
1.2.?? 服務端回應ACK、SYN
服務端收到客戶端的SYN后,首先要發送一個ACK數據包給客戶端表示收到了這個數據包。
數據包的Flags標志字節的ACK置位,表示是ACK回應數據包。
Acknowledgement number設置為接收到的數據包的SEQ +數據包實際長度,因為接收到的SYN的實際數據長度為0,但是TCP協議認為實際長度為0的主動發送的數據長度為1,SYN是客戶端主動發送的數據包,所以服務端把Acknowledgement number設置為接收到的數據包的SEQ + 1。
TCP通訊可以是雙向的,一旦建立了連接,服務端也可以向客戶端發送數據。
所以服務端也會向客戶端發送一個SYN包,數據包的Flags標志字節的SYN置位,表示是SYN數據包,同時隨機生成一個4字節的數據,作為本次連接通訊服務端數據的起始順序號Sequence number。
實際中,服務端把這兩個數據包合并為一個數據包,SYN和ACK都是置位,Sequence number和Acknowledgement number也同時設置,作為一個數據包發送回客戶端。
1.3.?? 客戶端回應ACK
客戶端收到服務端的SYN數據包后,需要回應一個ACK數據包,表示接收到此數據包。同樣ACK數據包的Acknowledgement number設置為接收到的數據包的SEQ + 1(SYN、ACK數據包的實際數據長度也是0)。
2、相互收發數據
通訊雙方建立了連接后,就可以相互進行數據包的傳送。
發送數據的一端,把數據包的Flags標準字節的PSH置位,表示是有實際數據的數據包。
Sequence number置為前一次的數據包的Sequence number加上前一次數據包的長度。
如果數據包還兼做ACK包,則把ACK置位,同時設置好Acknowledgement number把數據包發送到對方。
接收方收到對方主動發送的數據數據包后,一定要回復ACK數據包,如果同時有數據發往對方,可以把實際數據包跟ACK數據包合在一起發送。
在拆除連接之前,通訊雙方可以一直相互發送接收數據,數據的順序都建立在各自的Sequence number基礎上。
圖1中,藍色部分的數據通訊就表示這一階段。
3、拆除連接
雙方數據交換完畢,需要拆除連接,結束通訊。
3.1.?? 客戶端發送FIN
通訊的一方向另一方發送FIN數據包表示要結束通訊,拆除連接。
客戶端把數據包的Flags標準字節的FIN置位,表示是通訊結束數據包。
3.2.?? 服務端返回ACK,FIN
服務端收到客戶端的FIN數據包后,先回應一個ACK數據包,然后也發送一個FIN數據包,還是服務端也結束通訊。
3.3.?? 客戶端回應ACK
客戶端回應ACK表示接收到服務端的FIN數據,雙方通訊結束。
----------------------------------------------------------------------------------- 以下結合實圖解釋下(個人理解,不正之處望改正): 使用Wireshark在windows下抓包,可以看到三次握手、Client發送24Byte的請求數據、Server發送240Byte的響應數據、四次揮手的過程!(在linux下用Wireshark抓包效果類似) Client IP: 192.168.100.2 Server IP: 192.168.100.55 一: 三次握手: 1.1 Client 發送一個SYN數據包給Server,這個數據包的序列號(Seq)為0,窗口大小(Win)為65535,數據長度(Len)為0,最大分段大小(MSS)為1460。后面的不知道啥意思了。 1.2 Server 收到SYN數據包后要給Client答復,發送一個SYN+ACK數據包,這個數據包的序列號(Seq)為0,確認號(ACK)為1,即ACK=收到包的Seq+1,窗口大小(Win)為8704,數據長度(Len)為0。 1.3 Client收到SYN+ACK數據包后也要給Server答復,發送一個ACK數據包,這個數據包的序列號(Seq)為1,確認號(ACK)為1,即ACK=收到包的Seq+1,窗口大小(Win)為65535,數據長度(Len)為0。 二: 發送24Byte的請求數據: 2.1 Client向Server發送一個PSH標志置位的請求數據包,這個數據包與1.3的數據包差不多,唯一不同是數據長度(Len)為24。(為什么與1.3數據包差不多呢?) 2.2 Server收到Client發送過來請求數據包后要給Client答復,發送一個ACK數據包,這個數據包的序列號(Seq)為1,確認號(ACK)為25,即ACK=收到包的Seq+24,窗口大小(Win)為8680,數據長度(Len)為0。 2.3 Server向Client發送一個PSH標志置位的響應數據包,這個數據包與2.2的數據包差不多,唯一不同的是數據長度(Len)為240.(為什么和2.2數據包差不多呢?) 三: 接收240Byte的響應數據: 2.4 Client收到Server發送過來的響應數據包后要給Server答復,發送一個ACK數據包,這個數據包的序列號(Seq)為25,確認號(ACK)為241,即ACK=收到包的Seq+240,窗口大小(win)為65295,數據長度(Len)為0. 四: 四次揮手: 3.1 Client向Server發送一個FIN數據包表示斷開連接,這個數據包與2.4的數據包差不多,唯一不同的是數據包FIN標志位置位。(為什么和2.4數據包差不多呢?) 3.2? Server收到Client的FIN數據包后要給Client答復,發送一個ACK數據包,這個數據包序列號(Seq)為241,確認號(ACK)為26,即ACK=收到包的Seq+1,窗口大小(win)為8704, 數據長度(Len)為0. 3.3? Server緊接著發送一個FIN數據包給Client,表示服務器也結束通訊。這個數據包與3.2數據包差不多,唯一不同的是數據包FIN標志位置位。(為什么和3.2數據包差不多呢?) 3.4?? Client收到Server發送過來的FIN數據包后要給Client答復,發送一個ACK數據包,這個數據包序列號(Seq)為26,確認號(ACK)為242,即ACK=收到包的Seq+1,窗口大小(Win)為8704,數據長度(Len)為0. 至此,三次握手、Client發送24Byte的請求數據、Server發送240Byte的響應數據、四次揮手的過程結束! 補充: 上述的解釋出現好幾次“為什么和**數據包差不多呢?”,比如2.1的數據包和1.3的數據包差不多呢。 其實兩個數據包可以合并為一個數包發送,我理解為重復顯示。 /*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ TCP/IP(Transmission Control Protocol/Internet Protocol)的簡寫,中文譯名為傳輸控制協議/互聯網絡協議)協議是Internet最基本的協議。TCP/IP整體構架概述
TCP/IP協議并不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通 信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網絡層、傳 輸層、會話層、表示層和應用層。而TCP/IP通訊協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的網絡來完成自己的需求。這4層分別為: 應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網絡遠程訪問協議(Telnet)等。 傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據并把它傳輸到下一層中,這一層負責傳送數據,并且確定數據已被送達并接收。 互連網絡層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。 網絡接口層:對實際的網絡媒體的管理,定義如何使用實際網絡(如Ethernet、Serial Line等)來傳送數據。TCP/IP中的協議
1. IP 網際協議IP是TCP/IP的心臟,也是網絡層中最重要的協議。 IP層接收由更低層(網絡接口層例如以太網設備驅動程序)發來的數據包,并把該數據包發送到更 高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP并沒有做任何事情來確認數 據包是按順序發送的或者沒有被破壞。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。 高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機發送來的。IP確認包含一個選項,叫作IP source? routing,可以用來指定一條源地址和目的地址之間的直接路徑。對于一些TCP和UDP的服務來說,使用了該選項的IP包好像是從路徑上的最后一個系 統傳遞過來的,而不是來自于它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連接。那么,許多依靠IP源地址 做確認的服務將產生問題并且會被非法入侵。 2. TCP 如果IP數據包中有已經封好的TCP數據包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。 TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程序和物理介質,最后到接收方。 面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發送和接收域名數據庫),但使用UDP傳送有關單個主機的信息。 3.UDP UDP與TCP位于同一層,但它不管數據包的順序、錯誤或重發。因此,UDP不被應用于那些使 用虛電路的面向連接的服務,UDP主要用于那些面向查詢---應答的服務,例如NFS。相對于FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網絡時間協議)和DNS(DNS也使用TCP)。 欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。 4.ICMP ICMP與IP位于同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關通向目的地址 的路徑信息。ICMP的‘Redirect’信息通知主機通向其他系統的更準確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路 徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務。 5. TCP和UDP的端口結構 TCP和UDP服務通常有一個客戶/服務器的關系,例如,一個Telnet服務進程開始在系統 上處于空閑狀態,等待著連接。用戶使用Telnet客戶程序與服務進程建立一個連接。客戶程序向服務進程寫入信息,服務進程讀出信息并發出響應,客戶程序 讀出響應并向用戶報告。因而,這個連接是雙工的,可以用來進行讀寫。 兩個系統間的多重Telnet連接是如何相互確認并協調一致呢?TCP或UDP連接唯一地使用每個信息中的如下四項進行確認: 源IP地址 發送包的IP地址。 目的IP地址 接收包的IP地址。 源端口 源系統上的連接的端口。 目的端口 目的系統上的連接的端口。 端口是一個軟件結構,被客戶程序或服務進程用來發送和接收信息。一個端口對應一個16比特的 數。服務進程通常使用一個固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號是‘廣為人知’的,因為在建立與特定的主機或服 務的連接時,需要這些地址和目的地址進行通訊。轉載于:https://www.cnblogs.com/jwyue0520/archive/2012/12/03/2800242.html
總結
以上是生活随笔為你收集整理的TCP/IP 协议简单分析(建立连接握手过程)的全部內容,希望文章能夠幫你解決所遇到的問題。