TCPIP三次握手與四次揮手

計算機網路體系結構

在計算機網路的基本概念中,分層次的體系結構是最基本的。計算機網路體系結構的抽象概念較多,在學習時要多思考。這些概念對後面的學習很有幫助。

網路協議是什麼?

在計算機網路要做到有條不紊地交換資料,就必須遵守一些事先約定好的規則,比如交換資料的格式、是否需要傳送一個應答資訊。這些規則被稱為網路協議。

為什麼要對網路協議分層?

簡化問題難度和複雜度。由於各層之間獨立,我們可以分割大問題為小問題。

靈活性好。當其中一層的技術變化時,只要層間介面關係保持不變,其他層不受影響。

易於實現和維護。

促進標準化工作。分開後,每層功能可以相對簡單地被描述。

網路協議分層的缺點:功能可能出現在多個層裡,產生了額外開銷。

為了使不同體系結構的計算機網路都能互聯,國際標準化組織 ISO 於1977年提出了一個試圖使各種計算機在世界範圍內互聯成網的標準框架,即著名的開放系統互聯基本參考模型 OSI/RM,簡稱為OSI。

OSI 的七層協議體系結構的概念清楚,理論也較完整,但它既複雜又不實用,TCP/IP 體系結構則不同,但它現在卻得到了非常廣泛的應用。TCP/IP 是一個四層體系結構,它包含應用層,運輸層,網際層和網路介面層(用網際層這個名字是強調這一層是為了解決不同網路的互連問題),不過從實質上講,TCP/IP 只有最上面的三層,因為最下面的網路介面層並沒有什麼具體內容,因此在學習計算機網路的原理時往往採用折中的辦法,即綜合 OSI 和 TCP/IP 的優點,採用一種只有五層協議的體系結構,這樣既簡潔又能將概念闡述清楚,有時為了方便,也可把最底下兩層稱為網路介面層。

四層協議,五層協議和七層協議的關係如下:

TCP/IP是一個四層的體系結構,主要包括:應用層、運輸層、網際層和網路介面層。

五層協議的體系結構主要包括:應用層、運輸層、網路層,資料鏈路層和物理層。

OSI七層協議模型主要包括是:應用層(Application)、表示層(Presentation)、會話層(Session)、運輸層(Transport)、網路層(Network)、資料鏈路層(Data Link)、物理層(Physical)。

TCPIP三次握手與四次揮手

注:五層協議的體系結構只是為了介紹網路原理而設計的,實際應用還是 TCP/IP 四層體系結構。

TCP/IP 協議族

應用層

應用層( application-layer )的任務是透過應用程序間的互動來完成特定網路應用。應用層協議定義的是應用程序(程序:主機中正在執行的程式)間的通訊和互動的規則。

對於不同的網路應用需要不同的應用層協議。在網際網路中應用層協議很多,如域名系統 DNS,支援全球資訊網應用的 HTTP 協議,支援電子郵件的 SMTP 協議等等。

運輸層

運輸層(transport layer)的主要任務就是負責向兩臺主機程序之間的通訊提供通用的資料傳輸服務。應用程序利用該服務傳送應用層報文。

運輸層主要使用一下兩種協議

傳輸控制協議-TCP:提供面向連線的,可靠的資料傳輸服務。

使用者資料協議-UDP:提供無連線的,盡最大努力的資料傳輸服務(不保證資料傳輸的可靠性)。

TCPIP三次握手與四次揮手

每一個應用層(TCP/IP參考模型的最高層)協議一般都會使用到兩個傳輸層協議之一:

執行在TCP協議上的協議:

HTTP

(Hypertext Transfer Protocol,超文字傳輸協議),主要用於普通瀏覽。

HTTPS

(HTTP over SSL,安全超文字傳輸協議),HTTP協議的安全版本。

FTP

(File Transfer Protocol,檔案傳輸協議),用於檔案傳輸。

POP3

(Post Office Protocol, version 3,郵局協議),收郵件用。

SMTP

(Simple Mail Transfer Protocol,簡單郵件傳輸協議),用來發送電子郵件。

TELNET

(Teletype over the Network,網路電傳),透過一個終端(terminal)登陸到網路。

SSH

(Secure Shell,用於替代安全性差的TELNET),用於加密安全登陸用。

執行在UDP協議上的協議:

BOOTP(Boot Protocol,啟動協議),應用於無盤裝置。

NTP(Network Time Protocol,網路時間協議),用於網路同步。

DHCP(Dynamic Host Configuration Protocol,動態主機配置協議),動態配置IP地址。

執行在TCP和UDP協議上:

DNS(Domain Name Service,域名服務),用於完成地址查詢,郵件轉發等工作。

網路層

網路層的任務就是選擇合適的網間路由和交換結點,確保計算機通訊的資料及時傳送。在傳送資料時,網路層把運輸層產生的報文段或使用者資料報封裝成分組和包進行傳送。在 TCP/IP 體系結構中,由於網路層使用 IP 協議,因此分組也叫 IP 資料報 ,簡稱資料報。

網際網路是由大量的異構(heterogeneous)網路透過路由器(router)相互連線起來的。網際網路使用的網路層協議是無連線的網際協議(Intert Prococol)和許多路由選擇協議,因此網際網路的網路層也叫做網際層或 IP 層。

資料鏈路層

資料鏈路層(data link layer)通常簡稱為鏈路層。兩臺主機之間的資料傳輸,總是在一段一段的鏈路上傳送的,這就需要使用專門的鏈路層的協議。

在兩個相鄰節點之間傳送資料時,資料鏈路層將網路層交下來的 IP 資料報組裝成幀,在兩個相鄰節點間的鏈路上傳送幀。每一幀包括資料和必要的控制資訊(如同步資訊,地址資訊,差錯控制等)。

在接收資料時,控制資訊使接收端能夠知道一個幀從哪個位元開始和到哪個位元結束。

一般的web應用的通訊傳輸流是這樣的:

TCPIP三次握手與四次揮手

傳送端在層與層之間傳輸資料時,每經過一層時會被打上一個該層所屬的首部資訊。反之,接收端在層與層之間傳輸資料時,每經過一層時會把對應的首部資訊去除。

物理層

在物理層上所傳送的資料單位是位元。物理層(physical layer)的作用是實現相鄰計算機節點之間位元流的透明傳送,儘可能遮蔽掉具體傳輸介質和物理裝置的差異。使其上面的資料鏈路層不必考慮網路的具體傳輸介質是什麼。“透明傳送位元流”表示經實際電路傳送後的位元流沒有發生變化,對傳送的位元流來說,這個電路好像是看不見的。

TCP/IP 協議族

在網際網路使用的各種協議中最重要和最著名的就是 TCP/IP 兩個協議。現在人們經常提到的 TCP/IP 並不一定是單指 TCP 和 IP 這兩個具體的協議,而往往是表示網際網路所使用的整個 TCP/IP 協議族。

TCPIP三次握手與四次揮手

網際網路協議套件(英語:Internet Protocol Suite,縮寫IPS)是一個網路通訊模型,以及一整個網路傳輸協議家族,為網際網路的基礎通訊架構。它常被通稱為TCP/IP協議族(英語:TCP/IP Protocol Suite,或TCP/IP Protocols),簡稱TCP/IP。因為該協定家族的兩個核心協定:TCP(傳輸控制協議)和IP(網際協議),為該家族中最早透過的標準。

劃重點:

TCP(傳輸控制協議)和IP(網際協議)是最先定義的兩個核心協議,所以才統稱為TCP/IP協議族

TCP的三次握手四次揮手

TCP是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,在傳送資料前,通訊雙方必須在彼此間建立一條連線。所謂的“連線”,其實是客戶端和服務端儲存的一份關於對方的資訊,如ip地址、埠號等。

TCP可以看成是一種位元組流,它會處理IP層或以下的層的丟包、重複以及錯誤問題。在連線的建立過程中,雙方需要交換一些連線的引數。這些引數可以放在TCP頭部。

一個TCP連線由一個4元組構成,分別是兩個IP地址和兩個埠號。一個TCP連線通常分為三個階段:連線、資料傳輸、退出(關閉)。透過三次握手建立一個連結,透過四次揮手來關閉一個連線。

當一個連線被建立或被終止時,交換的報文段只包含TCP頭部,而沒有資料。

TCP報文的頭部結構

在瞭解TCP連線之前先來了解一下TCP報文的頭部結構。

TCPIP三次握手與四次揮手

上圖中有幾個欄位需要重點介紹下:

(1)序號:seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

(2)確認序號:ack序號,佔32位,只有ACK標誌位為1時,確認序號欄位才有效,ack=seq+1。

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

ACK:確認序號有效。

FIN:釋放一個連線。

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

RST:重置連線。

SYN:發起一個新連線。

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

需要注意的是:

不要將確認序號ack與標誌位中的ACK搞混了。

確認方ack=發起方seq+1,兩端配對。

三次握手

三次握手的本質是確認通訊雙方收發資料的能力

首先,我讓信使運輸一份信件給對方,對方收到了,那麼他就知道了我的發件能力和他的收件能力是可以的。

於是他給我回信,我若收到了,我便知我的發件能力和他的收件能力是可以的,並且他的發件能力和我的收件能力是可以。

然而此時他還不知道他的發件能力和我的收件能力到底可不可以,於是我最後回饋一次,他若收到了,他便清楚了他的發件能力和我的收件能力是可以的。

這,就是三次握手,這樣說,你理解了嗎?

TCPIP三次握手與四次揮手

第一次握手:客戶端要向服務端發起連線請求,首先客戶端隨機生成一個起始序列號ISN(比如是100),那客戶端向服務端傳送的報文段包含SYN標誌位(也就是SYN=1),序列號seq=100。

第二次握手:服務端收到客戶端發過來的報文後,發現SYN=1,知道這是一個連線請求,於是將客戶端的起始序列號100存起來,並且隨機生成一個服務端的起始序列號(比如是300)。然後給客戶端回覆一段報文,回覆報文包含SYN和ACK標誌(也就是SYN=1,ACK=1)、序列號seq=300、確認號ack=101(客戶端發過來的序列號+1)。

第三次握手:客戶端收到服務端的回覆後發現ACK=1並且ack=101,於是知道服務端已經收到了序列號為100的那段報文;同時發現SYN=1,知道了服務端同意了這次連線,於是就將服務端的序列號300給存下來。然後客戶端再回復一段報文給服務端,報文包含ACK標誌位(ACK=1)、ack=301(服務端序列號+1)、seq=101(第一次握手時傳送報文是佔據一個序列號的,所以這次seq就從101開始,需要注意的是不攜帶資料的ACK報文是不佔據序列號的,所以後面第一次正式傳送資料時seq還是101)。當服務端收到報文後發現ACK=1並且ack=301,就知道客戶端收到序列號為300的報文了,就這樣客戶端和服務端透過TCP建立了連線。

四次揮手

四次揮手的目的是關閉一個連線

TCPIP三次握手與四次揮手

比如客戶端初始化的序列號ISA=100,服務端初始化的序列號ISA=300。TCP連線成功後客戶端總共傳送了1000個位元組的資料,服務端在客戶端發FIN報文前總共回覆了2000個位元組的資料。

第一次揮手:當客戶端的資料都傳輸完成後,客戶端向服務端發出連線釋放報文(當然資料沒發完時也可以傳送連線釋放報文並停止傳送資料),釋放連線報文包含FIN標誌位(FIN=1)、序列號seq=1101(100+1+1000,其中的1是建立連線時佔的一個序列號)。需要注意的是客戶端發出FIN報文段後只是不能發資料了,但是還可以正常收資料;另外FIN報文段即使不攜帶資料也要佔據一個序列號。

第二次揮手:服務端收到客戶端發的FIN報文後給客戶端回覆確認報文,確認報文包含ACK標誌位(ACK=1)、確認號ack=1102(客戶端FIN報文序列號1101+1)、序列號seq=2300(300+2000)。此時服務端處於關閉等待狀態,而不是立馬給客戶端發FIN報文,這個狀態還要持續一段時間,因為服務端可能還有資料沒發完。

第三次揮手:服務端將最後資料(比如50個位元組)傳送完畢後就向客戶端發出連線釋放報文,報文包含FIN和ACK標誌位(FIN=1,ACK=1)、確認號和第二次揮手一樣ack=1102、序列號seq=2350(2300+50)。

第四次揮手:客戶端收到服務端發的FIN報文後,向服務端發出確認報文,確認報文包含ACK標誌位(ACK=1)、確認號ack=2351、序列號seq=1102。注意客戶端發出確認報文後不是立馬釋放TCP連線,而是要經過2MSL(最長報文段壽命的2倍時長)後才釋放TCP連線。而服務端一旦收到客戶端發出的確認報文就會立馬釋放TCP連線,所以服務端結束TCP連線的時間要比客戶端早一些。